2009-11-27 14 views
5

Pregunta simple. Tengo un panel con 3 componentes. Todos ellos tienen Align: = alRight. Pero el problema es que durante el tiempo de ejecución el orden de ellos no es el mismo que designtime.Cómo usar TControl.Align: = alCustom?

¿Puedo usar alCustom para forzar el orden en el borde derecho? Uso D2007.

+1

El problema de orden diferente en designtime y tiempo de ejecución puede ocurrir manipulando la visibilidad de estos controles –

Respuesta

2

No revela gran parte del problema en cuestión, pero habría echado un vistazo al panel de flujo en su lugar.

Al soltar los controles en un panel de flujo, aparece una nueva propiedad de orden 'automágicamente'. Puede establecer de qué manera deben fluir sus controles, y si desea espacio entre los controles, establezca los márgenes en cada control.

Una pequeña aclaración: La nueva 'propiedad de la orden' se llama realmente 'ControlIndex', y aparecerá en la parte inferior del inspector de objetos.

+0

Gracias, todavía no lo he intentado, pero parece ser la mejor solución (menos codificación). –

+0

Ahora lo probé y no funcionó. Agregué 3 botones a un FlowPanel y no veo ninguna propiedad de orden en el panel. ¿Te he entendido mal? –

+0

Supongo que estaba un poco confuso. La propiedad 'order' se llama 'ControlIndex' y aparecerá en la parte inferior del inspector de objetos. – Vegar

7

Sí, puede hacer cualquier tipo de alineación personalizada. Simplemente use los eventos OnAlignInsertBefore() y OnAlignPosition() del control. (Existen en Delphi 2007, pero no se publican, por lo que no aparecen en la pestaña Eventos del Inspector de Objetos; aún así puede asignarlos en código. He mostrado los prototipos a continuación, están documentados en el archivo de ayuda de TAlignInsertBeforeEvent y TAlignPositionEvent, también se pueden ver CustomAlignInsertBefore y OnAlignInsertBefore)

TAlignInsertBeforeEvent = function(Sender: TWinControl; 
    C1, C2: TControl): Boolean of object; 

TAlignPositionEvent = procedure(Sender: TWinControl; Control: TControl; 
    var NewLeft, NewTop, NewWidth, NewHeight: Integer; 
    var AlignRect: TRect; AlignInfo: TAlignInfo) of object; 

La documentación contiene muy buenas descripciones de los parámetros a ambos métodos..

En Delphi 2010, estos eventos se publican y aparecen en la pestaña Eventos del Inspector de objetos.

Nunca he visto el problema que tienes, sin embargo ... ¿Trataste de configurar todos en alNone, alejándolos del borde derecho y luego reajustando Align: = alRight en el orden ¿Quieres que aparezcan?

+0

¡Oh! He visto esto suceder bastante. Es especialmente tonto cuando tienes instancias de TSplitter que 'cambian' al extremo del formulario, en efecto, deshabilitándolos. Siempre he resuelto esto con TPanels adicionales y anclaje en el pasado. –

+0

He tenido que emplear la recomendación de Ken de establecer la alineación en "Ninguno" y luego configurarlos en "Derecha" en el orden que desee. Me gustaría agregar que también debes moverlos "lo suficientemente lejos" del borde derecho. Digamos que tiene dos componentes en un formulario: RightControl (alineado a la derecha) y NoneControl (ninguno alineado). Si NoneControl.Right> RightControl.Right, entonces cambiar NoneControl.align: = alRight lo colocará a la derecha de RightControl. Por este motivo, configuré todas ellas con un número negativo (por ejemplo, en crear formulario) y luego establecí la alineación a la derecha. –

+0

La última versión de Delphi 2007 también publica estos eventos. (No sé si esto fue desde el principio o se agregó a través de una actualización.) – dummzeuch