Página 1 de 1
Mala alineacion de controles
Publicado: Vie Feb 15, 2019 3:14 pm
por XeviCOMAS
En "practicas" con el Sample FormInAForm, me doy cuenta de un detalle.
Los controles que tienen anclaje a la derecha y/o abajo, no los ancla correctamente.
He añadido un par de labels al sample, uno alineado arriba/derecha y otro alineado abajo/derecha.
Adjunto proyecto.
Vereis que no los pone donde deberian de ir, estan unos 15-20píxeles de sus coordenadas correctas.
Que puedo hacer para solventar/corregir ese desencaje, ya que si diseño algun Formulario, éstos controles los tengo que desubicar de su sitio "normal"???
Gracias.
Re: Mala alineacion de controles
Publicado: Vie Feb 15, 2019 4:01 pm
por XeviCOMAS
Bien, de momento, me apaño con...
Código: Seleccionar todo
METHOD New( oParent ) CLASS TSimulForm
Local n
::Super:New( oParent )
::CreateForm( .T. )
IF !oParent:IsKindOf( "TForm" )
::nAlign := alCLIENT
ELSE
oParent:SetVirtualBounds( 0, 0, ::nWidth, ::nHeight )
ENDIF
For n:=1 to Len(::aControls)
If ::aControls[n]:nAnchors = akRIGHT .or. ::aControls[n]:nAnchors = akTOPRIGHT .or. ::aControls[n]:nAnchors = akRIGHTBOTTOM
::aControls[n]:nLeft += 16
EndIf
If ::aControls[n]:nAnchors = akBOTTOM .or. ::aControls[n]:nAnchors = akRIGHTBOTTOM .or. ::aControls[n]:nAnchors = akLEFTBOTTOM
::aControls[n]:nTop += 39
EndIf
next
RETURN Self
adjunto el Sample "modificado"
Re: Mala alineacion de controles
Publicado: Vie Feb 15, 2019 8:47 pm
por XeviCOMAS
Faltavan los controles nAlign alRIGHT o alBOTTOM, si éstos tienen controles anclados RIGHT y/o BOTTOM
Código: Seleccionar todo
For n:=1 to Len(::aControls)
If ::aControls[n]:nAlign = alRIGHT
For n2:=1 to Len(::aControls[n]:aControls)
If ::aControls[n]:aControls[n2]:nAnchors = akBOTTOM .or. ::aControls[n]:aControls[n2]:nAnchors = akRIGHTBOTTOM .or. ::aControls[n]:aControls[n2]:nAnchors = akLEFTBOTTOM .or. ::aControls[n]:aControls[n2]:nAnchors = akTOPRIGHTBOTTOM
::aControls[n]:aControls[n2]:nTop += 37
EndIf
Next
ElseIf ::aControls[n]:nAlign = alBOTTOM
For n2:=1 to Len(::aControls[n]:aControls)
If ::aControls[n]:aControls[n2]:nAnchors = akRIGHT .or. ::aControls[n]:aControls[n2]:nAnchors = akTOPRIGHT .or. ::aControls[n]:aControls[n2]:nAnchors = akRIGHTBOTTOM
::aControls[n]:aControls[n2]:nLeft += 14
EndIf
Next
Else
If ::aControls[n]:nAnchors = akRIGHT .or. ::aControls[n]:nAnchors = akTOPRIGHT .or. ::aControls[n]:nAnchors = akRIGHTBOTTOM
::aControls[n]:nLeft += 14
EndIf
If ::aControls[n]:nAnchors = akBOTTOM .or. ::aControls[n]:nAnchors = akRIGHTBOTTOM .or. ::aControls[n]:nAnchors = akLEFTBOTTOM .or. ::aControls[n]:nAnchors = akTOPRIGHTBOTTOM
::aControls[n]:nTop += 37
EndIf
EndIf
Next
seguro que hay una forma mas "elegante" pero me funciona.
Re: Mala alineacion de controles
Publicado: Sab Feb 16, 2019 12:52 pm
por jfgimenez
Xevi,
la causa del desplazamiento de los controles está en que un formulario tiene bordes y "caption" que tienen un determinado tamaño, y todos los cálculos se hacen teniendo en cuenta eso. En tu caso, estás usando un formulario que ha sido diseñado con el IDE, y después lo estás "engañando" para colocar esos controles dentro de otro control o en una parte de otro formulario que no coincide en tamaño. De ahí esas diferencias.
De todos modos, la solución es muy sencilla: añade esta línea en tu clase TSimulForm:
Código: Seleccionar todo
METHOD SetClientSize( nWidth, nHeight ) INLINE ::Super:SetBounds( ,, nWidth, nHeight )
Lo que hace eso es forzar a que el tamaño del formulario original coincida con el tamaño de su área cliente. Ten en cuenta que el formulario original realmente no existe al ejecutar el programa, pero sí que Xailer tiene en cuenta su tamaño para alinear los controles.
Por otro lado, no deberías llamar al :Create() del formulario creado así, porque se está llamando desde el método :CreateForm(). Por lo tanto, el método FormInitialize() de tu ejemplo debería quedar así:
Código: Seleccionar todo
METHOD FormInitialize( oSender ) CLASS TForm1
TForm2():New( ::oBevel1 )
TForm2():New( Self ):SetBounds( 130, 280, 320, 180 )
RETURN Nil
Re: Mala alineacion de controles
Publicado: Lun Feb 18, 2019 11:50 am
por XeviCOMAS
Gracias José.
Perfecto y entendido.
METHOD SetClientSize( nWidth, nHeight ) INLINE ::Super:SetBounds( ,, nWidth, nHeight )
Por lo que respecta al Create, si, al ponerlo en práctica en mi aplicación, vi que de mi manera, se lanzava el método Create() dos veces, y lo quité en el Initialize.
Gracias por tu tiempo.