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