Flytte og endre størrelse på kontroller på kjøretid

Slik aktiverer du dra og endre størrelse på kontroller (på et Delphi-skjema) med en mus mens applikasjonen kjører.

Form Editor på Run-Time

Når du har plassert en kontroll (visuell komponent) på skjemaet, kan du justere dens posisjon, størrelse og andre designtidsegenskaper. Imidlertid er det situasjoner når du må la en bruker av applikasjonen din flytte skjemakontroller og endre størrelse på kjøretid.

For å aktivere brukertidsbevegelse og endre størrelse på kontroller på et skjema med en mus, tre musrelaterte hendelser trenger spesiell håndtering: OnMouseDown, OnMouseMove og OnMouseUp.

La oss i teorien si at du vil aktivere en bruker til å flytte (og endre størrelse på) en knappkontroll, med en mus, på kjøretid. For det første håndterer du OnMouseDown-hendelsen for å gjøre det mulig for brukeren å "gripe" knappen. Deretter skal OnMouseMove-hendelsen plassere (flytte, dra) knappen. Til slutt bør OnMouseUp fullføre flytteoperasjonen.

Dra og endre størrelse på skjemakontroller i praksis

Først slipper du flere kontroller på et skjema. Har en CheckBox for å aktivere eller deaktivere bevegelse og endre størrelse på kontroller under kjøretid.

instagram viewer

Deretter definerer du tre prosedyrer (i grensesnitt delen av skjemaerklæringen) som vil håndtere mushendelser som beskrevet ovenfor:

type
TForm1 = klasse(TForm)... fremgangsmåte ControlMouseDown (avsender: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: Heltall); fremgangsmåte ControlMouseMove (avsender: TObject; Skift: TShiftState; X, Y: Heltall); fremgangsmåte ControlMouseUp (avsender: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: Heltall); privat
inReposition: boolean; oldPos: TPoint; 

Merk: Det kreves to variabler på formnivå for å markere hvis kontrollbevegelse finner sted (inReposition) og lagre kontroll av gammel stilling (oldPos).

I skjemaets OnLoad-hendelse tilordner du prosedyrer for håndtering av mushendelser til tilsvarende hendelser (for de kontrollene du vil kan flyttes / endre størrelse på):

fremgangsmåte TForm1.FormCreate (avsender: TObject); begynne
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; slutt; (* FormCreate *)

Merk: koden ovenfor muliggjør omplassering av kjøretid for knapp1, redigering1, panel1 og knapp2.

Til slutt, her er den magiske koden:

fremgangsmåteTForm1.ControlMouseDown ( Avsender: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: Heltall);begynnehvis (ChkPositionRunTime. Krysset av) OG
(Sender er TWinControl) deretterbegynne
inReposition: = true; SetCapture (TWinControl (avsender). Håndtak); GetCursorPos (oldPos); slutt; slutt; (* ControlMouseDown *)

ControlMouseDown kort sagt: når en bruker trykker på en museknapp over en kontroll, hvis kjøretidens omplassering er aktivert (avkrysningsrute chkPositionRunTime er sjekket) og kontrollen som mottok musen nede, er avledet fra TWinControl, merk at kontrollposisjonen foregår (inReposition: = True) og sørg for at all musebehandling blir fanget for kontrollen - for å forhindre at standard "klikk" -hendelser blir Bearbeidet.

fremgangsmåteTForm1.ControlMouseMove ( Avsender: TObject; Skift: TShiftState; X, Y: Heltall);konst
minBredde = 20; minHøyde = 20; Var
newPos: TPoint; frmPoint: TPoint; begynnehvis inReposition deretterbegynnemed TWinControl (avsender) gjørebegynne
GetCursorPos (newPos); hvis ssShift i Skifte deretterbegynne//resize
Skjerm. Markør: = crSizeNWSE; frmPoint: = ScreenToClient (Mus. CursorPos); hvis frmPoint. X> minBredde deretter
Bredde: = frmPoint. X; hvis frmPoint. Y> minHøyden deretter
Høyde: = frmPoint. Y; sluttellers//movebegynne
Skjerm. Markør: = crSize; Venstre: = Venstre - gammelPos. X + newPos. X; Topp: = Topp - oldPos. Y + newPos. Y; oldPos: = newPos; slutt; slutt; slutt; slutt; (* ControlMouseMove *)

ControlMouseMove kort sagt: endre skjermmarkøren for å gjenspeile operasjonen: hvis du trykker på Shift-tasten, tillater kontrollens størrelse, eller bare flytt kontrollen til en ny posisjon (der musen skal). Merk: minWidth og minHeight konstanter gir en slags størrelsesbegrensning (minimum kontrollbredde og høyde).

Når museknappen slippes, er dra eller endre størrelse over:

fremgangsmåteTForm1.ControlMouseUp ( Avsender: TObject; Knapp: TMouseButton; Skift: TShiftState; X, Y: Heltall);begynnehvis inReposition deretterbegynne
Skjerm. Markør: = crDefault; ReleaseCapture; inReposition: = Falsk; slutt; slutt; (* ControlMouseUp *)

ControlMouseUp kort sagt: Når en bruker er ferdig med å bevege seg (eller endre størrelse på kontrollen), slipp musefangsten (for å aktivere standard klikkbehandling) og merke at omplasseringen er ferdig.

Og det gjør det! Last ned eksempelapplikasjonen og prøv selv.

Merk: En annen måte å flytte kontroller på under drift er å bruke Delphi dra og slipp relaterte egenskaper og metoder (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Dra og slipp kan brukes til å la brukere dra elementer fra en kontroll - for eksempel en listeboks eller trevisning - til en annen.

Hvordan huske kontrollposisjon og størrelse?

Hvis du lar en bruker flytte og endre størrelse på skjemakontroller, må du sørge for at kontrollplassering på en eller annen måte er lagres når skjemaet er lukket og at hver kontrolls posisjon blir gjenopprettet når skjemaet opprettes / lastes inn. Slik lagrer du Venstre, Topp, Bredde og Høyde egenskapene, for hver kontroll på et skjema, i et INN JEG fil.

Hva med åtte størrelseshåndtak?

Når du tillater en bruker å flytte og endre størrelse på kontrollene på Delphi-skjemaet, ved kjøring med musen, til etterligner designmiljøet fullt ut, bør du legge til åtte størrelseshåndtak til kontrollen skaleres.

instagram story viewer