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.
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.