Zde je návod, jak povolit přetažení a změnu velikosti ovládacích prvků (ve formuláři Delphi) myší, zatímco je aplikace spuštěna.
Editor formulářů za běhu
Jakmile do formuláře umístíte ovládací prvek (vizuální součást), můžete upravit jeho polohu, velikost a další vlastnosti návrhu. Existují však situace, kdy musíte uživateli aplikace umožnit přemístit ovládací prvky formuláře a změnit jejich velikost za běhu.
Chcete-li povolit běh uživatele a změnu velikosti ovládacích prvků ve formuláři pomocí myši, tři události související s myší vyžadují zvláštní zacházení: OnMouseDown, OnMouseMove a OnMouseUp.
Teoreticky řekněme, že chcete uživateli umožnit pohybovat (a měnit velikost) ovládacího tlačítka pomocí myši za běhu. Nejprve zpracováte událost OnMouseDown a umožníte uživateli, aby tlačítko chytil. Dále by měla událost OnMouseMove přemístit (přesunout, přetáhnout) tlačítko. Nakonec by měl OnMouseUp dokončit operaci přesunu.
Přetahování a změna velikosti ovládacích prvků formuláře v praxi
Nejprve přetáhněte několik ovládacích prvků do formuláře. Zaškrtněte políčko pro povolení nebo zakázání ovládacích prvků pro pohyb a změnu velikosti za běhu.
Dále definujte tři postupy (v rozhraní část formuláře prohlášení), která bude zpracovávat události myši, jak je popsáno výše:
typ TForm1 = třída(TForm)... postup ControlMouseDown (odesílatel: TObject; Tlačítko: TMouseButton; Shift: TShiftState; X, Y: celé číslo); postup ControlMouseMove (odesílatel: TObject; Shift: TShiftState; X, Y: celé číslo); postup ControlMouseUp (odesílatel: TObject; Tlačítko: TMouseButton; Shift: TShiftState; X, Y: celé číslo); soukromé inReposition: boolean; oldPos: TPoint;
Poznámka: Jsou-li prováděny kontrolní pohyby, jsou vyžadovány dvě proměnné úrovně formuláře (inReposition) a uložit starou pozici ovládání (oldPos).
V události OnLoad ve formuláři přiřaďte procedury zpracování událostí myši odpovídajícím událostem (pro ty ovládací prvky, které chcete změnit a změnit jejich velikost):
postup TForm1.FormCreate (Sender: TObject); začít 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; konec; (* FormCreate *)
Poznámka: výše uvedený kód umožňuje změnu doby spuštění tlačítek Button1, Edit1, Panel1 a Button2.
Konečně, tady je magický kód:
postupTForm1.ControlMouseDown ( Odesílatel: TObject; Tlačítko: TMouseButton; Shift: TShiftState; X, Y: celé číslo);začít-li (chkPositionRunTime. Kontrolovány) A (Odesílatel je TWinControl) pakzačít inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); konec; konec; (* ControlMouseDown *)
ControlMouseDown zkrátka: jakmile uživatel stiskne tlačítko myši nad ovládacím prvkem, pokud je povoleno přemístění za běhu (zaškrtávací políčko chkPositionRunTime je zaškrtnuto) a ovládací prvek, který myš dokonce dostal, je odvozen od TWinControl, což znamená, že probíhá změna polohy (inReposition: = True) a ujistěte se, že pro ovládání je zachyceno veškeré zpracování myši - abyste zabránili tomu, aby se zobrazovaly výchozí události „click“ zpracovány.
postupTForm1.ControlMouseMove ( Odesílatel: TObject; Shift: TShiftState; X, Y: celé číslo);konst minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; začít-li inReposition pakzačíts TWinControl (odesílatel) dělatzačít GetCursorPos (newPos); -li ssShift v Posun pakzačít//resize Obrazovka. Kurzor: = crSizeNWSE; frmPoint: = ScreenToClient (Myš. CursorPos); -li frmPoint. X> minWidth pak Šířka: = frmPoint. X; -li frmPoint. Y> minHeight pak Výška: = frmPoint. Y; konecjiný//movezačít Obrazovka. Kurzor: = crSize; Vlevo: = Vlevo - staréPos. X + newPos. X; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; konec; konec; konec; konec; (* ControlMouseMove *)
ControlMouseMove zkrátka: změňte kurzor obrazovky tak, aby odrážel operaci: pokud stisknete klávesu Shift, umožníte změnu velikosti ovládacího prvku nebo jednoduše přesuňte ovládací prvek do nové polohy (kam směřuje myš). Poznámka: minWidth a minHeight konstanty poskytují určitý druh omezení velikosti (minimální šířka a výška kontroly).
Po uvolnění tlačítka myši je přetažení nebo změna velikosti ukončena:
postupTForm1.ControlMouseUp ( Odesílatel: TObject; Tlačítko: TMouseButton; Shift: TShiftState; X, Y: celé číslo);začít-li inReposition pakzačít Obrazovka. Kurzor: = crDefault; ReleaseCapture; inReposition: = False; konec; konec; (* ControlMouseUp *)
ControlMouseUp zkrátka: když uživatel dokončil přesun (nebo změnil velikost ovládacího prvku), uvolněte zachycení myši (pro umožnění výchozího zpracování kliknutí) a označte, že je přemístění dokončeno.
A to dělá! Stáhněte si ukázkovou aplikaci a zkuste to sami.
Poznámka: Dalším způsobem, jak přesunout ovládací prvky za běhu, je použití Delphi drag and drop související vlastnosti a metody (DragMode, OnDragDrop, DragOver, BeginDrag atd.). Přetažení a přetažení lze použít k tomu, aby uživatelé mohli přetahovat položky z jednoho ovládacího prvku - například ze seznamu nebo stromového zobrazení - do jiného.
Jak si zapamatovat kontrolní polohu a velikost?
Pokud dovolíte uživateli přesunout a změnit velikost ovládacích prvků formuláře, musíte zajistit, aby umístění ovládacího prvku bylo nějakým způsobem uložen, když je formulář uzavřen a že pozice každého ovládacího prvku je obnovena, když je formulář vytvořen / načten. Zde je návod, jak uložit vlastnosti Levý, Horní, Šířka a Výška pro každou kontrolu ve formuláři do INI soubor.
Jak asi 8 úchyty velikosti?
Když dovolíte uživateli přesunout a změnit velikost ovládacích prvků ve formuláři Delphi, za běhu pomocí myši, na plně napodobují prostředí návrhu, měli byste k ovládacímu prvku přidat úchyty osmi velikostí změněna velikost.