Valdymo elementų perkėlimas ir dydžio keitimas vykdymo metu

Štai kaip įgalinti valdiklių vilkimą ir dydžio keitimą („Delphi“ formoje) pele, kol programa veikia.

Formos redaktorius „Run-Time“

Įdėję formos valdiklį (vaizdinį komponentą), galite pakoreguoti jo vietą, dydį ir kitas projektavimo laiko ypatybes. Vis dėlto yra situacijų, kai turite leisti savo programos vartotojui perjungti formos valdiklius ir pakeisti jų dydį vykdymo metu.

Norėdami įjungti runtime vartotojo judėjimą ir pakeisdami formos valdiklių dydį pele, trys su pele susiję įvykiai reikia specialaus tvarkymo: „OnMouseDown“, „OnMouseMove“ ir „OnMouseUp“.

Teoriškai tarkime, kad norite vartotojui leisti perjungti (ir pakeisti jo dydį) mygtuko valdymą pele. Pirmiausia tvarkykite „OnMouseDown“ įvykį, kad vartotojas galėtų „patraukti“ mygtuką. Tada „OnMouseMove“ įvykis turėtų pakeisti (perkelti, vilkti) mygtuką. Galiausiai „OnMouseUp“ turėtų baigti perkėlimo operaciją.

Formos valdiklių tempimas ir dydžio keitimas praktikoje

Pirmiausia įmeskite kelis formos valdiklius. Turėkite žymės langelį, kad įjungtumėte arba išjungtumėte valdymo elementų perkėlimą ir dydžio pakeitimą vykdymo metu.

instagram viewer

Toliau apibrėžkite tris procedūras ( sąsaja formos deklaracijos skiltis), kuri tvarkys pelės įvykius, kaip aprašyta aukščiau:

tipo
TForm1 = klasė(TForm)... procedūra „ControlMouseDown“ (Siuntėjas: „TObject“; Mygtukas: „TMouseButton“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius); procedūra „ControlMouseMove“ (Siuntėjas: „TObject“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius); procedūra „ControlMouseUp“ (Siuntėjas: „TObject“; Mygtukas: „TMouseButton“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius); privatus
inReposition: boolean; „oldPos“: „TPoint“; 

Pastaba: norint pažymėti, ar vyksta valdymo judesys, reikia dviejų formos lygio kintamųjų (inRepozicija) ir laikyti seną valdymo vietą (oldPos).

Formos „OnLoad“ įvykyje priskirkite pelės įvykių tvarkymo procedūras atitinkamiems įvykiams (tiems valdikliams, kuriuos norite vilkti / keisti dydį):

procedūra TForm1.FormCreate (Siuntėjas: TObject); prasideda
Mygtukas1.OnMouseDown: = „ControlMouseDown“; Mygtukas1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; „Edit1.OnMouseDown“: = „ControlMouseDown“; „Edit1.OnMouseMove“: = „ControlMouseMove“; „Edit1.OnMouseUp“: = „ControlMouseUp“; Skydas1.OnMouseDown: = „ControlMouseDown“; Skydas1.OnMouseMove: = ControlMouseMove; Skydas1.OnMouseUp: = „ControlMouseUp“; Mygtukas2.OnMouseDown: = ControlMouseDown; Mygtukas2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = „ControlMouseUp“; galas; (* „FormCreate“ *)

Pastaba: aukščiau pateiktas kodas įgalina „Button1“, „Edit1“, „Panel1“ ir „Button2“ pakeitimą vykdymo laiku.

Galiausiai, štai stebuklingas kodas:

procedūraTForm1.ControlMouseDown ( Siuntėjas: „TObject“; Mygtukas: „TMouseButton“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius);prasidedajei („chkPositionRunTime“). Patikrinta) IR
(Siuntėjas yra „TWinControl“) tadaprasideda
inReposition: = Tiesa; „SetCapture“ („TWinControl“ (siuntėjas). Rankena); „GetCursorPos“ („oldPos“); galas; galas; (* „ControlMouseDown“ *)

„ControlMouseDown“ Trumpai tariant: vartotojui paspaudus pelės mygtuką per valdiklį, jei įjungta laiko keitimo padėtis (žymimasis langelis „chkPositionRunTime“ yra patikrinta), o valdiklis, kuris net pelę žemyn nukreipė, yra gautas iš „TWinControl“, pažymėkite, kad vyksta valdymo perkėlimas („inReposition: = True“) ir įsitikinkite, kad visas pelės apdorojimas yra užfiksuotas kontrolei - kad būtų išvengta numatytųjų „paspaudimų“ įvykių. perdirbti.

procedūra„TForm1.ControlMouseMove“ ( Siuntėjas: „TObject“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius);const
minPlatumas = 20; minAukštis = 20; var
newPos: TPoint; „frmPoint“: „TPoint“; prasidedajei inRepozicija tadaprasidedasu „TWinControl“ (siuntėjas) darytiprasideda
„GetCursorPos“ („newPos“); jei ssShift į Pamaina tadaprasideda//resize
Ekranas. Žymeklis: = crSizeNWSE; frmPoint: = ScreenToClient (pelė. CursorPos); jei „frmPoint“. X> minWidth tada
Plotis: = frmPoint. X; jei „frmPoint“. Y> minHeight tada
Aukštis: = frmPoint. Y; galasKitas//moveprasideda
Ekranas. Žymeklis: = crSize; Kairė: = Kairė - „oldPos“. „X + newPos“. X; Viršuje: = Viršuje - senasPos. Y + newPos. Y; oldPos: = newPos; galas; galas; galas; galas; (* „ControlMouseMove *“)

„ControlMouseMove“ Trumpai tariant: pakeiskite ekrano žymeklį, kad jis atspindėtų operaciją: jei paspaudžiate klavišą „Shift“, leiskite valdymo elemento dydį pakeisti, arba tiesiog perkelkite valdiklį į naują vietą (ten, kur eina pelė). Pastaba: min. plotis ir minAukštis konstantos suteikia tam tikrą dydžio apribojimą (mažiausias valdymo plotis ir aukštis).

Atleidus pelės mygtuką, vilkite arba keičiate dydį:

procedūraTForm1.ControlMouseUp ( Siuntėjas: „TObject“; Mygtukas: „TMouseButton“; „Shift“: „TShiftState“; X, Y: sveikasis skaičius);prasidedajei inRepozicija tadaprasideda
Ekranas. Žymeklis: = crDefault; „ReleaseCapture“; inRepozicija: = klaidinga; galas; galas; (* „ControlMouseUp“ *)

„ControlMouseUp“ Trumpai tariant: kai vartotojas baigia judėti (arba keičia valdiklį), paleiskite pelės fiksavimą (kad būtų galima įjungti numatytąjį paspaudimų apdorojimą) ir pažymėkite, kad perkėlimas baigtas.

Ir tai daro! Atsisiųskite programos pavyzdį ir išbandykite patys.

Pastaba: Kitas būdas perkelti valdiklius vykdymo metu yra naudoti „Delphi“ vilk ir numesk susijusios savybės ir metodai („DragMode“, „OnDragDrop“, „DragOver“, „BeginDrag“ ir kt.). Nuvilkimas gali būti naudojamas norint leisti vartotojams vilkti elementus iš vieno valdiklio, pvz., Sąrašo laukelio ar medžio rodinio, į kitą.

Kaip atsiminti valdymo padėtį ir dydį?

Jei leidžiate vartotojui perkelti formos dydį ir pakeisti jo dydį, turite įsitikinti, kad valdymo vieta yra kažkokia išsaugomi uždarius formą ir kad kuriant / įkeliant formą kiekvienos valdiklio padėtis būtų atkurta. Štai kaip išsaugoti kiekvienos formos valdiklio kairiojo, viršutinio, pločio ir aukščio savybes INI byla.

Kaip apie 8 dydžio rankenas?

Kai leidžiate vartotojui perkelti ir pakeisti jo dydį „Delphi“ forma, vykdymo metu naudojant pelę, į visiškai imituodami projektavimo laiko aplinką, prie valdymo būklės turėtumėte pridėti aštuonių dydžių rankenas pakeistas dydis.