Vadības ierīču pārvietošana un izmēru maiņa izpildes laikā

Tālāk parādīts, kā ar peli iespējot vadības ierīču vilkšanu un izmēru maiņu (uz Delphi veidlapas), kamēr lietojumprogramma darbojas.

Veidlapu redaktors izpildes laikā

Kad veidlapā ir ievietota vadības ierīce (vizuālais komponents), jūs varat pielāgot tās pozīciju, izmēru un citas dizaina laika īpašības. Tomēr ir situācijas, kad jums ir jāļauj savas lietojumprogrammas lietotājam izpildes laikā pārvietot veidlapu vadīklas un mainīt to lielumu.

Lai iespējotu izpildlaika lietotāja pārvietošanos un formas mainīšanu ar peli, trīs veidlapas ar peli saistīti notikumi nepieciešama īpaša apstrāde: OnMouseDown, OnMouseMove un OnMouseUp.

Teorētiski pieņemsim, ka vēlaties ļaut lietotājam ar peli peles laikā pārvietot (un mainīt tā lielumu) pogas vadību. Pirmkārt, jūs apstrādājat OnMouseDown notikumu, lai lietotājs varētu "satvert" pogu. Tālāk OnMouseMove notikumam vajadzētu pārvietot (pārvietot, vilkt) pogu. Visbeidzot, OnMouseUp jāpabeidz pārvietošanas darbība.

Veidlapu kontroles vilkšana un izmēru maiņa praksē

instagram viewer

Pirmkārt, nometiet veidlapā vairākas vadības ierīces. Ja jums ir rūtiņa, lai ieslēgtu vai atspējotu vadības ierīču pārvietošanu un izmēru maiņu izpildes laikā.

Pēc tam definējiet trīs procedūras ( saskarne veidlapas deklarācijas sadaļa), kurā tiks apstrādāti peles notikumi, kā aprakstīts iepriekš:

tips
TForm1 = klase(TForm)... procedūra ControlMouseDown (Sūtītājs: TObject; Poga: TMouseButton; Shift: TShiftState; X, Y: vesels skaitlis); procedūra ControlMouseMove (Sūtītājs: TObject; Shift: TShiftState; X, Y: vesels skaitlis); procedūra ControlMouseUp (Sūtītājs: TObject; Poga: TMouseButton; Shift: TShiftState; X, Y: vesels skaitlis); Privāts
inReposition: Būla; oldPos: TPoint; 

Piezīme. Lai atzīmētu, vai notiek vadības kustība, ir nepieciešami divi formas līmeņa mainīgie (inReposition) un uzglabāt vadības veco pozīciju (oldPos).

Veidlapas OnLoad notikumā attiecīgajiem notikumiem piešķiriet peles notikumu apstrādes procedūras (tām vadīklām, kuras vēlaties vilkt / mainīt izmērus):

procedūra TForm1.FormCreate (Sūtītājs: TObject); sākt
Poga1.OnMouseDown: = ControlMouseDown; Poga1.OnMouseMove: = ControlMouseMove; Poga1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panelis1.OnMouseDown: = ControlMouseDown; Panelis1.OnMouseMove: = ControlMouseMove; Panelis1.OnMouseUp: = ControlMouseUp; Poga2.OnMouseDown: = ControlMouseDown; Poga2.OnMouseMove: = ControlMouseMove; Poga2.OnMouseUp: = ControlMouseUp; beigas; (* FormCreate *)

Piezīme: iepriekš minētais kods ļauj Button1, Edit1, Panel1 un Button2 pārvietot izpildes laikā.

Visbeidzot, šeit ir burvju kods:

procedūraTForm1.ControlMouseDown ( Sūtītājs: TObject; Poga: TMouseButton; Shift: TShiftState; X, Y: vesels skaitlis);sāktja (chkPositionRunTime. Pārbaudīts) UN
(Sūtītājs ir TWinControl) tadsākt
inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); beigas; beigas; (* ControlMouseDown *)

ControlMouseDown īsi sakot: ja lietotājs nospiež peles pogu virs vadības ierīces, ja ir iespējota darbības laika maiņa (izvēles rūtiņa chkPositionRunTime ir pārbaudīts), un vadība, kas noņēma peli pat uz leju, ir iegūta no TWinControl, atzīmējiet, ka notiek vadības maiņa (inReposition: = True) un pārliecinieties, ka kontrolei ir uztverta visa peles apstrāde - lai novērstu noklusējuma "klikšķu" notikumus apstrādāts.

procedūraTForm1.ControlMouseMove ( Sūtītājs: TObject; Shift: TShiftState; X, Y: vesels skaitlis);const
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; sāktja inReposition tadsāktar TWinControl (sūtītājs) darītsākt
GetCursorPos (newPos); ja ssShift iekšā Maiņa tadsākt//resize
Ekrāns. Kursors: = crSizeNWSE; frmPoint: = ScreenToClient (pele. CursorPos); ja frmPoint. X> minWidth tad
Platums: = frmPoint. X; ja frmPoint. Y> minHeight tad
Augstums: = frmPoint. Y; beigascits//movesākt
Ekrāns. Kursors: = crSize; Kreisais: = Kreisais - oldPos. X + newPos. X; Augšā: = Augšējā - oldPos. Y + newPos. Y; oldPos: = newPos; beigas; beigas; beigas; beigas; (* ControlMouseMove *)

ControlMouseMove īsumā: mainiet ekrāna kursoru, lai atspoguļotu darbību: ja tiek nospiests taustiņš Shift, ļaujiet vadības lielumam mainīt izmēru vai vienkārši pārvietojiet vadības ierīci uz jaunu pozīciju (kur pele iet). Piezīme: minWidth un minHeight konstantes nodrošina sava veida lieluma ierobežojumus (minimālais vadības platums un augstums).

Pēc peles pogas atlaišanas vilkšana vai izmēra maiņa ir beigusies:

procedūraTForm1.ControlMouseUp ( Sūtītājs: TObject; Poga: TMouseButton; Shift: TShiftState; X, Y: vesels skaitlis);sāktja inReposition tadsākt
Ekrāns. Kursors: = crDefault; ReleaseCapture; inReposition: = nepatiess; beigas; beigas; (* ControlMouseUp *)

ControlMouseUp īsumā: kad lietotājs ir pabeidzis pārvietošanu (vai mainījis vadības ierīces izmērus), atlaidiet peles tveršanu (lai iespējotu noklusējuma klikšķu apstrādi) un atzīmējiet, ka pārvietošana ir pabeigta.

Un to arī dara! Lejupielādējiet lietojumprogrammas paraugu un izmēģiniet pats.

Piezīme: Vēl viens veids, kā pārvietot vadības ierīces izpildes laikā, ir izmantot Delphi vilkt un nomest saistītās īpašības un metodes (DragMode, OnDragDrop, DragOver, BeginDrag utt.). Vilkšanu un nomešanu var izmantot, lai lietotāji varētu vilkt vienumus no vienas vadības ierīces, piemēram, saraksta lodziņa vai koka skata, uz citu.

Kā atcerēties vadības pozīciju un lielumu?

Ja ļaujat lietotājam pārvietot un mainīt veidlapu vadīklas, jums jāpārliecinās, ka vadības izvietojums ir kaut kādā veidā tiek saglabāti, kad veidlapa ir aizvērta, un ka katras vadības pozīcija tiek atjaunota, kad veidlapa tiek izveidota / ielādēta. Tālāk ir norādīts, kā katrai veidlapas kontrolei saglabāt kreisās, augšējās, platuma un augstuma īpašības INI failu.

Kā ir ar 8 izmēra rokturiem?

Kad atļaujat lietotājam pārvietot un mainīt izmērus Delphi veidlapā, izpildes laikā, izmantojot peli, uz pilnībā imitējot projektēšanas laika vidi, jums vadības panelim vajadzētu pievienot astoņu izmēru rokturus mainīts.