- Criado por Sergio Luis De Alcantara Silveira, última alteração em 30 ago, 2023
FwDefSize - Classe de dimensionamento de janelas
Disponível a partir do Protheus 11
Objetivo:
Permitir que as janelas criadas pelo Protheus possam aproveitar a maior área da tela, levando em consideração a resolução adotada pelo sistema operacional.
Modo de funcionamento:
O conceito da classe FwDefSize é o de calcular o tamanho dos componentes (objetos) antes de sua criação. Para tanto, utiliza cálculos meramente matemáticos e é extremamente rápida.
Modo de utilização:
Para que a janela e seus componentes possam ser ajustados à resolução, devem ser utilizadas alguns métodos de FwDefSize(). Listaremos os principais métodos.
O método New() é o construtor, cria o objeto FwDefSize e obtém alguns dados básicos, como o tamanho da dialog (janela) a ser criada e o tamanho da área de trabalho a ser utilizada pelos componentes (objetos) contidos na janela.
O método AddObject() é utilizado para informar quantos objetos estarão contidos na área de trabalho e suas características.
O método Process() dispara os cálculos e armazena as propriedades de tamanho e posição de cada componente (objeto) da janela, conforme definições já armazenadas na classe.
O método GetDimension() retorna as dimensões dos objetos a ser utilizado no desenho dos mesmos
Além desses, algumas propriedades do objeto FwDefSize podem alterar a forma de cálculo e exibição, a saber:
lProp -> Booleano (lógico). Indica se os objetos que podem ser redimensionados terão sua proporção de tamanho respeitada. (.T.).
lLateral -> Booleano (lógico). Indica se os objetos serão dispostos lateralmente, ou seja, lado a lado.
Método New ()
Sintaxe:
ExpO1 := FwDefSize():New( [ ExpL1 ], [ ExpL2 ], [ ExpN1 ], [ ExpL3 ], [ ExpL4 ] )
Parâmetros:
ExpL1 -> Parâmetro booleano ( lógico ), opcional.
Descrição: este parâmetro indica se a janela a ser criada terá uma EnchoiceBar ( barra de botões ). A existência da enchoicebar reduzirá a área útil dos objetos da janela. O default é .T. (True)
ExpL2 -> Parâmetro booleano ( lógico ), opcional.
Descrição: este parâmetro indica se a janela a ser criada deverá ter o tamanho padrão do antigo sistema Advanced, ou seja, tamanho fixo. Este parâmetro foi criado por razões de compatibilidade e a rigor não deve ser utilizado. O default é .F. (False).
ExpN1 -> Parâmetro numérico, opcional.
Descrição: este parâmetro indica um tamanho mínimo de altura em PIXELS a ser utilizado pela janela, ou seja, a janela poderá ser criada com uma altura maior do que a normal em uma resolução baixa. Isso pode ser necessário devido a características especiais da janela. Normalmente não é passado. Exemplo de programa que utiliza este parâmetro: MATA103 (documento de entrada).
ExpL4 -> Opcional. Indica se os objetos serão dispostos lateralmente
Este parâmetro indica que os objetos serão dispostos horizontalmente na janela, ou seja, um ao lado do outro. Exemplo de programa que utiliza esta configuração: TECC060 (Rastreador de serviços – módulo gestão de serviços - SIGATEC ).
O default é .F.
Retorno:
ExpO1 -> Objeto FwDefSize
Propriedades:
O método New alimenta a propriedade aWindSize (coordenadas da Dialog)
Método AddObject ()
O método AddObject tem a função de acrescentar um objeto ao cálculo de FwDefSize e definir as características deste objeto. A ordem de disposição lógica dos objetos na tela respeitará a ordem na chamada de AddObject.
Quando da chamada de AddObject, é passado um código identificador deste objeto, que pode ser uma string que define o mesmo ( Ex: “GETDADOS” ). Em outros momentos, esse código pode ser utilizado para referenciar-se ao objeto ( ex: método GetDimension() )
Sintaxe:
ExpO1:AddObject( ExpX1, ExpN1, ExpN2, ExpL1, ExpL2, [ ExpL3 ] )
Parametros:
ExpX1 -> Identificador do objeto ( código )
ExpN1 -> Tamanho do objeto dimensao X
Indica o tamanho do objeto na dimensão X (horizontal).
ExpN2 -> Tamanho do objeto dimensao Y
Indica o tamanho do objeto na dimensão Y (vertical).
ExpL1 -> Permite dimensionar X
Indica se o tamanho do objeto deve ser modificado na dimensão X. Em alguns casos, não é desejável alterar a largura de um objeto. Exemplo: imagem.
ExpL2 -> Permite dimensionar Y
Indica se o tamanho do objeto deve ser modificado na dimensão Y. Em alguns casos, não é desejável alterar a altura de um objeto. Exemplo: linha contendo texto fixo ou objeto de altura fixa (folder de totalizadores da rotina MATA103 – documento de entrada – parte inferior)
ExpL1 -> Booleano (lógico). Mantém a proporção dos objetos
Este parâmetro indica que os objetos que podem ser redimensionados terão sua proporção de tamanho respeitada. Exemplo: se um objeto foi passado como “dimensão Y – redimensionar” e tamanho 100, e outro como “dimensão Y – redimensionar” e tamanho 200, o segundo objeto terá sempre o dobro da altura do primeiro, não importa a altura da janela. É importante salientar que essa função atua apenas caso os parâmetros 3 ou 4 de ExpA3 sejam .T..
Exemplo de rotina que utiliza esta configuração: TECA120.PRX – Plano de manutenção preventiva. A altura do segundo objeto (getdados) é 50% maior que a do primeiro (enchoice), pois foram definidos tamanhos 60 e 40.
Local oSize
oSize := FwDefSize():New( .T.)
oSize:AddObject( “ENCHOICE” , 100, 40, .T., .T. ) // enchoice
oSize:AddObject( “GETDADOS”, 100, 60, .T., .T. ) // enchoice
oSize:lProp := .T.
O default é .F.
Método Process()
O método process efetua os cálculos baseado nos dados fornecidos por New, AddObject e definições já armazenadas na classe e armazena as propriedades de tamanho e posição de cada componente (objeto) da janela.
Dessa forma, após executar process() já temos os dados necessários para desenhar a janela (dialog) e os componentes (objetos) da mesma.
Os dados para desenho da janela são armazenados na propriedade aWindSize. aWindSize é um array de 4 elementos.
Método GetDimension()
Os dados para desenho dos componentes são obtidos através do método GetDimension(), onde deve ser passado o identificador do objeto e qual dimensão se deseja obter.
Sintaxe:
ExpN1 := ExpO1:GetDimension( ExpX1, ExpC1 )
ExpN1 -> Dado de retorno
ExpO1 -> Objeto fwdefsize
ExpX1 -> Identificador do objeto ( código )
ExpC1 -> mnemônico de dimensão
Os mnemônicos válidos são:
“COLINI” -> Coluna inicial
“COLEND” -> Coluna final
“LININI” -> Linha inicial
“LINEND” -> Linha final
“XSIZE” -> Tamanho no eixo X ( largura )
“YSIZE” -> Tamanho no eixo Y ( altura )
Utilizando FwDefSize()
Exemplo:
A rotina TECA250.PRW ( contrato de prestação de serviços - módulo gestão de serviços ) é um exemplo de complexidade média, onde temos um objeto do tipo ‘enchoice’ na parte superior e um ‘folder’ (pastas) abaixo, cada pasta contendo um ‘grid’ do tipo getdados.
Exemplo de código:
Local oSize
// Calcula as dimensoes dos objetos
oSize := FwDefSize():New( .T. ) // Com enchoicebar
oSize:lLateral := .F. // Calculo vertical
// adiciona Enchoice
oSize:AddObject( "ENCHOICE", 100, 60, .T., .T. ) // Adiciona enchoice
// adiciona folder
oSize:AddObject( "FOLDER",100, 100, .T., .T. ) // Adiciona Folder
// Dispara o calculo
oSize:Process()
.
.
.
.
// Desenha a dialog
DEFINE MSDIALOG oDlgEsp TITLE STR0001 FROM ;
oSize:aWindSize[1],oSize:aWindSize[2] TO ;
oSize:aWindSize[3],oSize:aWindSize[4] PIXEL
// Monta a Enchoice
oEnChoice:=MsMGet():New( cAlias, nReg, nOpc,,,,,;
{oSize:GetDimension("ENCHOICE","LININI"),;
oSize:GetDimension("ENCHOICE","COLINI"),;
oSize:GetDimension("ENCHOICE","LINEND"),;
oSize:GetDimension("ENCHOICE","COLEND")};
, , 3, , , , , ,.T. )
// Monta o Objeto Folder
oFolder:=TFolder():New( oSize:GetDimension("FOLDER","LININI"),;
oSize:GetDimension("FOLDER","COLINI"),aTitles,aPages,oDlgEsp,,,,.T.,;
.T.,oSize:GetDimension("FOLDER","XSIZE"),;
oSize:GetDimension("FOLDER","YSIZE"))
// Cria a dimensão das getdados, diminuindo um pouco da área do folder //devido ao titulo da pasta e bordas do objeto
aPosGetD := { 3, 3, oSize:GetDimension("FOLDER","YSIZE") - 16, oSize:GetDimension("FOLDER","XSIZE") - 4 }
.
.
//desenha a getdados
o2Get:=MSGetDados():New( aPosGetD[1] ,aPosGetD[2],aPosGetD[3],;
aPosGetD[4],nOpc,"At250LinOk( 2 )",'AllWaysTrue',"+AAO_ITEM",.T.,,,,;
MAXGETDAD,,,,,oFolder:aDialogs[2])
Status do documento | Concluído |
---|---|
Data | 19/01/2015 |
Versão | 1.0 |
Versão anterior | 1.0 |
Autores |
- Sem rótulos