Page 1 of 1

Falla la alineación LEFT

PostPosted: Fri Dec 29, 2017 11:54 pm
by Xevi
Por cierto... no se si os habeis fijado, pero la alineacion de un control a LEFT no ocupa TODO el nWidth.

Las otras alineaciones, TOP, RIGHT, BOTTOM quadran a la perfección.
La que falla es LEFT
Me di cuenta el otro dia al alinear una ExplBar a LEFT, y pense que lo hacia mal yo... pero veo que también ocurre con un Panel dentro de un PANEL

Así pues...

Code: Select all  Expand view

//dado un contenedor PANEL
oPanel1 := TPanel():New( 125, 345, 125+300, 345+500, oWnd )

//Creo un PANEL dentro del PANEL1
#define alLEFT   3
   WITH OBJECT TPanel():New(,,30,, oPanel1 )
   :SetColor( 0, CLR_RED )
   :nAlign := alLEFT  //Le faltan unos pixeles en la parte inferior. Por lo visto no calcula bien el nHeight
   END WITH
 


vease imagen...

Image
Image

Re: Falla la alineación LEFT

PostPosted: Sat Dec 30, 2017 1:08 am
by cnavarro
No se ve bien en tu imagen

Image

Re: Falla la alineación LEFT

PostPosted: Sat Dec 30, 2017 9:41 am
by Antonio Linares
El problema viene de la función WndAdjLeft() que comprueba si el control tiene "abuelo" (padre de padre) :-)

Code: Select all  Expand view
  MoveWindow( hControl, 0, wTopHeight - ( GetParent( GetParent( hControl ) ) != 0 ) - 2,
               rctCtrl.right - rctCtrl.left,
               rct.bottom - rct.top + 1 +
               ( ! GetParent( GetParent( hControl ) ) )
               - wTopHeight - wBottomHeight,
               TRUE );


A ver que solución le podemos dar...

Aqui está el ejemplo completo propuesto por Xevi:
Code: Select all  Expand view
#include "FiveWin.ch"

#define alLEFT   3

function Main()

   //dado un contenedor PANEL
   local oWnd, oPanel1

   DEFINE WINDOW oWnd

   oPanel1 := TPanel():New( 125, 345, 125+300, 345+500, oWnd )
   oPanel1:SetColor( 0, CLR_BLUE )
   oPanel1:nAlign = alLEFT

   //Creo un PANEL dentro del PANEL1
   WITH OBJECT TPanel():New(,,30,, oPanel1 )
   :SetColor( 0, CLR_RED )
   :nAlign := alLEFT  //Le faltan unos pixeles en la parte inferior. Por lo visto no calcula bien el nHeight
   END WITH

   ACTIVATE WINDOW oWnd

return nil

Re: Falla la alineación LEFT

PostPosted: Sat Dec 30, 2017 10:17 am
by Antonio Linares
Con esta modificación en la función WndAdjLeft() parece funcionar bien:

Code: Select all  Expand view
  MoveWindow( hControl, 0, wTopHeight - 1,
               rctCtrl.right - rctCtrl.left,
               rct.bottom - rct.top + 1 +
               ( ! GetParent( GetParent( hControl ) ) )
               - wTopHeight - wBottomHeight,
               TRUE );


Habría que comprobar si esto produce algún efecto indeseado en otros controles (posiblemente buttonbars) ya
que ese código estaba ahí por algo :-)

Re: Falla la alineación LEFT

PostPosted: Sat Dec 30, 2017 10:28 am
by Antonio Linares
Tal vez esta sea la solución correcta:

Code: Select all  Expand view
MoveWindow( hControl, 0, wTopHeight - ( GetParent( GetParent( hControl ) ) != 0 ),
               rctCtrl.right - rctCtrl.left,
               rct.bottom - rct.top + 1 +
               ( ! GetParent( GetParent( hControl ) ) )
               - wTopHeight - wBottomHeight,
               TRUE );


Agradezco vuestras pruebas y comentarios :-)

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 4:13 pm
by Xevi
No es lo único que encuentro que falla...
cualquier alineación (he probado PANEL) en un DIALOG, no funciona.

Code: Select all  Expand view

#include "FiveWin.ch"

#define alNONE   1
#define alTOP    2
#define alLEFT   3
#define alBOTTOM 4
#define alRIGHT  5
#define alCLIENT 6

Static oWnd

FUNCTION Main()

   DEFINE DIALOG oWnd FROM 1, 1 TO 800, 1450 PIXEL

   WITH OBJECT TPanel():New()
   :SetColor( 0, CLR_BLUE )
   :nHeight := 43
   :nAlign := alNONE//alCLIENT//alRIGHT//alLEFT//alTOP//alBOTTOM
   END WITH

   ACTIVATE DIALOG oWnd

Return Nil
 


He probado TODAS las alineaciones, lo que hacen es que no se muestra la ventana, corre la aplicación en modo Hide()

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 4:17 pm
by Xevi
Con un FolderEX... lo mismo

Code: Select all  Expand view

#include "FiveWin.ch"

#define alCLIENT 6

Static oWnd

FUNCTION Main()
   local oFldr

   DEFINE DIALOG oWnd FROM 1, 1 TO 800, 1450 PIXEL

   oFldr := TFolderEx():New( 0, 0,,, oWnd,, .F., .F., {"Prime","Segu","Terce","Quart","Five","Coses Meves"},,, 0,,,,, .F., 0,,, .F., "TOP",,, .F.,,, .T.,, .F.,, "oFldr" )
   oFldr:nAlign := alCLIENT//alRIGHT

   ACTIVATE DIALOG oWnd

Return Nil
 

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 6:09 pm
by cnavarro
Prueba asi

Code: Select all  Expand view


   oWnd:oClient  := oFldr    // oTop, oLeft, oRight, oBottom

 

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 6:57 pm
by Xevi
No funciona.

Se ejecuta, se visualiza... pero no hace al Align

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 7:05 pm
by cnavarro
Cómo quieres alinearlo?

Re: Falla la alineación LEFT

PostPosted: Mon Jan 01, 2018 7:06 pm
by Xevi
Cristobal,

pues como está funcionando en una WINDOW.

Si le digo alLEFT, pues a la izquierda,
alCLIENT, ocupar toda el área libre... y así pues con el resto de alineaciones, que SI funcionan con una WINDOW.

Re: Falla la alineación LEFT

PostPosted: Tue Jan 02, 2018 5:19 pm
by Xevi
¿?¿?

Re: Falla la alineación LEFT

PostPosted: Wed Jan 03, 2018 5:34 pm
by karinha
Mira c:\fwh\samples\testfx5.prg se ayuda.

Saludos.

Re: Falla la alineación LEFT

PostPosted: Thu Jan 04, 2018 9:34 am
by Antonio Linares
Xevi,

Un diálogo no se crea realmente hasta que no se activa, por lo que no puedes crear
controles antes. La solución es crearlos desde la claúsula ON INIT del ACTIVATE DIALOG:

Code: Select all  Expand view
#include "FiveWin.ch"

#define alLEFT 3

FUNCTION Main()

   local oWnd, oPanel

   DEFINE DIALOG oWnd FROM 1, 1 TO 800, 1450 PIXEL

   ACTIVATE DIALOG oWnd ;
      ON INIT ( oPanel := TPanel():New(),;
                oPanel:SetColor( 0, CLR_BLUE ),;
                oPanel:nHeight := 43,;
                oPanel:nAlign := alLEFT, .T. )

Return Nil

Re: Falla la alineación LEFT

PostPosted: Thu Jan 04, 2018 10:01 am
by Xevi
Perfecto!!!

Voy a tomar nota y crearme mis OnInitialize() en los Forms

Gracias.