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