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 documentoConcluído
Data19/01/2015
Versão1.0
Versão anterior1.0
Autores
  • Sem rótulos