TreeView jelölőnégyzetekkel és rádiógombokkal

A TTreeView Delphi összetevő (a "Win32" összetevő palettáján található) egy ablakot jelenít meg, amely megjeleníti a az elemek hierarchikus listája, például egy dokumentum fejlécei, az index bejegyzései vagy a fájlok és könyvtárak egy lemezt.

Fa csomópont jelölőnégyzettel vagy rádiógombbal?

A Delphi TTreeview natív módon nem támogatja a jelölőnégyzeteket, de az alapjául szolgáló WC_TREEVIEW vezérlő ténylegesen támogatja. Felveheti jelölőnégyzeteket a fanézet a TTreeView CreateParams eljárásának meghaladásával meghatározza a vezérléshez a TVS_CHECKBOXES stílust. Az eredmény az, hogy minden csomópontok a fa nézetben jelölőnégyzetek vannak csatolva. Ezenkívül a StateImages tulajdonságot nem lehet többé használni, mert a WC_TREEVIEW ezt a képlistát használja belsőleg a jelölőnégyzetek megvalósításához. Ha ki akarja váltani a jelölőnégyzeteket, akkor ezt meg kell tennie a gombbal Üzenet küldése vagy a TreeView_SetItem / TreeView_GetItem makrók tól től CommCtrl.pas. A WC_TREEVIEW csak a jelölőnégyzeteket támogatja, nem a rádiógombokat.

instagram viewer

A cikkben felfedezni kívánt megközelítés sokkal rugalmasabb: van jelölőnégyzete és rádiógombok bármilyen módon összekeverhetők más csomópontokkal, anélkül, hogy megváltoztatná a TT-nézetet, vagy hozzon létre új osztály belőle, hogy ez a munka megtörténjen. Ezenkívül Ön is eldönti, hogy mely képeket használja a jelölőnégyzetekhez / rádiógombokhoz, egyszerűen azáltal, hogy a megfelelő képeket hozzáteszi a StateImages képlistához.

Adjon hozzá egy jelölőnégyzetet vagy rádiógombot

Ellentétben azzal, amit gondolhatunk, ezt nagyon egyszerű végrehajtani Delphi. Az alábbiakban bemutatjuk a működését:

  1. Állítson be egy képlistát (a TImageList összetevő a "Win32" összetevők palettáján) a TTreeview számára. A StateImages tulajdonság, amely a jelölőnégyzetek és / vagy a választógombok ellenőrzött és nem ellenőrzött állapotaihoz tartozó képeket tartalmazza.
  2. Hívja a ToggleTreeViewCheckBoxes eljárást (lásd alább) a fanézet OnClick és OnKeyDown eseményeiben. A ToggleTreeViewCheckBoxes eljárás megváltoztatja a kiválasztott csomópont StateIndex értékét, hogy tükrözze az aktuális ellenőrzött / nem ellenőrzött állapotot.

A fa nézet még professzionálisabbá tétele érdekében az állapotképek váltása előtt ellenőrizze, hogy egy csomópontra kattintanak-e: Ha a csomópontot csak akkor váltja, amikor a tényleges képre kattint, akkor a felhasználók továbbra is kiválaszthatják a csomópontot annak megváltoztatása nélkül állapot.

Ezenkívül, ha nem akarja, hogy a felhasználók kibővítsék / összecsukják a fa nézetet, hívja meg a FullExpand eljárást az OnShow esemény formában és állítsa az AllowCollapse értékét hamisra a fa nézet OnCollapsing eseményében.

Itt van a ToggleTreeViewCheckBoxes eljárás végrehajtása:

eljárás ToggleTreeViewCheckBoxes (
Csomópont: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: egész);
var
tmp: TTreeNode;
beginif Hozzárendelt (csomópont) thenbeginif Csomópont. StateIndex = cUnChecked azután
Csomópont. StateIndex: = cEllenőrizve
másha Csomópont. StateIndex = cEllenőrizve azután
Csomópont. StateIndex: = cUnChecked
egyébként, ha Csomópont. StateIndex = cRadioUnChecked thenbegin
tmp: = Csomópont. Szülő;
ha nem Hozzárendelt (tmp) azután
tmp: = TTreeView (Csomópont. TreeView) .Items.getFirstNode
más
tmp: = tmp.getFirstChild;
míg Hozzárendelt (tmp) dobeginif (Tmp. StateIndex ban ben
[cRadioUnChecked, cRadioChecked]) azután
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
vég;
Csomópont. StateIndex: = cRadioChecked;
vég; // ha StateIndex = cRadioUnCheckedvég; // ha hozzá van rendelve (csomópont)
vég; (* ToggleTreeViewCheckBoxes *)

Amint az a fenti kódból látható, az eljárás azzal indul el, hogy megtalálja a jelölőnégyzet csomópontjait, és csak be- vagy kikapcsolja azokat. Ezután, ha a csomópont nem ellenőrzött választógomb, akkor az eljárás az aktuális szint első csomópontjára mozog, beállítja az összes csomópontot ezen a szinten a cRadioUnchecked (ha cRadioUnChecked vagy cRadioChecked csomópontok), és végül váltja a csomópontot a következőre: cRadioChecked.

Figyelem: a már ellenőrzött rádiógombok figyelmen kívül hagyása. Nyilvánvaló, hogy ez azért van, mert egy már ellenőrzött választógombot nem lehet bekapcsolni, így a csomópontok meghatározatlan állapotban maradnak. Aligha szeretné, amit az idő nagy részében szeretne.

Így lehet a kódot még professzionálisabbá tenni: a Treeview OnClick eseményében írja be a következő kódot, hogy csak a jelölőnégyzetek, ha az állapotképre kattintottak (a cFlatUnCheck, cFlatChecked stb. állandók máshol vannak definiálva, mint a StateImages indexei képlista):

eljárás TForm1.TreeView1Click (Feladó: TObject);
var
P: TPoint;
kezdődik
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
ha (htOnStateIcon ban ben
TreeView1.GetHitTestInfoAt (P.X, P.Y)) azután
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
vég; (* TreeView1Click *)

A kód megkapja az egér aktuális helyzetét, átalakul fa nézet-koordinátákká és ellenőrzi, hogy a StateIcon-ra kattintott-e a GetHitTestInfoAt funkció meghívásával. Ha volt, akkor a váltási eljárást hívják.

Leginkább arra számíthat, hogy a szóköz elindítja a jelölőnégyzeteket vagy a választógombokat, így a következőképpen írhatjuk le a TreeView OnKeyDown eseményt a szabvány használatával:

eljárás TForm1.TreeView1KeyDown (
Feladó: TObject;
var Kulcs: Szó;
Shift: TShiftState);
beginif (Kulcs = VK_SPACE) és
Hozzárendelt (TreeView1.Selected) azután
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
végén; (* TreeView1KeyDown *)

Végül, hogyan nézhet ki az űrlap OnShow és a Treeview OnChanging eseményei, ha el szeretné kerülni a fa nézet csomópontjainak összeomlását:

eljárás TForm1.FormCreate (küldő: TObject);
kezdődik
TreeView1.FullExpand;
vég; (* FormCreate *)
eljárás TForm1.TreeView1Collapsing (
Feladó: TObject;
Csomópont: TTreeNode;
var AllowCollapse: logikai érték);
kezdődik
AllowCollapse: = hamis;
vég; (* TreeView1Collapsing *)

Végül, egy csomópont ellenőrzésének ellenőrzéséhez egyszerűen végezze el az alábbi összehasonlítást (például egy Button OnClick eseménykezelőjében):

eljárás TForm1.Button1Click (Feladó: TObject);
var
BoolResult: logikai;
tn: TTreeNode;
beginif Hozzárendelt (TreeView1.Selected) thenbegin
tn: = TreeView1.Választott;
BoolResult: = tn. StateIndex ban ben
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Szöveg +
#13#10 +
'Kiválasztva:' +
BoolToStr (BoolResult, True);
vég;
vég; (* Button1Click *)

Bár az ilyen típusú kódolás nem tekinthető küldetés-kritikusnak, ez professzionálisabb és simább megjelenést biztosíthat az alkalmazásai számára. A jelölőnégyzetek és a választógombok jóvoltából történő felhasználásával ezenkívül megkönnyítik az alkalmazás használatát. Biztosan jól fog kinézni!

Az alábbi kép egy tesztalkalmazásból készült, a cikkben leírt kóddal. Mint láthatja, a jelölőnégyzetekkel vagy a választógombokkal rendelkező csomópontokat szabadon összekeverheti azokkal, amelyeknél nincs ilyen, bár nem szabad kevernie az "üres" csomópontokat a "négyzetet"csomópontok (nézd meg a képen található rádiógombokat), mivel ez nagyon nehezen látja, hogy mely csomópontok kapcsolódnak egymáshoz.