Mover y cambiar el tamaño de los controles en tiempo de ejecución

Aquí le mostramos cómo habilitar arrastrar y cambiar el tamaño de los controles (en un formulario de Delphi) con un mouse, mientras la aplicación se está ejecutando.

Editor de formularios en tiempo de ejecución

Una vez que coloca un control (componente visual) en el formulario, puede ajustar su posición, tamaño y otras propiedades de tiempo de diseño. Sin embargo, hay situaciones en las que tiene que permitir que un usuario de su aplicación reposicione los controles del formulario y cambie su tamaño, en tiempo de ejecución.

Para habilitar el movimiento del usuario en tiempo de ejecución y cambiar el tamaño de los controles en un formulario con un mouse, tres eventos relacionados con el mouse necesita un manejo especial: OnMouseDown, OnMouseMove y OnMouseUp.

En teoría, supongamos que desea permitir que un usuario mueva (y cambie el tamaño) un control de botón, con un mouse, en tiempo de ejecución. En primer lugar, maneja el evento OnMouseDown para permitir al usuario "agarrar" el botón. A continuación, el evento OnMouseMove debe reposicionar (mover, arrastrar) el botón. Finalmente, OnMouseUp debería finalizar la operación de movimiento.

instagram viewer

Arrastrar y cambiar el tamaño de los controles de formulario en la práctica

En primer lugar, suelte varios controles en un formulario. Tenga un CheckBox para habilitar o deshabilitar los controles de movimiento y cambio de tamaño en tiempo de ejecución.

A continuación, defina tres procedimientos (en el interfaz sección de la declaración de formulario) que manejará los eventos del mouse como se describe anteriormente:

tipo
TForm1 = clase(TForm)... procedimiento ControlMouseDown (Remitente: TObject; Botón: TMouseButton; Shift: TShiftState; X, Y: entero); procedimiento ControlMouseMove (Remitente: TObject; Shift: TShiftState; X, Y: entero); procedimiento ControlMouseUp (Remitente: TObject; Botón: TMouseButton; Shift: TShiftState; X, Y: entero); privado
inReposition: boolean; oldPos: TPoint; 

Nota: Se requieren dos variables de nivel de formulario para marcar si se está produciendo un movimiento de control (inReposition) y para almacenar el control de la posición anterior (oldPos).

En el evento OnLoad del formulario, asigne procedimientos de manejo de eventos del mouse a los eventos correspondientes (para los controles que desea arrastrar / cambiar de tamaño):

procedimiento TForm1.FormCreate (Remitente: TObject); empezar
Button1.OnMouseDown: = ControlMouseDown; Button1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Button2.OnMouseDown: = ControlMouseDown; Button2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; final; (* FormCreate *)

Nota: el código anterior permite la reposición en tiempo de ejecución de Button1, Edit1, Panel1 y Button2.

Finalmente, aquí está el código mágico:

procedimientoTForm1.ControlMouseDown ( Remitente: TObject; Botón: TMouseButton; Shift: TShiftState; X, Y: entero);empezarSi (chkPositionRunTime. Comprobado) Y
(Remitente es TWinControl) luegoempezar
inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); final; final; (* ControlMouseDown *)

ControlMouseDown en resumen: una vez que un usuario presiona un botón del mouse sobre un control, si la reposición en tiempo de ejecución está habilitada (casilla de verificación chkPositionRunTime está marcada) y el control que recibió el mouse hacia abajo incluso se deriva de TWinControl, marque que la reposición del control está teniendo lugar (inReposition: = True) y asegúrese de que todo el procesamiento del mouse se capture para el control, para evitar que se realicen eventos predeterminados de "clic" procesada.

procedimientoTForm1.ControlMouseMove ( Remitente: TObject; Shift: TShiftState; X, Y: entero);const
minWidth = 20; minHeight = 20; var
nuevoPos: TPoint; frmPoint: TPoint; empezarSi inReposition luegoempezarcon TWinControl (remitente) hacerempezar
GetCursorPos (newPos); Si ssShift en Cambio luegoempezar//resize
Pantalla. Cursor: = crSizeNWSE; frmPoint: = ScreenToClient (Mouse. CursorPos); Si frmPoint. X> minWidth luego
Ancho: = frmPoint. X; Si frmPoint. Y> minHeight luego
Altura: = frmPoint. Y; finalmás//moveempezar
Pantalla. Cursor: = crSize; Izquierda: = Izquierda - oldPos. X + nuevoPos. X; Arriba: = Arriba - viejoPos. Y + nuevoPos. Y; oldPos: = newPos; final; final; final; final; (* ControlMouseMove *)

ControlMouseMove en resumen: cambie el cursor de pantalla para reflejar la operación: si se presiona la tecla Shift, permita cambiar el tamaño del control, o simplemente mueva el control a una nueva posición (donde va el mouse). Nota: minWidth y minHeight Las constantes proporcionan una especie de restricción de tamaño (ancho y altura de control mínimo).

Cuando se suelta el botón del mouse, se termina de arrastrar o cambiar el tamaño:

procedimientoTForm1.ControlMouseUp ( Remitente: TObject; Botón: TMouseButton; Shift: TShiftState; X, Y: entero);empezarSi inReposition luegoempezar
Pantalla. Cursor: = crDefault; ReleaseCapture; inReposition: = False; final; final; (* ControlMouseUp *)

ControlMouseUp en resumen: cuando un usuario ha terminado de mover (o cambiar el tamaño del control) suelte la captura del mouse (para habilitar el procesamiento de clic predeterminado) y marque que la reposición ha terminado.

Y eso lo hace! Descarga la aplicación de muestra y pruébalo tú mismo.

Nota: Otra forma de mover controles en tiempo de ejecución es usar Delphi's arrastrar y soltar propiedades y métodos relacionados (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Arrastrar y soltar se puede usar para permitir a los usuarios arrastrar elementos de un control, como un cuadro de lista o una vista de árbol, a otro.

¿Cómo recordar la posición y el tamaño del control?

Si permite que un usuario mueva y cambie el tamaño de los controles de formulario, debe asegurarse de que la ubicación del control sea de alguna manera guardado cuando se cierra el formulario y que la posición de cada control se restaura cuando se crea / carga el formulario. Aquí se explica cómo almacenar las propiedades Izquierda, Superior, Ancho y Altura, para cada control en un formulario, en un INI archivo.

¿Qué tal 8 manijas de tamaño?

Cuando permite que un usuario mueva y cambie el tamaño de los controles en el formulario de Delphi, en tiempo de ejecución con el mouse, para imite completamente el entorno de tiempo de diseño, debe agregar ocho controladores de tamaño al control que se está redimensionado

instagram story viewer