TreeView se zaškrtávacími políčky a přepínači

Komponenta TTreeView Delphi (umístěná na kartě palety komponent "Win32") představuje okno, které zobrazuje hierarchický seznam položek, jako jsou nadpisy v dokumentu, položky v indexu nebo soubory a adresáře na disk.

Uzel stromu se zaškrtávacím políčkem nebo přepínačem?

TTreeview Delphi nativně nepodporuje zaškrtávací políčka, ale základní ovládací prvek WC_TREEVIEW ano. Můžete přidat zaškrtávací políčka do pohled přepsáním procedury CreateParams v TTreeView a určením stylu TVS_CHECKBOXES pro ovládací prvek. Výsledkem je vše uzly ve stromovém zobrazení budou k nim připojena zaškrtávací políčka. Kromě toho již nelze použít vlastnost StateImages, protože WC_TREEVIEW interně používá tento seznam snímků k implementaci zaškrtávacích políček. Pokud chcete přepínat zaškrtávací políčka, musíte to udělat pomocí Poslat zprávu nebo Makra TreeView_SetItem / TreeView_GetItem z CommCtrl.pas. WC_TREEVIEW podporuje pouze zaškrtávací políčka, nikoli přepínače.

Přístup, který objevíte v tomto článku, je mnohem flexibilnější: můžete mít zaškrtávací políčka a přepínací tlačítka smíchaná s jinými uzly libovolným způsobem, aniž byste změnili zobrazení TT nebo vytvořili nový

watch instagram stories
třída z toho, aby to fungovalo. Také se sami rozhodujete, jaké obrázky použijete pro zaškrtávací políčka / radiobuttony jednoduše přidáním správných obrázků do seznamu snímků StateImages.

Přidejte zaškrtávací políčko nebo přepínač

Na rozdíl od toho, čemu byste mohli věřit, je to docela snadné dosáhnout Delphi. Zde jsou kroky, aby to fungovalo:

  1. Nastavte seznam obrázků (komponenta TImageList na kartě palety komponent "Win32") pro TTreeview. Vlastnost StateImages obsahující obrázky pro zaškrtnutý a nezaškrtnutý (é) stav (y) pro zaškrtávací políčka a / nebo přepínače.
  2. Vyvolejte postup ToggleTreeViewCheckBoxes (viz níže) v událostech OnClick a OnKeyDown stromu. Postup ToggleTreeViewCheckBoxes mění StateIndex vybraného uzlu tak, aby odrážel aktuální kontrolovaný / nezaškrtnutý stav.

Chcete-li, aby byl váš stromový výřez ještě profesionálnější, měli byste zkontrolovat, kde kliknete na uzel, než přepnete stavové obrazy: pouze přepnutím uzlu po kliknutí na skutečný obrázek si vaši uživatelé stále mohou uzel vybrat, aniž by jej změnili Stát.

Navíc pokud nechcete, aby vaši uživatelé rozbalili / sbalili stromové zobrazení, volejte proceduru FullExpand ve formulářích OnShow a nastavte AllowCollapse na false na události OnCollapsing na stromě.

Zde je implementace postupu ToggleTreeViewCheckBoxes:

postup ToggleTreeViewCheckBoxes (
Uzel: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: integer);
var
tmp: TTreeNode;
začátek Přiřazeno (uzel) pakbeginif Uzel. StateIndex = cUnChecked pak
Uzel. StateIndex: = cChecked
jiný-li Uzel. StateIndex = cChecked pak
Uzel. StateIndex: = cUnChecked
jinak pokud Uzel. StateIndex = cRadioUnChecked thenbegin
tmp: = Uzel. Rodič;
Pokud ne Přiřazeno (tmp) pak
tmp: = TTreeView (uzel. TreeView) .Items.getFirstNode
jiný
tmp: = tmp.getFirstChild;
zatímco Přiřazeno (tmp) dobeginif (tmp. StateIndex v
[cRadioUnChecked, cRadioChecked]) pak
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
konec;
Uzel. StateIndex: = cRadioChecked;
konec; // if StateIndex = cRadioUnCheckedkonec; // pokud je přiřazeno (uzel)
konec; (* ToggleTreeViewCheckBoxes *)

Jak můžete vidět z výše uvedeného kódu, postup začíná tím, že najde všechny zaškrtávací políčka a pouze je zapíná a vypíná. Pokud je uzel nezaškrtnutým přepínačem, postup se přesune na první uzel na aktuální úrovni, nastaví všechny uzly na této úrovni na cRadioUnchecked (pokud jsou uzly cRadioUnChecked nebo cRadioChecked) a nakonec přepne Uzel na cRadioChecked.

Všimněte si, jak jsou ignorována všechna již zaškrtnutá tlačítka. Je zřejmé, že je to proto, že již zaškrtnuté přepínací tlačítko by bylo přepnuto na nezaškrtnuté, takže uzly zůstanou v nedefinovaném stavu. Těžko byste chtěli většinu času.

Zde je návod, jak učinit kód ještě profesionálnějším: v případě události OnClick v Treeview zadejte následující kód, abyste přepínali pouze zaškrtávací políčka, pokud bylo klepnuto na stavový obrázek (konstanty cFlatUnCheck, cFlatChecked atd. jsou definovány jinde jako indexy do StateImages seznam obrázků):

postup TForm1.TreeView1Click (odesílatel: TObject);
var
P: TPoint;
začít
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
-li (htOnStateIcon v
TreeView1.GetHitTestInfoAt (P.X, P.Y)) pak
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
konec; (* TreeView1Click *)

Kód získá aktuální polohu myši, převede se na souřadnice souřadnic a zkontroluje, zda bylo klepnuto na StateIcon voláním funkce GetHitTestInfoAt. Pokud ano, vyvolá se přepínací postup.

Většinou byste očekávali, že mezerník přepíná zaškrtávací políčka nebo přepínače, takže zde je postup, jak napsat událost TreeView OnKeyDown pomocí této normy:

postup TForm1.TreeView1KeyDown (
Odesílatel: TObject;
var klíč: slovo;
Shift: TShiftState);
začátek (Key = VK_SPACE) a
Přiřazeno (TreeView1.Selected) pak
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
konec; (* TreeView1KeyDown *)

A konečně, jak by mohly vypadat události OnShow ve formuláři a události OnChanging v Treeview, pokud byste chtěli zabránit zhroucení uzlů stromu:

postup TForm1.FormCreate (Sender: TObject);
začít
TreeView1.FullExpand;
konec; (* FormCreate *)
postup TForm1.TreeView1Collapsing (
Odesílatel: TObject;
Uzel: TTreeNode;
var AllowCollapse: Boolean);
začít
AllowCollapse: = false;
konec; (* TreeView1Collapsing *)

Nakonec zkontrolujete, zda je zkontrolován uzel, jednoduše provedete následující srovnání (například v obslužném programu události OnClick tlačítka):

postup TForm1.Button1Click (Sender: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
začátek Přiřazeno (TreeView1.Selected) thenbegin
tn: = TreeView1.Selected;
BoolResult: = tn. StateIndex v
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Text +
#13#10 +
'Vybráno:' +
BoolToStr (BoolResult, True);
konec;
konec; (* Button1Click *)

Přestože tento typ kódování nelze považovat za kritický, může poskytnout vašim aplikacím profesionálnější a plynulejší vzhled. Pomocí uvážlivých zaškrtávacích políček a přepínačů mohou také usnadnit používání vaší aplikace. Určitě budou vypadat dobře!

Tento obrázek níže byl pořízen z testovací aplikace pomocí kódu popsaného v tomto článku. Jak vidíte, můžete libovolně kombinovat uzly, které mají zaškrtávací políčka nebo přepínače, s těmi, které nemají, ale neměli byste smíchat „prázdné“ uzly s „Zaškrtávací políčko"uzly (podívejte se na přepínače v obrázku), protože je velmi obtížné zjistit, jaké uzly jsou příbuzné."

instagram story viewer