Így engedélyezheti a vezérlők húzását és átméretezését (Delphi űrlapon) egérrel, amíg az alkalmazás fut.
Űrlapszerkesztő futási időben
Miután elhelyezett egy vezérlőelemet (vizuális elem) az űrlapra, módosíthatja annak helyzetét, méretét és más tervezési idő tulajdonságait. Vannak olyan helyzetek, amikor engedélyeznie kell az alkalmazás egyik felhasználójának, hogy az űrlapvezérlőket áthelyezzék, és futás közben megváltoztassák azok méretét.
Három, az űrlapon futó felhasználói mozgás és a vezérlők átméretezésének lehetővé tétele érdekében egérrel kapcsolatos események speciális kezelésre van szükség: OnMouseDown, OnMouseMove és OnMouseUp.
Elméletileg mondjuk azt, hogy engedélyezni szeretné a felhasználót, hogy futtatás közben (egérrel) mozgatja (és átméretezze) egy gombvezérlőt. Először kezeli az OnMouseDown eseményt, hogy a felhasználó "megragadja" a gombot. Ezután az OnMouseMove eseménynek át kell helyeznie (mozgatni, húzza) a gombot. Végül az OnMouseUp-nak be kell fejeznie az áthelyezési műveletet.
Az űrlapvezérlők húzása és átméretezése a gyakorlatban
Először dobjon el néhány vezérlőt egy űrlapra. Ha van egy jelölőnégyzete, akkor engedélyezheti vagy letilthatja a vezérlők mozgatását és átméretezését futás közben.
Ezután definiáljon három eljárást (a felület az űrlapnyilatkozat szakaszát), amely az előzőekben ismertetett egér eseményekkel foglalkozik:
típus TForm1 = osztály(TForm)... eljárás ControlMouseDown (Feladó: TObject; Gomb: TMouseButton; Shift: TShiftState; X, Y: egész szám); eljárás ControlMouseMove (Feladó: TObject; Shift: TShiftState; X, Y: egész szám); eljárás ControlMouseUp (Feladó: TObject; Gomb: TMouseButton; Shift: TShiftState; X, Y: egész szám); magán inReposition: logikai; oldPos: TPoint;
Megjegyzés: A vezérlőmozgás megjelöléséhez két alakszintű változó szükséges (inReposition) és a vezérlő régi helyzetének tárolására (oldPos).
Az űrlap OnLoad eseményében rendelje hozzá az egér eseménykezelési eljárásait a megfelelő eseményekhez (azokhoz a vezérlőkhöz, amelyeket húzni / átméretezni szeretne):
eljárás TForm1.FormCreate (küldő: TObject); kezdődik 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; vég; (* FormCreate *)
Megjegyzés: A fenti kód lehetővé teszi a Button1, Edit1, Panel1 és Button2 futásidejű áthelyezését.
Végül itt van a varázskód:
eljárásTForm1.ControlMouseDown ( Feladó: TObject; Gomb: TMouseButton; Shift: TShiftState; X, Y: egész szám);kezdődikha (ChkPositionRunTime. Kockás) ÉS (Feladó jelentése TWinControl) azutánkezdődik inReposition: = True; SetCapture (TWinControl (feladó) .kezelés); GetCursorPos (oldPos); vég; vég; (* ControlMouseDown *)
ControlMouseDown Röviden: ha a felhasználó egy egérgombot nyom meg egy vezérlő felett, ha a futási idő áthelyezése engedélyezve van (jelölőnégyzet) chkPositionRunTime ellenőrizve van), és az az egér lefelé vett vezérlő a TWinControl-ból származik, jelölje meg, hogy a vezérlés áthelyezése zajlik (inReposition: = True) és ellenőrizze, hogy az egér minden feldolgozása be van-e állítva a vezérlés érdekében - az alapértelmezett kattintási események megakadályozása érdekében feldolgozott.
eljárásTForm1.ControlMouseMove ( Feladó: TObject; Shift: TShiftState; X, Y: egész szám);const minSzélesség = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; kezdődikha inReposition azutánkezdődikval vel TWinControl (feladó) csinálkezdődik GetCursorPos (newPos); ha ssShift ban ben Váltás azutánkezdődik//resize Képernyő. Kurzor: = crSizeNWSE; frmPoint: = ScreenToClient (egér. CursorPos); ha frmPoint. X> minSzélesség azután Szélesség: = frmPoint. X; ha frmPoint. Y> minHeight azután Magasság: = frmPoint. Y; végmás//movekezdődik Képernyő. Kurzor: = crSize; Balra: = Balra - oldPos. X + newPos. X; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; vég; vég; vég; vég; (* ControlMouseMove *)
ControlMouseMove Röviden: változtassa meg a képernyőkurzort, hogy az tükrözze a műveletet: ha a Shift gombot megnyomja, engedje meg a vezérlés átméretezését, vagy egyszerűen mozgassa a kezelőszervet egy új helyzetbe (ahol az egér megy). Jegyzet: minWidth és minHeight az állandók egyfajta méretkorlátozást biztosítanak (minimális vezérlési szélesség és magasság).
Az egérgomb elengedése után a húzás vagy az átméretezés vége:
eljárásTForm1.ControlMouseUp ( Feladó: TObject; Gomb: TMouseButton; Shift: TShiftState; X, Y: egész szám);kezdődikha inReposition azutánkezdődik Képernyő. Kurzor: = crDefault; ReleaseCapture; inReposition: = hamis; vég; vég; (* ControlMouseUp *)
ControlMouseUp röviden: amikor a felhasználó befejezte a mozgatást (vagy átméretezi a vezérlőegységet) engedje el az egérfogót (az alapértelmezett kattintások feldolgozásának lehetővé tétele érdekében), és jelölje meg, hogy az áthelyezés befejeződött.
És megcsinálja! Töltse le a mintaalkalmazást, és próbálja ki magát.
Megjegyzés: A vezérlők futásidejű áthelyezésének másik módja a Delphi húzza és vidd kapcsolódó tulajdonságok és módszerek (DragMode, OnDragDrop, DragOver, BeginDrag stb.). A drag and drop segítségével a felhasználók húzhatnak elemeket az egyik vezérlőből - például egy listából vagy a fa nézetből - a másikba.
Hogyan emlékszem a vezérlő helyzetére és méretére?
Ha engedélyezi a felhasználónak az űrlapvezérlők áthelyezését és átméretezését, akkor gondoskodnia kell arról, hogy a vezérlőelem elhelyezés valamilyen módon történjen mentve, amikor az űrlap bezáródik, és hogy minden vezérlő pozíciója helyreáll az űrlap létrehozásakor / betöltésekor. Így tárolhatja a Bal, Felső, Szélesség és Magasság tulajdonságokat az űrlap minden egyes vezérlésére egy INI fájlt.
Mi a helyzet 8 méretű fogantyúval?
Ha megengedi a felhasználónak, hogy áthelyezze és átméretezze a vezérlőelemeket a Delphi képernyőn, futás közben, az egér segítségével, a következőre teljesen utánozva a tervezési idő környezetét, nyolc méretű fogantyút kell hozzáadnia a vezérlőhöz átméretezni.