Pomicanje i promjena veličine kontrole u vremenu rada

Evo kako omogućiti povlačenje i mijenjanje kontrola (na Delphi obliku) mišem dok se aplikacija izvodi.

Uređivač obrasca u vrijeme izvođenja

Nakon što na obrazac stavite kontrolu (vizualnu komponentu), možete prilagoditi njegov položaj, veličinu i druga svojstva vremena dizajna. Međutim, postoje situacije kada trebate dopustiti korisniku vaše aplikacije da repozicionira kontrole obrasca i promijeni njihovu veličinu u vrijeme izvođenja.

Kako biste omogućili kretanje korisnika tijekom rada i mijenjanje veličine kontrola na obrascu pomoću miša, tri događaji povezani s mišem trebaju posebno rukovanje: OnMouseDown, OnMouseMove i OnMouseUp.

Teoretski, recimo da želite omogućiti korisniku da u toku rada pomiče (i mijenja veličinu) tipku s mišem. Prvo, vi upravljate događajem OnMouseDown da biste omogućili korisniku da "zgrabi" gumb. Zatim bi OnMouseMove događaj trebao ponovo postaviti (pomaknuti, povući) gumb. Napokon, OnMouseUp bi trebao završiti operaciju premještanja.

Povlačenje i mijenjanje kontrola oblika u praksi

instagram viewer

Prvo, ispustite nekoliko kontrola na obrazac. Imajte CheckBox da biste omogućili ili onemogućili pomicanje i mijenjanje veličine kontrola u vrijeme izvođenja.

Zatim definirajte tri postupka (u sučelje odjeljak izjave obrasca) koji će upravljati mišim događajima kako je gore opisano:

tip
TForm1 = klasa(TForm)... postupak ControlMouseDown (Pošiljalac: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer); postupak ControlMouseMove (pošiljalac: TObject; Shift: TShiftState; X, Y: Integer); postupak ControlMouseUp (pošiljalac: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer); privatna
inReposition: boolean; oldPos: TPoint; 

Napomena: Potrebne su dvije varijable na razini obrasca za označavanje ako se odvija nadzorno kretanje (inReposition) i za spremanje stare pozicije (oldPos).

U slučaju OnLoad obrasca, dodijelite postupke rukovanja događajima miša odgovarajućim događajima (za one kontrole koje želite povući / promijeniti veličinu):

postupak TForm1.FormCreate (pošiljalac: TObject); početi
Gumb1.OnMouseDown: = ControlMouseDown; Gumb1.OnMouseMove: = ControlMouseMove; Gumb1.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; kraj; (* FormCreate *)

Napomena: gore navedeni kôd omogućuje repozicioniranje gumba1, Edit1, Panel1 i Button2 tijekom rada.

Na kraju, evo čarobnog koda:

postupakTForm1.ControlMouseDown ( Pošiljalac: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer);početiako (ChkPositionRunTime. Provjereno) I
(pošiljatelja je TWinControl) zatimpočeti
inReposition: = True; SetCapture (TWinControl (Pošiljatelj) .Handle); GetCursorPos (stariPos); kraj; kraj; (* ControlMouseDown *)

ControlMouseDown ukratko: kad korisnik pritisne tipku miša nad upravljačkom tipkom, ako je omogućeno repozicioniranje vremena (potvrdni okvir) chkPositionRunTime je označeno), a kontrola koja je čak prebacila miš i potječe od TWinControl, označite da se odvija repozicioniranje kontrole (inReposition: = True) i provjerite je li sva obrada miša zarobljena za kontrolu - kako bi se spriječilo da zadani "klik" događaji ne budu obrađen.

postupakTForm1.ControlMouseMove ( Pošiljalac: TObject; Shift: TShiftState; X, Y: Integer);const
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; početiako inReposition zatimpočetis TWinControl (pošiljalac) činipočeti
GetCursorPos (newPos); ako ssShift u smjena zatimpočeti//resize
Zaslon. Kursor: = crSizeNWSE; frmPoint: = ScreenToClient (miš). CursorPos); ako frmPoint. X> minWidth zatim
Širina: = frmPoint. X; ako frmPoint. Y> min Visina zatim
Visina: = frmPoint. Y; krajdrugo//movepočeti
Zaslon. Kursor: = crSize; Lijevo: = Lijevo - stariPos. X + noviPos. X; Vrh: = Vrh - stariPos. Y + newPos. Y; oldPos: = newPos; kraj; kraj; kraj; kraj; (* ControlMouseMove *)

ControlMouseMove ukratko: promijenite pokazivač zaslona da bi odražavao operaciju: ako je pritisnuta tipka Shift, dozvolite promjenu veličine kontrole ili jednostavno premjestite kontrolu u novo mjesto (kamo miš ide). Bilješka: minWidth i minHeight konstante pružaju svojevrsno ograničenje veličine (minimalna kontrolna širina i visina).

Nakon otpuštanja gumba miša, povlačenje ili mijenjanje veličine je gotov:

postupakTForm1.ControlMouseUp ( Pošiljalac: TObject; Gumb: TMouseButton; Shift: TShiftState; X, Y: Integer);početiako inReposition zatimpočeti
Zaslon. Kursor: = crDefault; ReleaseCapture; inReposition: = Lažno; kraj; kraj; (* ControlMouseUp *)

ControlMouseUp ukratko: kad korisnik završi premještanje (ili mijenjanje veličine kontrole) otpustite snimanje miša (kako bi se omogućila zadana obrada klikova) i označite da je repozicioniranje završeno.

I to radi! Preuzmite primjerak aplikacije i pokušajte sami.

Napomena: Drugi način za pomicanje kontrola u vrijeme izvođenja je korištenje Delphija povuci i spusti povezana svojstva i metode (DragMode, OnDragDrop, DragOver, BeginDrag itd.). Povlačenjem i ispuštanjem može se koristiti kako bi korisnici povukli stavke iz jedne kontrole - poput okvira s popisom ili stabla - u drugu.

Kako zapamtiti kontrolni položaj i veličinu?

Ako korisniku dopustite pomicanje i promjenu veličine kontrola obrasca, morate osigurati da se položaj kontrole na neki način sprema se kada je obrazac zatvoren i da se položaj svake kontrole vraća kada se kreira / učita. Evo kako pohraniti svojstva lijeve, gornje, širine i visine za svaku kontrolu na obrascu u INI datoteka.

Kako je s ručkama od 8 veličina?

Kad korisniku dopustite da premjesti i promijeni veličinu kontrola na obrascu Delphi, tijekom rada pomoću miša, na U potpunosti oponašaju dizajn-vremensko okruženje, dodajte ručicama od osam veličina upravljačkom tijelu mijenjati.

instagram story viewer