FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Get Não Move
Posts: 21
Joined: Wed Nov 08, 2023 02:58 PM

Get Não Move

Posted: Mon Aug 03, 2026 07:31 PM

Ola,

Ao tentar redimensionar/mover um controle TGet dinamicamente utilizando o método oGet:Move() no evento ON INIT de um DIALOG (com estilo WS_POPUP / PIXEL), o controle não altera sua posição/tamanho visível na tela, mesmo informando o parâmetro/

Al intentar redimensionar o mover un control TGet de forma dinámica utilizando el método oGet:Move() dentro del evento ON INIT de un DIALOG (con estilo WS_POPUP / PIXEL), el control no altera su posición ni su tamaño visible en la pantalla, incluso cuando se especifica el parámetro lRepaint := .T..

Obrigado!!!

Function Main()
Local oDlg, oGet
Local nClrFore := CLR_WHITE
Local oFont := TFont():New( GetSysFont(), 0, -12,, .F. )
Local uVar := Space(20)

DEFINE DIALOG oDlg FROM 0,0 TO 0,0 STYLE nOR( WS_VISIBLE, WS_POPUP, 4 ) PIXEL ;
COLOR nClrFore, CLR_MAGENTA

  @  0 , 0 GET oGet VAR uVar SIZE 100,18 OF oDlg FONT oFont COLOR CLR_WHITE, CLR_BLUE PIXEL  NOBORDER UPDATE

ACTIVATE DIALOG oDlg ON INIT MeMover( oDlg, oGet)
Return( Nil )

Static Function MeMover(oDlg, oGet)

oDlg:Move( 100, 100, 400, 200 )
oGet:Move( 10, 10 , 70 , 15, .T. )

Return( Nil )

Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Get Não Move

Posted: Mon Aug 03, 2026 08:06 PM

Esse é um comportamento clássico do FiveWin. O problema ocorre porque o evento ON INIT é processado durante a mensagem WM_INITDIALOG do Windows, um momento em que a janela e os controles ainda estão sendo construídos.

Quando você chama oDlg:Move(...), isso dispara uma rotina de redimensionamento interno na janela pai. Como o ON INIT ainda não terminou, o FiveWin/Windows acaba sobrescrevendo ou ignorando a sua chamada oGet:Move() logo em seguida, retornando o controle para a posição original de criação.

A solução mais robusta para isso no FiveWin é usar o codeblock bStart do TDialog. Ele foi criado exatamente para executar ações logo após a tela ser desenhada pela primeira vez, garantindo que as alterações visuais sejam aplicadas e mantidas.

Aqui está a correção para a sua função MeMover:

Code (harbour): Select all Collapse
Static Function MeMover( oDlg, oGet )
   
   // 1. O Dialog pode ser movido normalmente no ON INIT
   oDlg:Move( 100, 100, 400, 200 )
   
   // 2. Delegamos o movimento do TGet para logo após a tela "nascer"
   oDlg:bStart := { || oGet:Move( 10, 10, 70, 15, .T. ) }
   
   Return( Nil )

Uma dica extra sobre controles TGet

No seu oGet:Move( 10, 10, 70, 15, .T. ), você está tentando definir a altura (height) como 15.

Por padrão, a API do Windows trava a altura de um controle Edit/Get de linha única (single-line) com base no tamanho da fonte (oFont) que está sendo utilizada. Se você notar que o topo, a esquerda e a largura mudaram, mas a altura continua a mesma, não é um erro do seu código. Para contornar essa limitação nativa do Windows, as opções seriam alterar o tamanho do oFont ou declarar o GET com o estilo ES_MULTILINE.

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion