Flytning og ændring af størrelse på kontroller på kørselstidspunkt

click fraud protection

Her er, hvordan du aktiverer trække og ændre størrelse på kontroller (på en Delphi-form) med en mus, mens applikationen kører.

Form Editor ved Run-Time

Når du placerer en kontrol (visuel komponent) på formularen, kan du justere dens placering, størrelse og andre designtidsegenskaber. Der er dog situationer, når du skal give en bruger af din applikation mulighed for at flytte formkontroller og ændre deres størrelse på kørselstidspunktet.

For at aktivere runtime-brugerbevægelse og ændre størrelse på kontroller på en formular med en mus, tre musrelaterede begivenheder har brug for særlig håndtering: OnMouseDown, OnMouseMove og OnMouseUp.

I teorien, lad os sige, at du vil aktivere en bruger til at flytte (og ændre størrelsen på) en knapkontrol med en mus på kørselstidspunktet. For det første håndterer du OnMouseDown begivenheden for at give brugeren mulighed for at "gribe" knappen. Derefter skal OnMouseMove-hændelsen flytte (flytte, trække) knappen. Endelig skal OnMouseUp afslutte flytningen.

instagram viewer

Træk og ændre størrelse på formkontroller i praksis

For det første skal du droppe flere kontroller på en formular. Har en CheckBox for at aktivere eller deaktivere bevægelse og ændre størrelse på kontroller under kørsel.

Definer derefter tre procedurer (i grænseflade afsnit af formularerklæringen), der håndterer musebegivenheder som beskrevet ovenfor:

type
TForm1 = klasse(TForm)... procedure ControlMouseDown (Afsender: TObject; Knap: TMouseButton; Skift: TShiftState; X, Y: heltal); procedure ControlMouseMove (Afsender: TObject; Skift: TShiftState; X, Y: heltal); procedure ControlMouseUp (Afsender: TObject; Knap: TMouseButton; Skift: TShiftState; X, Y: heltal); privat
inReposition: boolsk; oldPos: TPoint; 

Bemærk: Der kræves to formularniveauvariabler for at markere, hvis kontrolbevægelse finder sted (inReposition) og til at gemme kontrolens gamle position (oldPos).

I formularens OnLoad-hændelse skal du tildele procedurer til håndtering af musebegivenheder til tilsvarende begivenheder (for de kontroller, du vil kunne trækkes / ændres til størrelse):

procedure TForm1.FormCreate (Afsender: TObject); begynde
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 *)

Bemærk: Ovenstående kode muliggør omdisponering af kørsel af knap1, redigering1, panel1 og knap2.

Endelig er her den magiske kode:

procedureTForm1.ControlMouseDown ( Afsender: TObject; Knap: TMouseButton; Skift: TShiftState; X, Y: heltal);begyndehvis (ChkPositionRunTime. Kontrolleret) OG
(Sender er TwinControl) derefterbegynde
inReposition: = true; SetCapture (TWinControl (Afsender). Håndtag); GetCursorPos (oldPos); ende; ende; (* ControlMouseDown *)

ControlMouseDown kort sagt: når en bruger trykker på en museknap over en kontrol, hvis omdrejningstid er aktiveret (afkrydsningsfelt chkPositionRunTime er markeret), og kontrollen, der modtog musen nede, er afledt af TWinControl, marker, at kontrolplacering finder sted (inReposition: = Sandt) og sørg for, at al musebehandling er fanget til kontrollen - for at forhindre, at standard "klik" -hændelser bliver behandlet.

procedureTForm1.ControlMouseMove ( Afsender: TObject; Skift: TShiftState; X, Y: heltal);const
minBredde = 20; minHøjde = 20; Var
newPos: TPoint; frmPoint: TPoint; begyndehvis inReposition derefterbegyndemed TWinControl (afsender) gørebegynde
GetCursorPos (newPos); hvis ssShift i Flytte derefterbegynde//resize
Screen. Markør: = crSizeNWSE; frmPoint: = ScreenToClient (mus. CursorPos); hvis frmPoint. X> minBredde derefter
Bredde: = frmPoint. X; hvis frmPoint. Y> minHøjde derefter
Højde: = frmPoint. Y; endeandet//movebegynde
Screen. Markør: = crSize; Venstre: = Venstre - gammelPos. X + nye poster. X; Top: = Top - oldPos. Y + nye poster. Y; oldPos: = newPos; ende; ende; ende; ende; (* ControlMouseMove *)

ControlMouseMove kort sagt: ændre skærmemarkøren for at afspejle handlingen: Hvis der trykkes på Shift-tasten, skal du ændre størrelsen på kontrol, eller blot flytte kontrollen til en ny position (hvor musen skal). Bemærk: MinWidth og minHeight konstanter tilvejebringer en slags størrelsesbegrænsning (minimum kontrolbredde og højde).

Når museknappen slippes, er trækning eller ændring af størrelse over:

procedureTForm1.ControlMouseUp ( Afsender: TObject; Knap: TMouseButton; Skift: TShiftState; X, Y: heltal);begyndehvis inReposition derefterbegynde
Screen. Markør: = crDefault; ReleaseCapture; inReposition: = Falsk; ende; ende; (* ControlMouseUp *)

ControlMouseUp kort sagt: Når en bruger er færdig med at bevæge sig (eller ændre størrelsen på kontrollen), skal du frigøre musefangsten (for at aktivere standard-klikbehandling) og markere, at omplaceringen er færdig.

Og det gør det! Download eksemplet og prøv selv.

Bemærk: En anden måde at flytte kontroller på under driftstid er at bruge Delphi's Træk og slip relaterede egenskaber og metoder (DragMode, OnDragDrop, DragOver, BeginDrag osv.). Trækning og slipning kan bruges til at lade brugerne trække elementer fra en kontrol - f.eks. En listekasse eller trævisning - til en anden.

Sådan husker du kontrolposition og størrelse?

Hvis du tillader en bruger at flytte og ændre størrelsen på formkontroller, skal du sikre dig, at kontrolplacering på en eller anden måde er gemmes, når formularen er lukket, og at hver kontrolens position gendannes, når formularen oprettes / indlæses. Sådan lagres egenskaberne Venstre, Top, Bredde og Højde for hver kontrol på en formular i en INI fil.

Hvad med 8 størrelseshåndtag?

Når du tillader en bruger at flytte og ændre størrelsen på kontrollerne på Delphi-form ved kørsel med musen til efterligner designmiljøet fuldt ud, skal du tilføje otte størrelseshåndtag til kontrollen skaleres.

instagram story viewer