Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Para a utilização da propriedade ENABLEDCOPYLINE devem ser feitas as seguintes alterações no código fonte.

Habilitar para cada view que se deseja ativar a copia com uma tecla de atalho (por exemplo VK_F12) na criação da View.

Exemplo:

oView:SetViewProperty( 'VIEW_ZA5', "ENABLEDCOPYLINE",  {VK_F12} )

Segue exemplo

View file
nameCOMP023_MVC.prw
height250

Nesse caso ao pressionar a tecla F12 a linha posicionada será copiada para uma nova linha.

#INCLUDE 'PROTHEUS.CH'#INCLUDE 'FWMVCDEF.CH'
//-------------------------------------------------------------------/*/{Protheus.doc} COMP023_MVCExemplo de montagem da modelo e interface para uma estruturapai/filho/neto em MVC
@author Ernani Forastieri e Rodrigo Antonio Godinho@since 05/10/2009@version P10/*///-------------------------------------------------------------------User Function COMP023_MVC()Local oBrowse
oBrowse := FWmBrowse():New()oBrowse:SetAlias( 'ZA3' )oBrowse:SetDescription( 'Albuns' )oBrowse:Activate()
Return NIL
//-------------------------------------------------------------------Static Function MenuDef()Local aRotina := {}
ADD OPTION aRotina Title 'Visualizar' Action 'VIEWDEF.COMP023_MVC' OPERATION 2 ACCESS 0ADD OPTION aRotina Title 'Incluir'    Action 'VIEWDEF.COMP023_MVC' OPERATION 3 ACCESS 0ADD OPTION aRotina Title 'Alterar'    Action 'VIEWDEF.COMP023_MVC' OPERATION 4 ACCESS 0ADD OPTION aRotina Title 'Excluir'    Action 'VIEWDEF.COMP023_MVC' OPERATION 5 ACCESS 0ADD OPTION aRotina Title 'Imprimir'   Action 'VIEWDEF.COMP023_MVC' OPERATION 8 ACCESS 0ADD OPTION aRotina Title 'Copiar'     Action 'VIEWDEF.COMP023_MVC' OPERATION 9 ACCESS 0
Return aRotina
//-------------------------------------------------------------------Static Function ModelDef()// Cria a estrutura a ser usada no Modelo de DadosLocal oStruZA3 := FWFormStruct( 1, 'ZA3', /*bAvalCampo*/, /*lViewUsado*/ )Local oStruZA4 := FWFormStruct( 1, 'ZA4', /*bAvalCampo*/, /*lViewUsado*/ )Local oStruZA5 := FWFormStruct( 1, 'ZA5', /*bAvalCampo*/, /*lViewUsado*/ )Local oModel// Cria o objeto do Modelo de DadosoModel := MPFormModel():New( 'COMP023M', /*bPreValidacao*/, /*bPosValidacao*/, /*bCommit*/, /*bCancel*/ )
// Adiciona ao modelo uma estrutura de formulário de edição por campooModel:AddFields( 'ZA3MASTER', /*cOwner*/, oStruZA3 )
// Adiciona ao modelo uma estrutura de formulário de edição por gridoModel:AddGrid( 'ZA4DETAIL', 'ZA3MASTER', oStruZA4, /*bLinePre*/, /*bLinePost*/, /*bPreVal*/, /*bPosVal*/, /*BLoad*/ )//Exemplo de com Definicao do bloco de Carga//oModel:AddGrid( 'ZA4DETAIL', 'ZA3MASTER', oStruZA4, /*bLinePre*/, /*bLinePost*/, /*bPreVal*/, /*bPosVal*/, { |oObj, lCopia| LoadZA4( oObj, lCopia )}/*BLoad*/ )
oModel:AddGrid( 'ZA5DETAIL', 'ZA4DETAIL', oStruZA5, /*bLinePre*/, /*bLinePost*/, /*bPreVal*/, /*bPosVal*/, /*BLoad*/ )//Exemplo de com Definicao do bloco de Pre-Validacao//oModel:AddGrid( 'ZA5DETAIL', 'ZA4DETAIL', oStruZA5, { |oMdlG,nLine,cAcao,cCampo| COMP023LPRE( oMdlG, nLine, cAcao, cCampo ) }, /*bLinePost*/, /*bPreVal*/, /*bPosVal*/, /*BLoad*/ )
// Faz relaciomaneto entre os compomentes do modeloModel:SetRelation( 'ZA4DETAIL', { { 'ZA4_FILIAL', 'xFilial( "ZA4" )' }, { 'ZA4_ALBUM' , 'ZA3_ALBUM'  } } , ZA4->( IndexKey( 1 ) )  )oModel:SetRelation( 'ZA5DETAIL', { { 'ZA5_FILIAL', 'xFilial( "ZA5" )' }, { 'ZA5_ALBUM' , 'ZA3_ALBUM'  }, { 'ZA5_MUSICA', 'ZA4_MUSICA' } } , ZA5->( IndexKey( 1 ) )  )
// Liga o controle de nao repeticao de linhaoModel:GetModel( 'ZA4DETAIL' ):SetUniqueLine( { 'ZA4_MUSICA' } )oModel:GetModel( 'ZA5DETAIL' ):SetUniqueLine( { 'ZA5_INTER'  } )
// Adiciona a descricao do Modelo de DadosoModel:SetDescription( 'Modelo de Albuns' )
// Adiciona a descricao do Componente do Modelo de DadosoModel:GetModel( 'ZA3MASTER' ):SetDescription( 'Dados do Album' )oModel:GetModel( 'ZA4DETAIL' ):SetDescription( 'Dados das Musicas do Album'  )oModel:GetModel( 'ZA5DETAIL' ):SetDescription( 'Interpretes das Musicas do Album'  )
// Nao Permite Incluir, Alterar ou Excluir linhas na formgrid//oModel:GetModel( 'ZA5DETAIL' ):SetNoInsertLine()//oModel:GetModel( 'ZA5DETAIL' ):SetNoUpdateLine()//oModel:GetModel( 'ZA5DETAIL' ):SetNoDeleteLine()
// Adiciona regras de preenchimento//// Tipo 1 pre-validacao// Adiciona uma relação de dependência entre campos do formulário,// impedindo a atribuição de valor caso os campos de dependëncia// náo tenham valor atribuido.//// Tipo 2 pos-validacao// Adiciona uma relação de dependência entre a referência de origem e// destino, provocando uma reavaliação do destino em caso de atualização// da origem.//// Tipo 3 pre e pos-validacao// oModel:AddRules( 'ZA3MASTER', 'ZA3_DATA', 'ZA3MASTER', 'ZA3_DESCRI', 1 )
Return oModel
//-------------------------------------------------------------------Static Function ViewDef()// Cria a estrutura a ser usada na ViewLocal oStruZA3 := FWFormStruct( 2, 'ZA3' )Local oStruZA4 := FWFormStruct( 2, 'ZA4' )Local oStruZA5 := FWFormStruct( 2, 'ZA5' )// Cria um objeto de Modelo de Dados baseado no ModelDef do fonte informadoLocal oModel   := FWLoadModel( 'COMP023_MVC' )Local oView
// Remove campos da estruturaoStruZA4:RemoveField( 'ZA4_ALBUM' )oStruZA5:RemoveField( 'ZA5_ALBUM' )oStruZA5:RemoveField( 'ZA5_MUSICA' )
// Cria o objeto de ViewoView := FWFormView():New()
// Define qual o Modelo de dados será utilizadooView:SetModel( oModel )
//Adiciona no nosso View um controle do tipo FormFields(antiga enchoice)oView:AddField( 'VIEW_ZA3', oStruZA3, 'ZA3MASTER' )
//Adiciona no nosso View um controle do tipo FormGrid(antiga newgetdados)oView:AddGrid(  'VIEW_ZA4', oStruZA4, 'ZA4DETAIL' )oView:AddGrid(  'VIEW_ZA5', oStruZA5, 'ZA5DETAIL' )
// Criar "box" horizontal para receber algum elemento da viewoView:CreateHorizontalBox( 'EMCIMA' , 20 )oView:CreateHorizontalBox( 'MEIO'   , 40 )oView:CreateHorizontalBox( 'EMBAIXO', 40 )
// Criar "box" vertical para receber algum elemento da view//oView:CreateVerticalBox( 'EMBAIXOESQ', 80, 'EMBAIXO' )//oView:CreateVerticalBox( 'EMBAIXODIR', 20, 'EMBAIXO' )
// Relaciona o ID da View com o "box" para exibicaooView:SetOwnerView( 'VIEW_ZA3', 'EMCIMA'   )oView:SetOwnerView( 'VIEW_ZA4', 'MEIO'     )oView:SetOwnerView( 'VIEW_ZA5', 'EMBAIXO'  )oView:EnableTitleView('VIEW_ZA5' , 'INTERPRETES DAS MÚSICAS' , RGB(0,0,0 )  ) 
//oView:SetOwnerView( 'VIEW_ZA5', 'EMBAIXOESQ'  )
// Liga a identificacao do componenteoView:EnableTitleView( 'VIEW_ZA3' )oView:EnableTitleView( 'VIEW_ZA4', "MÚSICAS DO ÁLBUM", RGB( 224, 30, 43 )  )
oView:SetViewProperty( 'VIEW_ZA4', "ENABLEDCOPYLINE",  {VK_F12} ) //, { || copyline(oModel,oView) } } )oView:SetViewProperty( 'VIEW_ZA5', "ENABLEDCOPYLINE",  {VK_F12} ) //, { || copyline(oModel,oView) } } )
// Liga a Edição de Campos na FormGrid//oView:SetViewProperty( 'VIEW_ZA4', "ENABLEDGRIDDETAIL", { 60 } )//oView:SetViewProperty( 'VIEW_ZA5', "ENABLEDGRIDDETAIL", { 60 } )
// Acrescenta um objeto externo ao View do MVC// AddOtherObject(cFormModelID,bBloco)// cIDObject - Id// bBloco    - Bloco chamado evera ser usado para se criaros objetos de tela externos ao MVC.
//oView:AddOtherObject("OTHER_PANEL", {|oPanel| COMP23BUT(oPanel)})//oView:SetOwnerView("OTHER_PANEL",'EMBAIXODIR')Return oView
//-------------------------------------------------------------------Static Function COMP23BUT( oPanel )Local lOk := .F.
@ 10, 10 Button 'Estatistica'   Size 36, 13 Message 'Contagem da FormGrid' Pixel Action COMP23ACAO( 'ZA4DETAIL', 'Existem na Grid de Musicas'     ) of oPanel@ 30, 10 Button 'Autor/Inter.'  Size 36, 13 Message 'Inclui Autor/Interprete' Pixel Action FWExecView('Inclusao por FWExecView','COMP011_MVC', MODEL_OPERATION_INSERT, , { || .T. } ) of oPanelReturn NIL
//-------------------------------------------------------------------Static Function COMP23ACAO( cIdGrid, cMsg )Local oModel      := FWModelActive()Local oModelFilho := oModel:GetModel( cIdGrid )Local nI          := 0Local nCtInc      := 0Local nCtAlt      := 0Local nCtDel      := 0Local aSaveLines  := FWSaveRows()
For nI := 1 To oModelFilho:Length() oModelFilho:GoLine( nI )
 If     oModelFilho:IsDeleted() nCtDel++ ElseIf oModelFilho:IsInserted() nCtInc++ ElseIf oModelFilho:IsUpdated() nCtAlt++ EndIf
Next
Help( ,, 'HELP',, cMsg + CRLF + ;Alltrim( Str( nCtInc ) ) + ' linhas incluidas' + CRLF + ;Alltrim( Str( nCtAlt ) ) + ' linhas alteradas' + CRLF + ;Alltrim( Str( nCtDel ) ) + ' linhas deletadas' + CRLF  ;, 1, 0)
FWRestRows( aSaveLines )
Return NIL
//-------------------------------------------------------------------Static Function COMP023LPRE( oModelGrid, nLinha, cAcao, cCampo )Local lRet   := .T.Local oModel     := oModelGrid:GetModel()Local nOperation := oModel:GetOperation()
// Valida se pode ou nao deletar uma linha do GridIf cAcao == 'DELETE' .AND. nOperation == MODEL_OPERATION_UPDATE lRet := .F. Help( ,, 'Help',, 'Nao permitido apagar linhas na alteracao.' + CRLF + ; 'Voce esta na linha ' + Alltrim( Str( nLinha ) ), 1, 0 )EndIf
Return lRet
//-------------------------------------------------------------------Static Function LoadZA4( oGrid, lCopy ) Local aArea   := GetArea() Local aFields := {}Local aRet    := {} Local cFields := 'R_E_C_N_O_'Local cTmp    := ''Local cQuery  := ''
// Pega campos que fazem parte da estrutura do objeto, para otimizar retorno da queryaFields := oGrid:GetStruct():GetFields()aEval( aFields, { |aX| IIf( !aX[MODEL_FIELD_VIRTUAL], cFields += ',' + aX[MODEL_FIELD_IDFIELD],) } )
cTmp   := GetNextAlias() cQuery := ""cQuery += "SELECT " + cFields + " FROM " + RetSqlName( 'ZA4' ) + " ZA4"cQuery += " WHERE ZA4_FILIAL='" + xFilial( 'ZA4' ) + "'"cQuery += " AND ZA4_ALBUM='" + oGrid:GetModel():GetModel( 'ZA3MASTER' ):GetValue( 'ZA3_ALBUM' ) + "'"cQuery += " AND ZA4.D_E_L_E_T_=' '"
dbUseArea( .T., "TOPCONN", TcGenQry( ,, cQuery ) , cTmp, .F., .T. ) 
aRet := FWLoadByAlias( oGrid, cTmp ) 
(cTmp)->( dbCloseArea() ) 
RestArea( aArea ) 
Return aRet