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.
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Mala alineacion de controles
Re: Mala alineacion de controles
Bien, de momento, me apaño con...
adjunto el Sample "modificado"
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
- Adjuntos
-
- test.zip
- (3.64 KiB) Descargado 143 veces
Un Saludo,
Xevi.
Xevi.
Re: Mala alineacion de controles
Faltavan los controles nAlign alRIGHT o alBOTTOM, si éstos tienen controles anclados RIGHT y/o BOTTOM
seguro que hay una forma mas "elegante" pero me funciona.
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
Un Saludo,
Xevi.
Xevi.
Re: Mala alineacion de controles
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:
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í:
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 )
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
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.
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.
Un Saludo,
Xevi.
Xevi.