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
User avatar
XeviCOMAS
Posts: 514
Joined: Sat Mar 12, 2011 8:16 pm

Mala alineacion de controles

Postby XeviCOMAS » Fri Feb 15, 2019 3:14 pm

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.
Attachments
test.zip
(3.53 KiB) Downloaded 14 times
Un Saludo,
Xevi.
User avatar
XeviCOMAS
Posts: 514
Joined: Sat Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Postby XeviCOMAS » Fri Feb 15, 2019 4:01 pm

Bien, de momento, me apaño con...

Code: Select all

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"
Attachments
test.zip
(3.64 KiB) Downloaded 15 times
Un Saludo,
Xevi.
User avatar
XeviCOMAS
Posts: 514
Joined: Sat Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Postby XeviCOMAS » Fri Feb 15, 2019 8:47 pm

Faltavan los controles nAlign alRIGHT o alBOTTOM, si éstos tienen controles anclados RIGHT y/o BOTTOM

Code: Select all

   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.
User avatar
jfgimenez
Site Admin
Posts: 5618
Joined: Mon Apr 06, 2015 8:48 pm
Contact:

Re: Mala alineacion de controles

Postby jfgimenez » Sat Feb 16, 2019 12:52 pm

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:

Code: Select all

   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í:

Code: Select all

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
User avatar
XeviCOMAS
Posts: 514
Joined: Sat Mar 12, 2011 8:16 pm

Re: Mala alineacion de controles

Postby XeviCOMAS » Mon Feb 18, 2019 11:50 am

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.

Return to “Spanish”