Premikanje in spreminjanje velikosti kontrol v času izvajanja

Tukaj je opisano, kako med miško omogočite vlečenje in spreminjanje velikosti kontrol (na obrazcu Delphi) z miško.

Urejevalnik obrazcev med izvajanjem

Ko na obrazec postavite nadzor (vizualno komponento), lahko prilagodite njegov položaj, velikost in druge lastnosti oblikovanja. Vendar pa obstajajo situacije, ko morate uporabniku svoje aplikacije dovoliti, da v času izvajanja spreminja kontrolnike obrazca in spreminja njihovo velikost.

Če želite omogočiti gibanje uporabnika izvajalca in spreminjanje velikosti kontrol na obrazcu z miško, tri dogodki, povezani z miško potrebujejo posebno ravnanje: OnMouseDown, OnMouseMove in OnMouseUp.

Teoretično povejmo, da želite uporabniku omogočiti, da med izvajanjem premika (in spreminja velikost) gumba z miško. Najprej upravljate dogodek OnMouseDown, da uporabniku omogočite, da "zagrabi" gumb. Nato mora dogodek OnMouseMove prestaviti (premakniti, povleči) gumb. Končno naj bi OnMouseUp končal premikanje.

Vlečenje in spreminjanje velikosti nadzora obrazcev v praksi

instagram viewer

Najprej na obrazcu spustite več kontrolnikov. Naj bo CheckBox omogočen ali onemogočil premikanje in spreminjanje velikosti kontrol med izvajanjem.

Nato določite tri postopke (v vmesnik oddelek izjave obrazca), ki bo obravnaval dogodke z miško, kot je opisano zgoraj:

tip
TForm1 = razred(TForm)... postopek ControlMouseDown (Pošiljatelj: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer); postopek ControlMouseMove (Pošiljatelj: TObject; Shift: TShiftState; X, Y: Integer); postopek ControlMouseUp (Pošiljatelj: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer); zasebno
inReposition: boolean; oldPos: TPoint; 

Opomba: Če se izvaja nadzorno gibanje, sta potrebni dve spremenljivki ravni obrazca (inRepozicija) in shranite nadzor starega položaja (stariPos).

V dogodku OnLoad obrazca dodelite postopke ravnanja z miško ustreznim dogodkom (za tiste elemente nadzora, ki jih želite vleči / spremeniti):

postopek TForm1.FormCreate (Pošiljatelj: TObject); začeti
Gumb1.OnMouseDown: = ControlMouseDown; Gumb1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Gumb2.OnMouseDown: = ControlMouseDown; Gumb2.OnMouseMove: = ControlMouseMove; Gumb2.OnMouseUp: = ControlMouseUp; konec; (* FormCreate *)

Opomba: zgornja koda omogoča repozicioniranje gumbov1, Edit1, Panel1 in Button2 med izvajanjem.

Za konec pa še čarovniška koda:

postopekTForm1.ControlMouseDown ( Pošiljatelj: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer);začetiče (chkPositionRunTime Preverjeno) IN
(Pošiljatelj je TWinControl) torejzačeti
inReposition: = Res; SetCapture (TWinControl (Pošiljatelj) .Handle); GetCursorPos (stariPos); konec; konec; (* ControlMouseDown *)

ControlMouseDown skratka: ko uporabnik pritisne gumb miške nad krmilno enoto, če je omogočeno repozicijo med izvajanjem (potrditveno polje) chkPositionRunTime je preverjeno) in kontrolnik, ki je celo prejel miško navzdol, izvira iz TWinControl, označite, da se nadzorni položaj nahaja (inReposition: = True) in se prepričajte, da je vsa kontrola miške zajeta za nadzor - da preprečite, da bi privzeti dogodki "klik" postali predelano.

postopekTForm1.ControlMouseMove ( Pošiljatelj: TObject; Shift: TShiftState; X, Y: Integer);konst
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; začetiče inRepozicija torejzačetis TWinControl (pošiljatelj) storizačeti
GetCursorPos (newPos); če ssShift v Shift torejzačeti//resize
Zaslon. Kazalec: = crSizeNWSE; frmPoint: = ScreenToClient (miška. CursorPos); če frmPoint. X> minWidth torej
Širina: = frmPoint X; če frmPoint. Y> minHeight torej
Višina: = frmPoint Y; konecdrugače//movezačeti
Zaslon. Kazalec: = crSize; Levo: = Levo - stariPos. X + novPos. X; Na vrh: = Na vrh - stariPos. Y + novPos. Y; oldPos: = newPos; konec; konec; konec; konec; (* ControlMouseMove *)

ControlMouseMove na kratko: spremenite kazalec zaslona, ​​da odraža postopek: če pritisnete tipko Shift, omogočite spreminjanje velikosti nadzora ali preprosto premaknite nadzor v nov položaj (kamor gre miška). Opomba: minWidth in min Višina konstante zagotavljajo neke vrste omejitev velikosti (najmanjša kontrolna širina in višina).

Ko se sprosti gumb miške, se vlečenje ali spreminjanje velikosti konča:

postopekTForm1.ControlMouseUp ( Pošiljatelj: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer);začetiče inRepozicija torejzačeti
Zaslon. Kazalec: = crDefault; ReleaseCapture; inReposition: = Lažno; konec; konec; (* ControlMouseUp *)

ControlMouseUp na kratko: ko uporabnik konča premikanje (ali spreminjanje velikosti nadzora), sprostite zajem miške (da omogočite privzeto obdelavo klikov) in označite, da je repozicija končana.

In to stori! Prenesite vzorčno aplikacijo in poskusite sami.

Opomba: Drug način premikanja kontrolnikov med izvajanjem je uporaba Delphi-jev povleci in spusti povezane lastnosti in metode (DragMode, OnDragDrop, DragOver, BeginDrag itd.). S pomočjo vlečenja in spuščanja lahko uporabniki vlečejo predmete iz enega elementa - na primer seznam s seznamom ali pogled na drevo - v drugega.

Kako si zapomniti kontrolni položaj in velikost?

Če uporabniku dovolite premikanje in spreminjanje velikosti kontrol obrazca, morate zagotoviti, da je umestitev nadzora nekako se shrani, ko je obrazec zaprt in da se ob vsakem ustvarjanju / nalaganju obrazca pozicija vsakega kontrolnika obnovi. Tukaj je opisano, kako shranite lastnosti Leva, Vrh, Širina in Višina za vsak nadzor na obrazcu v INI mapa.

Kaj pa 8 ročajev velikosti?

Ko uporabniku dovolite premikanje in spreminjanje velikosti kontrol na obrazcu Delphi, med izvajanjem z miško, na Če popolnoma oponašate oblikovalsko okolje, morate krmilu dodati osem ročajev velikosti spremenjena velikost.

instagram story viewer