TreeView so začiarkavacími políčkami a prepínačmi

Komponent TTreeView Delphi (umiestnený na karte palety komponentov "Win32") predstavuje okno, ktoré zobrazuje a hierarchický zoznam položiek, ako sú nadpisy v dokumente, položky v indexe alebo súbory a adresáre na disk.

Uzol stromu so zaškrtávacím políčkom alebo prepínačom?

TTreeview Delphi natívne nepodporuje začiarkavacie políčka, ale základná kontrola WC_TREEVIEW áno. Môžete pridať začiarkavacie políčka do TreeView prepísaním procedúry CreateParams v TTreeView, zadaním štýlu TVS_CHECKBOXES pre ovládací prvok. Výsledkom je všetko uzly v stromovom prehľade budú k nim pripojené zaškrtávacie políčka. Vlastnosť StateImages sa už ďalej nedá používať, pretože WC_TREEVIEW interne používa tento zoznam snímok na implementáciu začiarkávacích políčok. Ak chcete prepínať políčka, musíte to urobiť pomocou Poslať správu alebo Makra TreeView_SetItem / TreeView_GetItem z CommCtrl.pas. WC_TREEVIEW podporuje iba začiarkavacie políčka, nie prepínače.

Prístup, ktorý chcete objaviť v tomto článku, je oveľa flexibilnejší: môžete mať začiarkavacie políčka a prepínacie tlačidlá zmiešané s inými uzlami ľubovoľným spôsobom bez toho, aby ste zmenili zobrazenie TT alebo vytvorili nový

instagram viewer
trieda z toho, aby to fungovalo. Tiež sa sami rozhodujete, aké obrázky použijete pre začiarkavacie políčka / rádiobutóny jednoducho pridaním správnych obrázkov do zoznamu snímok StateImages.

Pridajte začiarkavacie políčko alebo prepínač

Na rozdiel od toho, čomu by ste mohli uveriť, je to celkom jednoduché dosiahnuť Delphi. Tu je postup, ako to zaistiť:

  1. Nastavte zoznam obrázkov (komponent TImageList na karte palety komponentov „Win32“) pre TTreeview. StateImages Vlastnosť obsahujúca obrázky pre začiarknuté a nezaškrtnuté stavy pre začiarkavacie políčka a / alebo prepínače.
  2. Zavolajte postup ToggleTreeViewCheckBoxes (pozri nižšie) v udalostiach OnClick a OnKeyDown v prehľade. Procedúra ToggleTreeViewCheckBoxes mení stavový index vybraného uzla tak, aby odrážal aktuálny skontrolovaný / nezaškrtnutý stav.

Ak chcete, aby bol váš stromový prehľad ešte profesionálnejší, mali by ste skontrolovať, kde sa kliklo na uzol, a až potom prepnúť stavové obrázky: iba prepínaním uzlov po kliknutí na skutočný obrázok môžu používatelia vybrať uzol bez toho, aby ho zmenili štát.

Navyše, ak nechcete, aby vaši používatelia rozširovali / zbalili stromové zobrazenie, zavolajte procedúru FullExpand vo formulároch OnShow a nastavte AllowCollapse na false na udalosti OnCollapsing na stromovom zobrazení.

Tu je implementácia postupu ToggleTreeViewCheckBoxes:

procedúra ToggleTreeViewCheckBoxes (
Uzol: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: celé číslo);
var
tmp: TTreeNode;
beginif Priradené (uzol) thenbeginif Uzol. StateIndex = cUnChecked potom
Uzol. StateIndex: = cKontrola
inakak Uzol. StateIndex = cKontrola potom
Uzol. StateIndex: = cUnChecked
ináč Ak Uzol. StateIndex = cRadioUnChecked thenbegin
tmp: = Uzol. materský podnik;
Ak nie Priradené (tmp) potom
tmp: = TTreeView (uzol. TreeView) .Items.getFirstNode
inak
tmp: = tmp.getFirstChild;
zatiaľ čo Priradené (tmp) dobeginif (TMP. StateIndex v
[cRadioUnChecked, cRadioChecked]) potom
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
koniec;
Uzol. StateIndex: = cRadioChecked;
koniec; // if StateIndex = cRadioUnCheckedkoniec; // ak je priradené (uzol)
koniec; (* ToggleTreeViewCheckBoxes *)

Ako vidíte z vyššie uvedeného kódu, postup sa začína vyhľadaním všetkých uzlov začiarkavacieho políčka a ich zapnutím alebo vypnutím. Ďalej, ak je uzol nezačiarknutým prepínačom, postup sa presunie na prvý uzol na aktuálnej úrovni, nastaví všetky uzly na tejto úrovni na cRadioUnchecked (ak sú uzla cRadioUnChecked alebo cRadioChecked) a nakoniec prepne Uzol na cRadioChecked.

Všimnite si, ako sa ignorujú všetky už kontrolované prepínače. Je zrejmé, že je to tak preto, že už začiarknuté prepínač by sa prepol na nezaškrtnuté a uzly by zostali nedefinované. Sotva to, čo by ste väčšinou chceli.

Ako vylepšiť kód takto: v prípade udalosti OnClick v Treeview napíšte nasledujúci kód, aby ste prepínali iba zaškrtávacie políčka, ak bolo kliknuté na stavový obrázok (indexy cFlatUnCheck, cFlatChecked atď. sú definované inde ako indexy do stavuImages zoznam obrázkov):

procedúra TForm1.TreeView1Click (Sender: TObject);
var
P: TPoint;
začať
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
ak (htOnStateIcon v
TreeView1.GetHitTestInfoAt (P.X, P.Y)) potom
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
koniec; (* TreeView1Click *)

Kód získa aktuálnu pozíciu myši, prevedie na súradnice stromu a skontroluje, či sa na kliknutie na položku StateIcon zavolala funkcia GetHitTestInfoAt. Ak by to tak bolo, vyvolá sa prepínací postup.

Väčšinou by ste očakávali, že medzerník prepne políčka alebo prepínače, takže tu je postup, ako napísať udalosť TreeView OnKeyDown s použitím tohto štandardu:

procedúra TForm1.TreeView1KeyDown (
Odosielateľ: TObject;
Var Key: Word;
Shift: TShiftState);
beginif (Kľúč = VK_SPACE) a
Priradené (TreeView1.Selected) potom
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
koniec; (* TreeView1KeyDown *)

Nakoniec uvádzame, ako by mohli udalosti OnShow vo formulári a udalosti OnChanging vo formulári vyzerať, ako by ste chceli zabrániť kolapsu uzlov stromu:

procedúra TForm1.FormCreate (Sender: TObject);
začať
TreeView1.FullExpand;
koniec; (* FormCreate *)
procedúra TForm1.TreeView1Collapsing (
Odosielateľ: TObject;
Uzol: TTreeNode;
var AllowCollapse: Boolean);
začať
AllowCollapse: = false;
koniec; (* TreeView1Collapsing *)

Nakoniec, aby ste skontrolovali, či je skontrolovaný uzol, jednoducho urobte nasledujúce porovnanie (napríklad v obsluhe udalosti tlačidla OnClick):

procedúra TForm1.Button1Click (Sender: TObject);
var
Výsledok boolean: boolean;
tn: TTreeNode;
beginif Priradené (TreeView1.Selected) thenbegin
tn: = TreeView1.Selected;
BoolResult: = tn. StateIndex v
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Text +
#13#10 +
„Vybrané:“ +
BoolToStr (BoolResult, True);
koniec;
koniec; (* Button1Click *)

Aj keď tento typ kódovania nemožno považovať za kritický, môže poskytnúť vašim aplikáciám profesionálnejší a plynulejší vzhľad. Tiež uvážlivým použitím začiarkavacích políčok a prepínačov môžu uľahčiť používanie vašej aplikácie. Určite budú vyzerať dobre!

Tento obrázok nižšie bol prevzatý z testovacej aplikácie pomocou kódu opísaného v tomto článku. Ako vidíte, môžete uzly, ktoré majú začiarkavacie políčka alebo prepínače, voľne kombinovať s tými, ktoré nemajú, ale „prázdne“ uzly by ste nemali kombinovať s „checkbox"uzly (pozrite sa na prepínače v obrázku), pretože je veľmi ťažké zistiť, ktoré uzly súvisia."