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.

Mala alineacion de controles

Foro público de Xailer en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Mala alineacion de controles

Mensaje 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.
Adjuntos
test.zip
(3.53 KiB) Descargado 150 veces
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Mensaje 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"
Adjuntos
test.zip
(3.64 KiB) Descargado 143 veces
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Mensaje 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.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Mala alineacion de controles

Mensaje 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
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Mensaje 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.
Un Saludo,
Xevi.
Responder