Mutarea și redimensionarea controalelor la timpul de execuție

Iată cum puteți să trageți și să redimensionați controalele (pe un formular Delphi) cu un mouse, în timp ce aplicația rulează.

Editor de formulare la timpul de execuție

După ce ați plasat un control (componentă vizuală) pe formular, puteți ajusta poziția, dimensiunea și alte proprietăți de timp de proiectare. Cu toate acestea, există situații atunci când trebuie să permiteți unui utilizator al aplicației dvs. să repoziționeze controalele de formular și să le schimbe dimensiunea, în timpul rulării.

Pentru a activa mișcarea utilizatorului în timpul rulării și redimensionarea controalelor pe un formular cu un mouse, trei evenimente legate de mouse nevoie de manipulare specială: OnMouseDown, OnMouseMove și OnMouseUp.

În teorie, să spunem că doriți să permiteți unui utilizator să mute (și să redimensionați) un control de buton, cu un mouse, în timpul rulării. În primul rând, gestionați evenimentul OnMouseDown pentru a permite utilizatorului să „apuce” butonul. Apoi, evenimentul OnMouseMove ar trebui să repoziționeze (mute, trageți) butonul. În cele din urmă, OnMouseUp ar trebui să termine operația de mutare.

instagram viewer

Glisarea și redimensionarea controalelor formularului în practică

În primul rând, aruncați mai multe controale pe un formular. Dispuneți de un CheckBox pentru a activa sau dezactiva deplasarea și redimensionarea controalelor în timpul rulării.

Apoi, definiți trei proceduri (în interfață secțiunea declarației de formular) care va gestiona evenimentele mouse-ului așa cum este descris mai sus:

tip
TForm1 = clasă(TForm)... procedură ControlMouseDown (Expeditor: TObject; Buton: TMouseButton; Shift: TShiftState; X, Y: Integer); procedură ControlMouseMove (expeditor: TObject; Shift: TShiftState; X, Y: Integer); procedură ControlMouseUp (Expeditor: TObject; Buton: TMouseButton; Shift: TShiftState; X, Y: Integer); privat
inRepozitie: booleana; oldPos: TPoint; 

Notă: Două variabile de nivel de formă sunt necesare pentru a marca dacă mișcarea controlului are loc (inReposition) și pentru a stoca controlul poziției vechi (oldPos).

În evenimentul OnLoad al formularului, alocați proceduri de gestionare a evenimentelor mouse-ului la evenimentele corespunzătoare (pentru acele controale pe care doriți să le poți trage / redimensiona):

procedură TForm1.FormCreate (Expeditor: TObject); începe
Button1.OnMouseDown: = ControlMouseDown; Button1.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; Sfârșit; (* FormCreate *)

Notă: codul de mai sus permite repoziționarea în timp de execuție a Button1, Edit1, Panel1 și Button2.

În cele din urmă, iată codul magic:

procedurăTForm1.ControlMouseDown ( Expeditor: TObject; Buton: TMouseButton; Shift: TShiftState; X, Y: Integer);începedacă (ChkPositionRunTime. verificat) ȘI
(Expeditor este TWinControl) apoiîncepe
inReposition: = true; SetCapture (TWinControl (Sender). Handand); GetCursorPos (oldPos); Sfârșit; Sfârșit; (* ControlMouseDown *)

ControlMouseDown pe scurt: odată ce un utilizator apasă un buton de mouse peste un control, dacă reactivarea în timp de rulare este activată (caseta de selectare chkPositionRunTime este Verificat) și controlul care a primit mouse-ul în jos este chiar derivat de la TWinControl, marchează că se are loc repoziționarea controlului (inReposition: = True) și asigurați-vă că toate procesările mouse-ului sunt capturate pentru control - pentru a preveni evenimentele implicite „click” prelucrate.

procedurăTForm1.ControlMouseMove ( Expeditor: TObject; Shift: TShiftState; X, Y: Integer);const
lățime min = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; începedacă inReposition apoiîncepecu TWinControl (Expeditor) doîncepe
GetCursorPos (newPos); dacă ssShift în Schimb apoiîncepe//resize
Ecran. Cursor: = crSizeNWSE; frmPoint: = ScreenToClient (mouse. CursorPos); dacă frmPoint. X> minWththth apoi
Lățime: = frmPoint. X; dacă frmPoint. Y> minHight apoi
Înălțime: = frmPoint. Y; Sfârșitaltfel//moveîncepe
Ecran. Cursor: = crSize; Stânga: = Stânga - vechiPOS. X + newPos. X; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; Sfârșit; Sfârșit; Sfârșit; Sfârșit; (* ControlMouseMove *)

ControlMouseMove pe scurt: schimbați cursorul ecranului pentru a reflecta operația: dacă este apăsată tasta Shift, permiteți redimensionarea controlului sau pur și simplu mutați controlul într-o nouă poziție (unde merge mouse-ul). Notă: minWidth și minHeight constantele oferă un fel de restricție de dimensiune (lățimea minimă de control și înălțimea).

Când butonul mouse-ului este eliberat, glisarea sau redimensionarea s-au încheiat:

procedurăTForm1.ControlMouseUp ( Expeditor: TObject; Buton: TMouseButton; Shift: TShiftState; X, Y: Integer);începedacă inReposition apoiîncepe
Ecran. Cursor: = crDefault; ReleaseCapture; inReposition: = False; Sfârșit; Sfârșit; (* ControlMouseUp *)

ControlMouseUp pe scurt: când un utilizator a terminat de mutat (sau redimensionarea controlului), eliberați captura mouse-ului (pentru a activa prelucrarea implicită a clicurilor) și marcați că repoziționarea a fost terminată.

Și asta o face! Descărcați aplicația de probă și încercați singur.

Notă: Un alt mod de a muta controalele în timpul rulării este de a utiliza Delphi tragere și plasare proprietăți și metode conexe (DragMode, OnDragDrop, DragOver, BeginDrag etc.). Glisarea și fixarea pot fi utilizate pentru a permite utilizatorilor să tragă elemente dintr-un control - cum ar fi o casetă de listă sau o vizualizare în arbore - într-un altul.

Cum să vă amintiți poziția și dimensiunea controlului?

Dacă permiteți unui utilizator să mute și să redimensioneze controalele de formular, trebuie să vă asigurați că plasarea controlului este cumva salvat atunci când formularul este închis și că poziția fiecărui control este restabilită la crearea / încărcarea formularului. Iată cum puteți stoca proprietățile Stânga, Sus, Lățime și Înălțime, pentru fiecare control pe un formular, într-un INI fişier.

Ce zici de 8 mânere de dimensiuni?

Când permiteți unui utilizator să mute și să redimensioneze controalele pe formularul Delphi, în timpul rulării folosind mouse-ul, să imitați în totalitate mediul de proiectare, ar trebui să adăugați opt mânere de dimensiune controlului fiind redimensionate.