Verschieben und Ändern der Größe von Steuerelementen zur Laufzeit

Hier erfahren Sie, wie Sie das Ziehen und Ändern der Größe von Steuerelementen (in einem Delphi-Formular) mit einer Maus aktivieren, während die Anwendung ausgeführt wird.

Formulareditor zur Laufzeit

Sobald Sie ein Steuerelement (visuelle Komponente) in das Formular eingefügt haben, können Sie dessen Position, Größe und andere Eigenschaften zur Entwurfszeit anpassen. Es gibt jedoch Situationen, in denen Sie einem Benutzer Ihrer Anwendung erlauben müssen, Formularsteuerelemente zur Laufzeit neu zu positionieren und ihre Größe zu ändern.

Zum Aktivieren der Laufzeitbenutzerbewegung und zum Ändern der Größe von Steuerelementen in einem Formular mit der Maus drei mausbezogene Ereignisse benötigen spezielle Behandlung: OnMouseDown, OnMouseMove und OnMouseUp.

Angenommen, Sie möchten einem Benutzer ermöglichen, ein Tastensteuerelement zur Laufzeit mit einer Maus zu verschieben (und seine Größe zu ändern). Zunächst behandeln Sie das OnMouseDown-Ereignis, damit der Benutzer die Schaltfläche "greifen" kann. Als nächstes sollte das OnMouseMove-Ereignis die Schaltfläche neu positionieren (verschieben, ziehen). Schließlich sollte OnMouseUp den Verschiebevorgang beenden.

instagram viewer

Ziehen und Ändern der Größe von Formularsteuerelementen in der Praxis

Legen Sie zunächst mehrere Steuerelemente in einem Formular ab. Verwenden Sie ein Kontrollkästchen, um das Verschieben und Ändern der Steuerelemente zur Laufzeit zu aktivieren oder zu deaktivieren.

Definieren Sie als Nächstes drei Prozeduren (in der Schnittstelle Abschnitt der Formulardeklaration), der Mausereignisse wie oben beschrieben behandelt:

Art
TForm1 = Klasse(TForm)... Verfahren ControlMouseDown (Absender: TObject; Schaltfläche: TMouseButton; Shift: TShiftState; X, Y: Integer); Verfahren ControlMouseMove (Absender: TObject; Shift: TShiftState; X, Y: Integer); Verfahren ControlMouseUp (Absender: TObject; Schaltfläche: TMouseButton; Shift: TShiftState; X, Y: Integer); Privat
inReposition: boolean; oldPos: TPoint; 

Hinweis: Zwei Variablen auf Formularebene sind erforderlich, um zu markieren, ob eine Steuerbewegung stattfindet (inReposition) und zur Kontrolle der alten Position (oldPos).

Weisen Sie im OnLoad-Ereignis des Formulars entsprechenden Ereignissen Verfahren zur Behandlung von Mausereignissen zu (für die Steuerelemente, die Sie ziehbar / in der Größe veränderbar machen möchten):

Verfahren TForm1.FormCreate (Absender: TObject); Start
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; Ende; (* FormCreate *)

Hinweis: Der obige Code ermöglicht die Neupositionierung von Button1, Edit1, Panel1 und Button2 zur Laufzeit.

Zum Schluss noch der magische Code:

VerfahrenTForm1.ControlMouseDown ( Absender: TObject; Schaltfläche: TMouseButton; Shift: TShiftState; X, Y: Integer);Startwenn (chkPositionRunTime. Überprüft) UND
(Absender ist TWinControl) dannStart
inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); Ende; Ende; (* ControlMouseDown *)

ControlMouseDown Kurz gesagt: Sobald ein Benutzer eine Maustaste über ein Steuerelement drückt, ist die Neupositionierung zur Laufzeit aktiviert (Kontrollkästchen) chkPositionRunTime ist aktiviert) und die Kontrolle, die die Maus sogar nach unten empfangen hat, ist von TWinControl abgeleitet. Markieren Sie, dass eine Neupositionierung der Kontrolle stattfindet (inReposition: = True) und stellen Sie sicher, dass die gesamte Mausverarbeitung für das Steuerelement erfasst wird, um zu verhindern, dass Standard-Klickereignisse auftreten verarbeitet.

VerfahrenTForm1.ControlMouseMove ( Absender: TObject; Shift: TShiftState; X, Y: Integer);const
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; Startwenn inReposition dannStartmit TWinControl (Absender) tunStart
GetCursorPos (newPos); wenn ssShift im Verschiebung dannStart//resize
Bildschirm. Cursor: = crSizeNWSE; frmPoint: = ScreenToClient (Maus. CursorPos); wenn frmPoint. X> minBreite dann
Breite: = frmPoint. X; wenn frmPoint. Y> minHeight dann
Höhe: = frmPoint. Y; Endesonst//moveStart
Bildschirm. Cursor: = crSize; Links: = Links - oldPos. X + newPos. X; Oben: = Oben - oldPos. Y + newPos. Y; oldPos: = newPos; Ende; Ende; Ende; Ende; (* ControlMouseMove *)

ControlMouseMove Kurz gesagt: Ändern Sie den Bildschirmcursor, um den Vorgang wiederzugeben: Wenn Sie die Umschalttaste drücken, können Sie die Größe des Steuerelements ändern oder das Steuerelement einfach an eine neue Position bewegen (wohin die Maus fährt). Hinweis: minWidth und minHeight Konstanten bieten eine Art Größenbeschränkung (minimale Steuerungsbreite und -höhe).

Wenn Sie die Maustaste loslassen, ist das Ziehen oder Ändern der Größe beendet:

VerfahrenTForm1.ControlMouseUp ( Absender: TObject; Schaltfläche: TMouseButton; Shift: TShiftState; X, Y: Integer);Startwenn inReposition dannStart
Bildschirm. Cursor: = crDefault; ReleaseCapture; inReposition: = False; Ende; Ende; (* ControlMouseUp *)

ControlMouseUp Kurz gesagt: Wenn ein Benutzer mit dem Verschieben (oder Ändern der Größe des Steuerelements) fertig ist, lassen Sie die Mauserfassung los (um die Standardklickverarbeitung zu aktivieren) und markieren Sie, dass die Neupositionierung abgeschlossen ist.

Und das macht es! Laden Sie die Beispielanwendung herunter und probieren Sie es selbst aus.

Hinweis: Eine andere Möglichkeit, Steuerelemente zur Laufzeit zu verschieben, ist die Verwendung von Delphi Drag & Drop verwandte Eigenschaften und Methoden (DragMode, OnDragDrop, DragOver, BeginDrag usw.). Durch Ziehen und Ablegen können Benutzer Elemente von einem Steuerelement (z. B. einem Listenfeld oder einer Baumansicht) in ein anderes ziehen.

Wie merke ich mir Kontrollposition und -größe?

Wenn Sie einem Benutzer erlauben, Formularsteuerelemente zu verschieben und ihre Größe zu ändern, müssen Sie sicherstellen, dass die Platzierung der Steuerelemente irgendwie erfolgt Wird gespeichert, wenn das Formular geschlossen wird und die Position jedes Steuerelements beim Erstellen / Laden des Formulars wiederhergestellt wird. Hier erfahren Sie, wie Sie die Eigenschaften Links, Oben, Breite und Höhe für jedes Steuerelement in einem Formular in einem speichern INI Datei.

Wie wäre es mit 8 Griffen?

Wenn Sie einem Benutzer erlauben, Steuerelemente im Delphi-Formular zur Laufzeit mit der Maus zu verschieben und ihre Größe zu ändern, um Um die Entwurfszeitumgebung vollständig nachzuahmen, sollten Sie dem Steuerelement acht Griffe hinzufügen Größe geändert.