Flytta och ändra storlek på kontroller vid körning

Så här aktiverar du dra och ändra storlek på kontroller (på en Delphi-form) med en mus medan applikationen körs.

Form Editor vid körning

När du placerar en kontroll (visuell komponent) på formuläret kan du justera dess position, storlek och andra designtidsegenskaper. Det finns dock situationer när du måste tillåta en användare av din applikation att flytta formulärkontroller och ändra deras storlek vid körning.

För att möjliggöra användarrörelse för runtime och ändra storlek på kontroller på ett formulär med en mus, tre musrelaterade händelser behöver specialhantering: OnMouseDown, OnMouseMove och OnMouseUp.

Låt oss i teorin säga att du vill aktivera en användare att flytta (och ändra storlek på) en knappkontroll, med en mus, vid körning. Först hanterar du händelsen OnMouseDown så att användaren kan "greppa" knappen. Därefter ska händelsen OnMouseMove flytta (flytta, dra) knappen. Slutligen bör OnMouseUp avsluta flyttningen.

Dra och ändra storlek på formkontroller i praktiken

För det första, släpp flera kontroller på ett formulär. Ha en CheckBox för att aktivera eller inaktivera rörliga och ändra storlek på kontroller under körning.

instagram viewer

Definiera därefter tre procedurer (i gränssnitt avsnittet i formulärdeklarationen) som hanterar mushändelser som beskrivs ovan:

typ
TForm1 = klass(TForm)... procedur ControlMouseDown (avsändare: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: heltal); procedur ControlMouseMove (avsändare: TObject; Skift: TShiftState; X, Y: heltal); procedur ControlMouseUp (avsändare: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: heltal); privat
inReposition: boolean; oldPos: TPoint; 

Obs: Två formnivåvariabler krävs för att markera om kontrollrörelse äger rum (inReposition) och för att lagra kontroll av gammal position (oldPos).

I formulärets OnLoad-händelse, tilldela procedurer för hantering av mushändelser till motsvarande händelser (för de kontroller som du vill kunna dra eller ändra storlek på):

procedur TForm1.FormCreate (avsändare: TObject); Börja
Knapp1.OnMouseDown: = ControlMouseDown; Knapp1.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; slutet; (* FormCreate *)

Obs: koden ovan möjliggör omläggning av körning av knapp 1, Edit1, Panel1 och Butt22.

Slutligen, här är den magiska koden:

procedurTForm1.ControlMouseDown ( Avsändare: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: heltal);Börjaom (ChkPositionRunTime. Kontrollerade) OCH
(Avsändare är Twincontrol) sedanBörja
inReposition: = true; SetCapture (TWinControl (avsändare). Handtag); GetCursorPos (oldPos); slutet; slutet; (* ControlMouseDown *)

ControlMouseDown i korthet: när en användare trycker på en musknapp över en kontroll, om körningens omposition är aktiverad (kryssruta chkPositionRunTime är kontrollerad) och kontrollen som fick musen ner till och med härrör från TWinControl, markera att kontrollens omplacering äger rum (inReposition: = True) och se till att all musbehandling fångas för kontrollen - för att förhindra att standardklickhändelser blir bearbetas.

procedurTForm1.ControlMouseMove ( Avsändare: TObject; Skift: TShiftState; X, Y: heltal);const
minBredd = 20; minHöjd = 20; var
newPos: TPoint; frmPoint: TPoint; Börjaom inReposition sedanBörjamed TWinControl (avsändare) doBörja
GetCursorPos (newPos); om ssShift i Flytta sedanBörja//resize
Skärm. Markör: = crSizeNWSE; frmPoint: = ScreenToClient (mus. CursorPos); om frmPoint. X> minBredd sedan
Bredd: = frmPoint. X; om frmPoint. Y> minHöjd sedan
Höjd: = frmPoint. Y; slutetannan//moveBörja
Skärm. Markör: = crSize; Vänster: = Vänster - oldPos. X + newPos. X; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; slutet; slutet; slutet; slutet; (* ControlMouseMove *)

ControlMouseMove kort sagt: ändra skärmmarkören för att återspegla operationen: om Shift-tangenten trycks in tillåter du att ändra storlek på kontrollen, eller flytta kontrollen helt enkelt till en ny position (där musen går). Notera: minWidth och minHeight konstanter ger ett slags storlekstryck (minsta kontrollbredd och höjd).

När musknappen släpps är dra eller ändra storlek över:

procedurTForm1.ControlMouseUp ( Avsändare: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: heltal);Börjaom inReposition sedanBörja
Skärm. Markör: = crDefault; ReleaseCapture; inReposition: = Falsk; slutet; slutet; (* ControlMouseUp *)

ControlMouseUp kort sagt: när en användare har slutat flytta (eller ändra storleken på kontrollen) släpp musfångsten (för att aktivera standardklickbehandling) och markera att omplacering är klar.

Och det gör det! Ladda ner provapplikationen och prova själv.

Obs: Ett annat sätt att flytta kontroller vid körning är att använda Delphi dra och släpp relaterade egenskaper och metoder (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Dra och släppa kan användas för att låta användare dra objekt från en kontroll - till exempel en listruta eller trädvy - till en annan.

Hur man kommer ihåg kontrollposition och storlek?

Om du tillåter en användare att flytta och ändra storlek på formkontroller, måste du se till att kontrollplaceringen på något sätt är sparas när formuläret är stängt och att varje kontrolls position återställs när formuläret skapas / laddas. Så här lagrar du egenskaperna Vänster, Topp, Bredd och Höjd, för varje kontroll på ett formulär, i ett INI fil.

Hur ungefär 8 storlekar handtag?

När du tillåter en användare att flytta och ändra storlek på kontrollerna i Delphi-form, vid körning med musen, till helt efterlikna miljön designtid, bör du lägga till åtta storlekar handtag till kontrollen storleksändras.

instagram story viewer