2009-05-25 24 views
7

Antes de que Delphi 2006 (creo) presentara TFlowPanel y TGridPanel, hice un control similar en concepto. Todavía hace un par de cosas que esos controles no hacen, y cuando actualicé mi código a Delphi 2009, decidí añadir un par de mejoras a eso también.Arrastre y suelte en tiempo de diseño en Delphi?

En este momento, el orden de los controles secundarios está determinado por su orden de creación. El FlowPanel y el GridPanel muestran una mejor manera con ControlIndex y otras propiedades filtradas, pero me preguntaba si hay una forma de manejar el reordenamiento de arrastrar y soltar en tiempo de diseño. Por lo que puedo decir, arrastrar un control de edición y soltarlo en mi panel no llama a nada a lo que pueda acceder en el momento del diseño.

Estaba medio fantaseando sobre una forma de detectar la operación de caída directamente, o quizás detectar cuándo se mueve un control para poder determinar dónde debería ir.

¿Alguna idea?

Actualización: OK, lo tengo trabajando. El control del contenedor ya estaba anulando AlignControls para administrar la ubicación de los controles. Cuando arrastra el control anidado y lo suelta, se llama nuevamente AlignControls. Luego comparé las nuevas coordenadas del control con los otros controles en la lista y lo moví a la posición apropiada.

Hubo un par de problemas que tuve que solucionar (principalmente relacionados con las muchas llamadas a AlignControls) pero el concepto básico es bastante simple. Gracias a todos los comentaristas por toda la ayuda.

+0

"el orden de los controles secundarios está determinado por su orden de creación" ¿Qué es el pedido? Orden de tabulación? ¿Desea hacer que las pestañas se ordenen de arriba a abajo en un panel? – Serguzest

+0

Ahora, si selecciona el panel y luego agrega controles, los controles se distribuirán en el orden en que los agregó. Para reordenar, cortaría y pegaría o vería el formulario como texto y los cambiaría. Ahora he agregado una propiedad ControlIndex a la TFlowPanel pero quiero que los usuarios del control puedan arrastrar y soltar para reordenar. Así que tome Edit2 y colóquelo a la izquierda de Edit1 y mágicamente intercambien posiciones en el panel. –

Respuesta

5

No puede arrastrar un control que ya está en el formulario y colocarlo en su panel. Arrastrar es solo para mover un control, no para cambiar su elemento primario. Para cambiar el elemento principal, cortar y pegar.

Si el control ya está en su panel y desea moverlo a otra posición en su panel, entonces el panel puede controlar el diseño anulando el método TWinControl.AlignControls. Cuando se mueve un control, se llama al método SetBounds, y entre las cosas que suceden es que llama al AlignControl(Self) en su ventana principal. Eso llama al AlignControls. Mire en Controls.pas, y verá que ese es un método complicado, pero es el responsable del diseño de los elementos secundarios en un control, y eso es exactamente lo que planea cambiar.

+0

Hola Rob, Creo que no estaba muy claro sobre mis intenciones de re controles que se dejan caer en mi contenedor - ver mi respuesta al comentario de John. Con respecto al uso de AlignControls para gestionar el reordenamiento, tiene razón, por supuesto. Ya estoy usando AlignControls para organizar los hijos, pero ahora ignoro por completo las propiedades izquierda y superior. Mi preocupación es que tenerlos en cuenta hará que sea bastante difícil determinar cuándo se acaba de agregar un control y cuándo el usuario está intentando reordenar. Lo intentaré e informaré. –

0

¿Ha intentado escribir un evento "OnDragDrop" para su componente de cuadrícula, donde verifica si su componente está en modo de diseño?

Aún no he escrito un componente así, pero no veo por qué el evento no debería dispararse.

+0

Hola LeGEC. No probé OnDragDrop todavía, pero parecía que todos los demás eventos del mouse son interceptados por el diseñador de formularios, por lo que nunca se recibe la notificación de que se está arrastrando un control. –

3

Quizás algunas de estas sugerencias puedan ayudar.

Puede volver a parentalizar un control en el diseñador sin tener que cortar y pegar. Vea el panel de estructura y simplemente arrastre el control visual al nodo de otro elemento primario en el panel de estructura. Si tiene elementos en un panel de flujo, arrastre todo fuera del panel de flujo y arrástrelos hacia atrás en el orden en que desea que estén.

(Puede volver a los padres ningún control visual de esta manera, sin cambiar distinto de su padre nada. Le recomiendo hacerlo de esta manera.)

Usted puede ver la forma como texto, y mover el orden de la declaración por ahí, pero obviamente tendrá que tener cuidado al editar el archivo de "recursos" directamente.

Puede establecer el orden de las pestañas en el diseñador, por lo que puede realizar un control diferente según el orden de las pestañas que funcione como desee. Puede hacer clic con el botón derecho en el formulario y cambiar el orden de creación de los controles no visuales, pero eso no funciona con los controles visuales.

+0

Gracias, John. Mi pregunta realmente se relacionaba con poder soportarlo desde un control personalizado, básicamente para que el control determinara que se estaba descartando otro control en una posición que forma parte del rectángulo delimitador de mi control, para que se pueda cambiar su elemento principal. Sin embargo, tuve algunas dudas al respecto: además de no saber exactamente dónde comenzar, hará que el control actúe de manera diferente a otros contenedores, lo que puede ser confuso para algunos usuarios del control. –

+1

Quizás prefiera convertirlo en un editor de componentes, luego, haga clic en su propia interfaz de usuario haciendo clic con el botón derecho del mouse y use la función de mover hacia arriba/abajo o implemente la función de arrastrar y soltar en ese control. –

Cuestiones relacionadas