Olá,
Olha, utilizando apenas uma instãncia da FWLayer
, acredito que não seja possível, pois a FWLayer
se baseia em linhas e depois colunas, e como sua primeira coluna pega a altura completa da dialog, isso quebra o funcionamento da FWLayer
.
Como assim, linhas e depois colunas?
Se você verificar a documentação da FWLayer, o método addCollumn suporta receber uma linha como parâmetro, porém o método addLine não suporta receber uma coluna como parâmetro, logo uma linha tem colunas mas uma coluna não tem linhas. Quando você não informa a linha para o método addCollumn, é criada uma linha padrão, ou seja, SEMPRE existe uma linha para então existir uma coluna.
Consegui montar esse layout trabalhando com duas instâncias da FWLayer
, um para a coluna a esquerda e outra para as demais linhas e colunas, para dividir a tela em duas, utilizei dois TPanel
que acabam sendo o owner da FWLayer
.
Segue o exemplo:
#include "protheus.ch"
//---------------------------------------------------
/*/{Protheus.doc} Layer
Exemplo de utilização da classe FWLayer
@author Daniel Mendes
@since 03/12/2020
@version 1.0
/*/
//---------------------------------------------------
user function Layer()
local oDlgPrinc as object
local oFWLayerLeft as object
local oFWLayerRight as object
local oPanelLeft as object
local oPanelRight as object
local oEntidade as object
local oDetalhes as object
local o2Entidade as object
local oStatus as object
local oGrupos as object
local oCadastros as object
local aCoors as array
local nWidthDlg as numeric
//Variável não declarada, criei com valores simples para manter o POC e não gerar error.log
aCoors := {0, 0, 600, 999}
//Removi o define, tenho TOC =)
oDlgPrinc = MsDialog():new(aCoors[1], aCoors[2], aCoors[3], aCoors[4], "Teste",,, .F.,,,,,, .T.,,, .F. )
//Pego o tamanho da dialog - Largura da dialog principal
nWidthDlg := oDlgPrinc:nRight / 2
//22% da largura da Dialog, porém aqui reduzimos um pouco, por conta do espaço que existe entre as janelas que a FWLayer cria
oPanelLeft := TPanel():new(/*nRow*/, /*nCol*/, /*cText*/, oDlgPrinc, /*oFont*/, /*lCentered*/, /*uParam7*/, /*nClrText*/, /*nClrBack*/, (nWidthDlg * 0.22) - 3)
oPanelLeft:align := CONTROL_ALIGN_LEFT
//78% da largura da Dialog
oPanelRight := TPanel():new(/*nRow*/, /*nCol*/, /*cText*/, oDlgPrinc, /*oFont*/, /*lCentered*/, /*uParam7*/, /*nClrText*/, /*nClrBack*/, (nWidthDlg * 0.78))
oPanelRight:align := CONTROL_ALIGN_RIGHT
oFWLayerLeft := FWLayer():new()
oFWLayerLeft:init(oPanelLeft)
oFWLayerLeft:addCollumn("Col01", 100, .T. )
oFWLayerLeft:addWindow("Col01", "Win01", "Entidade", 99.9, .F., .T., {|| },,)
oFWLayerRight := FWLayer():new()
oFWLayerRight:init(oPanelRight)
oFWLayerRight:addLine("Lin01", 045, .F. )
oFWLayerRight:addLine("Lin02", 023, .F. )
oFWLayerRight:addLine("Lin03", 032, .F. )
oFWLayerRight:addCollumn("Col01Lin01", 034, .F., "Lin01")
oFWLayerRight:addCollumn("Col02Lin01", 033, .T., "Lin01")
oFWLayerRight:addCollumn("Col03Lin01", 033, .T., "Lin01")
//Somente o grupo está pegando 100 da linha
oFWLayerRight:addCollumn("Col01Lin02", 100, .F., "Lin02")
//Se desejar que Cadastros pegue a linha por completo, basta colocar o percentual em 100
oFWLayerRight:addCollumn("Col01Lin03", 034, .F., "Lin03")
oFWLayerRight:addWindow("Col01Lin01", "Win02", "Detalhes", 100, .T., .T., {||}, "Lin01",) //"Detalhes"
oFWLayerRight:addWindow("Col02Lin01", "Win05", "Entidade", 100, .F., .T., {|| }, "Lin01",) //"Entidade"
oFWLayerRight:addWindow("Col03Lin01", "Win06", "Status", 100, .F., .T., {|| }, "Lin01",) //"Status"
oFWLayerRight:addWindow("Col01Lin02", "Win03", "Grupos", 100, .T., .F., {||}, "Lin02",) //"Grupos"
oFWLayerRight:addWindow("Col01Lin03", "Win04", "Cadastros", 100, .F., .F.,{||}, "Lin03",) //"Cadastros"
oEntidade := oFWLayerLeft:getWinPanel("Col01", "Win01")
oDetalhes := oFWLayerRight:getWinPanel("Col01Lin01", "Win02", "Lin01")
o2Entidade := oFWLayerRight:getWinPanel("Col02Lin01", "Win05", "Lin01")
oStatus := oFWLayerRight:getWinPanel("Col03Lin01", "Win06", "Lin01")
oGrupos := oFWLayerRight:getWinPanel("Col01Lin02", "Win03", "Lin02")
oCadastros := oFWLayerRight:getWinPanel("Col01Lin03", "Win04", "Lin03")
oDlgPrinc:activate( ,,,.T.,,,,, )
return
Documentação:
https://tdn.totvs.com/display/public/PROT/FWLayer