Page 1 of 1

Mala alineacion de controles

Posted: Fri Feb 15, 2019 3:14 pm
by 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

Posted: Fri Feb 15, 2019 4:01 pm
by XeviCOMAS
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"

Re: Mala alineacion de controles

Posted: Fri Feb 15, 2019 8:47 pm
by XeviCOMAS
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.

Re: Mala alineacion de controles

Posted: Sat Feb 16, 2019 12:52 pm
by 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:

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

Re: Mala alineacion de controles

Posted: Mon Feb 18, 2019 11:50 am
by 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.