A classe FWLayer, é uma maneira de facilitar a organização e a divisão das informações na tela por meio de janelas dividas em linhas e colunas.

A classe FWLayer, possui diversos métodos que você poderá conferir neste link https://tdn.totvs.com/display/public/PROT/FWLayer

Mas irei demonstrar de uma forma bem clara o seu uso.

Neste primeiro exemplo, irei mostrar os objetos dentro da classe usando apenas uma função, pois é possível incorporar os objetos em funções separada da principal.

Irei montar uma tela com 2 linhas e 1 coluna

#include "Protheus.ch"
User Function ExemploFWLayer()
  Local oLayer
  Local oMatr,oNome,oAdmis,oGetDados
  Local cMat := cNome := ""
  Local dAdmis := CTOD("//")
  Local aHeader:= {}
  Local aCols  := {}
  Static oDlg
    
  DEFINE MSDIALOG oDlg TITLE "Exemplo FWLayer" FROM 0,0 TO 500,600 COLORS 0, 16777215 PIXEL
  oLayer := FWLayer():New()
  
  //Através do método INIT você define a inicialização do objeto como quem será o objeto pai. Exemplo: Dialog, Window, Panel e etc.
  oLayer:Init( oDlg, .F. )
  
  //ADDLINE é o método responsável por adicionar linhas.
  oLayer:AddLine( "LINE01", 25 )
  oLayer:AddLine( "LINE02", 72 )
  
  //ADDCOLLUMN é o método responsável por adicionar a quantidade colunas desejada.
  oLayer:AddCollumn( "BOX01", 100,, "LINE01" )
  oLayer:AddCollumn( "BOX02", 100,, "LINE02" )
  
  //ADDWINDOW é o método responsável por criar janelas nas colunas.
  oLayer:AddWindow( "BOX01", "PANEL01", "Parametros" , 100, .F.,,, "LINE01" )
  oLayer:AddWindow( "BOX02", "PANEL02", "Solicitações de Compras", 100, .F.,,, "LINE02" ) 
  
  //GETWINPANEL é o método que retorna o objeto do painel da Janela
  oPanel01 := oLayer:GetWinPanel( "BOX01", "PANEL01", "LINE01" )
  oPanel02 := oLayer:GetWinPanel( "BOX02", "PANEL02", "LINE02" )  

  oMatr	:= TGet():New( 005, 010,{|u| if(PCount()>0,cMat:=u,cMat)}      ,oPanel01,030, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",cMat   ,,,,,,,"Matricula",1 )
  oNome	:= TGet():New( 005, 050,{|u| if(PCount()>0,cNome:=u,cNome)}    ,oPanel01,120, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",cNome  ,,,,,,,"Nome",1 )
  oAdmis	:= TGet():New( 005, 180,{|u| if(PCount()>0,dAdmis:=u,dAdmis)}  ,oPanel01,040, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",dAdmis ,,,,,,,"Admissao",1 )
    
  oGetDados:= MsNewGetDados():New(0,0,200,300,GD_UPDATE,"U_APON001L()","AllwaysTrue","",aAltera,,9999,"AllwaysTrue","","AllwaysTrue",oPanel02,aHeader,aCols)
  oGetDados:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT

  ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{|| if(Valida(),( nOpcao:= 1, oDlg:End() ), Nil) },{|| oDlg:End()},,aBotoes) CENTERED

Return

No exemplo seguinte, irei incorporar os objetos fora da função principal.

#include "Protheus.ch"
User Function ExemploFWLayer()
  Local oLayer
  //Declare as variáveis como Private para que elas possam ser utilizadas fora da função principal
  Private oMatr,oNome,oAdmis,oGetDados
  Private cMat := cNome := ""
  Private dAdmis := CTOD("//")
  Private aHeader:= {}
  Private aCols  := {}
    
  Static oDlg
   
  DEFINE MSDIALOG oDlg TITLE "Exemplo FWLayer" FROM 0,0 TO 500,600 COLORS 0, 16777215 PIXEL
  oLayer := FWLayer():New()
  oLayer:Init( oDlg, .F. )
  oLayer:AddLine( "LINE01", 25 )
  oLayer:AddLine( "LINE02", 72 )

  oLayer:AddCollumn( "BOX01", 100,, "LINE01" )
  oLayer:AddCollumn( "BOX02", 100,, "LINE02" )

  oLayer:AddWindow( "BOX01", "PANEL01", "Dados do funcionário" , 100, .F.,,, "LINE01" )
  oLayer:AddWindow( "BOX02", "PANEL02", "Detalhes do ponto ", 100, .F.,,, "LINE02" ) 

  FPanel01( oLayer:GetWinPanel( "BOX01", "PANEL01", "LINE01" ) ) //Estou passando para a função o método que retorna o objeto do painel da Janela
  FPanel02( oLayer:GetWinPanel( "BOX02", "PANEL02", "LINE02" ) )
        
  ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{|| if(Valida(),( nOpcao:= 1, oDlg:End() ), Nil) },{|| oDlg:End()},,aBotoes) CENTERED

Return
Static Function FPanel01( oPanel ) //A função recebe o objeto da janela
    oMatr	:= TGet():New( 005, 010,{|u| if(PCount()>0,cMat:=u,cMat)}     ,oPanel,030, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",cMat   ,,,,,,,"Matricula",1 )
    oNome	:= TGet():New( 005, 050,{|u| if(PCount()>0,cNome:=u,cNome)}   ,oPanel,120, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",cNome  ,,,,,,,"Nome",1 )
    oAdmis	:= TGet():New( 005, 180,{|u| if(PCount()>0,dAdmis:=u,dAdmis)} ,oPanel,040, 010,Nil,{||  },0,,,.F.,,.T.,,.F.,{|| .F.},.F.,.F.,,.F.,.F.,"",dAdmis ,,,,,,,"Admissao",1 )
Return
Static Function FPanel02( oPanel )
    oGetDados:= MsNewGetDados():New(0,0,200,300,GD_UPDATE,"U_APON001L()","AllwaysTrue","",aAltera,,9999,"AllwaysTrue","","AllwaysTrue",oPanel,aHeader,aCols)
    oGetDados:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
Return

Para mim, a segunda opção deixa o código mais organizado, você separa cada bloco de sua tela em um fonte. Deixando na função principal, mais limpa e legível.

 


Equipe Blog Advpl

Amantes da tecnologia

0 comentário

Deixe uma resposta