Verplaatsen en formaat wijzigen van besturingselementen tijdens runtime

Hier leest u hoe u het slepen en vergroten of verkleinen van besturingselementen (op een Delphi-formulier) met een muis kunt inschakelen terwijl de toepassing actief is.

Form Editor tijdens runtime

Zodra u een besturingselement (visuele component) op het formulier hebt geplaatst, kunt u de positie, grootte en andere ontwerptijd-eigenschappen aanpassen. Er zijn echter situaties waarin u een gebruiker van uw toepassing moet toestaan ​​om formulierbesturingselementen tijdens runtime te verplaatsen en de grootte ervan te wijzigen.

Drie om verplaatsing van gebruikers tijdens runtime en formaatwijziging van besturingselementen op een formulier mogelijk te maken muis gerelateerde gebeurtenissen speciale behandeling nodig: OnMouseDown, OnMouseMove en OnMouseUp.

In theorie, laten we zeggen dat u een gebruiker in staat wilt stellen om een ​​knopbesturing tijdens de uitvoering met een muis te verplaatsen (en het formaat te wijzigen). Ten eerste behandelt u de OnMouseDown-gebeurtenis zodat de gebruiker de knop kan 'pakken'. Vervolgens moet de OnMouseMove-gebeurtenis de knop verplaatsen (verplaatsen, slepen). Ten slotte moet OnMouseUp de verplaatsingsbewerking voltooien.

instagram viewer

Formulierbesturing slepen en vergroten in de praktijk

Laat eerst verschillende besturingselementen op een formulier vallen. Beschikken over een CheckBox om het verplaatsen en vergroten of verkleinen van besturingselementen tijdens runtime in of uit te schakelen.

Definieer vervolgens drie procedures (in de koppel sectie van de formulierverklaring) die muisgebeurtenissen afhandelt zoals hierboven beschreven:

type
TForm1 = klasse(TForm)... procedure ControlMouseDown (Afzender: TObject; Knop: TMouseButton; Shift: TShiftState; X, Y: geheel getal); procedure ControlMouseMove (Afzender: TObject; Shift: TShiftState; X, Y: geheel getal); procedure ControlMouseUp (afzender: TObject; Knop: TMouseButton; Shift: TShiftState; X, Y: geheel getal); privaat
inReposition: boolean; oldPos: TPoint; 

Opmerking: er zijn twee variabelen op formulierniveau nodig om te markeren als de besturingsbeweging plaatsvindt (in Reposition) en om de controle oude positie op te slaan (oldPos).

In de OnLoad-gebeurtenis van het formulier wijst u procedures voor het afhandelen van muisgebeurtenissen toe aan overeenkomstige gebeurtenissen (voor die besturingselementen wilt u versleepbaar / aanpasbaar zijn):

procedure TForm1.FormCreate (Afzender: TObject); beginnen
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; einde; (* FormCreate *)

Opmerking: de bovenstaande code maakt herpositionering van Button1, Edit1, Panel1 en Button2 in runtime mogelijk.

Eindelijk, hier is de magische code:

procedureTForm1.ControlMouseDown ( Afzender: TObject; Knop: TMouseButton; Shift: TShiftState; X, Y: geheel getal);beginnenals (chkPositionRunTime. Aangevinkt) EN
(Afzender is TWinControl) vervolgensbeginnen
inReposition: = Waar; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); einde; einde; (* ControlMouseDown *)

ControlMouseDown in het kort: zodra een gebruiker een muisknop over een besturingselement drukt, als herpositionering tijdens runtime is ingeschakeld (selectievakje chkPositionRunTime is aangevinkt) en het besturingselement dat de muis naar beneden ontving, is zelfs afgeleid van TWinControl, markeer dat het verplaatsen van het besturingselement plaatsvindt (inReposition: = True) en zorg ervoor dat alle muisverwerking wordt vastgelegd voor de controle - om te voorkomen dat standaard "klik" -gebeurtenissen worden verwerkt.

procedureTForm1.ControlMouseMove ( Afzender: TObject; Shift: TShiftState; X, Y: geheel getal);const
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; beginnenals in Reposition vervolgensbeginnenmet TWinControl (afzender) Doenbeginnen
GetCursorPos (newPos); als ssShift in Verschuiving vervolgensbeginnen//resize
Scherm. Cursor: = crSizeNWSE; frmPoint: = ScreenToClient (muis. CursorPos); als frmPoint. X> minBreedte vervolgens
Breedte: = frmPoint. X; als frmPoint. Y> minHeight vervolgens
Hoogte: = frmPoint. Y; eindeanders//movebeginnen
Scherm. Cursor: = crSize; Links: = Links - oldPos. X + nieuwe Pos. X; Top: = Top - oudePos. Y + nieuwe posities. Y; oldPos: = newPos; einde; einde; einde; einde; (* ControlMouseMove *)

ControlMouseMove in het kort: verander de schermcursor om de bewerking weer te geven: als de Shift-toets wordt ingedrukt, kunt u het formaat van de besturing wijzigen of de bediening eenvoudig naar een nieuwe positie verplaatsen (waar de muis naartoe gaat). Notitie: minWidth en minHoogte constanten bieden een soort beperking van grootte (minimale besturingsbreedte en -hoogte).

Wanneer de muisknop wordt losgelaten, is slepen of vergroten of verkleinen voorbij:

procedureTForm1.ControlMouseUp ( Afzender: TObject; Knop: TMouseButton; Shift: TShiftState; X, Y: geheel getal);beginnenals in Reposition vervolgensbeginnen
Scherm. Cursor: = crDefault; ReleaseCapture; inReposition: = False; einde; einde; (* ControlMouseUp *)

ControlMouseUp in het kort: wanneer een gebruiker klaar is met verplaatsen (of het formaat van de besturing wijzigt), laat u de muisopname los (om standaard klikverwerking mogelijk te maken) en markeert u dat de herpositionering is voltooid.

En dat doet het! Download de voorbeeldtoepassing en probeer het zelf.

Opmerking: een andere manier om besturingselementen tijdens runtime te verplaatsen, is door Delphi's te gebruiken slepen en neerzetten gerelateerde eigenschappen en methoden (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Slepen en neerzetten kan worden gebruikt om gebruikers items van het ene besturingselement - zoals een keuzelijst of boomstructuurweergave - naar een ander te laten slepen.

Hoe de positie en grootte van de bediening onthouden?

Als u een gebruiker toestaat formulierbesturingselementen te verplaatsen en het formaat ervan te wijzigen, moet u ervoor zorgen dat de plaatsing van het besturingselement op de een of andere manier plaatsvindt opgeslagen wanneer het formulier wordt gesloten en dat de positie van elk besturingselement wordt hersteld wanneer het formulier wordt gemaakt / geladen. Hier leest u hoe u de eigenschappen Links, Boven, Breedte en Hoogte voor elk besturingselement op een formulier opslaat in een INI het dossier.

Hoe zit het met 8 handgrepen?

Wanneer u een gebruiker toestaat om besturingselementen op Delphi-formulier te verplaatsen en het formaat ervan te wijzigen, tijdens runtime met de muis, naar volledig nabootsen van de ontwerptijdomgeving, moet u acht formaathandvatten aan het besturingselement toevoegen formaat aangepast.

instagram story viewer