TreeView s potrditvenimi polji in radijskimi gumbi

Komponenta TTreeView Delphi (ki se nahaja na zavihku palete komponent Win32) predstavlja okno, ki prikazuje hierarhični seznam elementov, kot so naslovi v dokumentu, vnosi v indeksu ali datoteke in imeniki v disk.

Drevesno vozlišče s potrditvenim poljem ali radijskim gumbom?

Delphijev TTreeview ne podpira izvornih potrditvenih polj, vendar je podvržen WC_TREEVIEW nadzor. V potrditvena polja lahko dodate potrditvena polja pogled na drevo s premočitvijo postopka CreateParams v TTreeView, pri čemer za nadzor določite slog TVS_CHECKBOXES. Rezultat tega je, da vse vozlišč v drevesnem pogledu bodo na njih pritrjena polja. Poleg tega lastnosti StateImages ni mogoče več uporabljati, ker WC_TREEVIEW ta seznam slik uporablja za interno izvajanje potrditvenih polj. Če želite preklopiti potrditvena polja, boste to morali storiti s pomočjo Pošlji sporočilo ali TreeView_SetItem / TreeView_GetItem makri iz CommCtrl.pas. WC_TREEVIEW podpira samo potrditvena polja, ne pa radijskih gumbov.

Pristop, ki ga boste odkrili v tem članku, je veliko bolj prilagodljiv: lahko imate polja in radijske gumbe, pomešane z drugimi vozlišči po želji, ne da bi spremenili TTreeview ali ustvarili novega

instagram viewer
razred iz tega, da bi to delo. Prav tako se sami odločite, katere slike uporabiti za potrditvena polja / radijske gumbe, tako da preprosto dodate ustrezne slike na seznam slik StateImages.

Dodajte potrditveno polje ali gumb za radio

V nasprotju s tistim, kar bi morda verjeli, je to zelo enostavno doseči Delphi. Tukaj je nekaj korakov za njegovo delovanje:

  1. Nastavite seznam slik (komponenta TImageList na kartici palete komponent Win32) za TTreeview. Lastnost StateImages, ki vsebuje slike za preverjena in nepreverjena stanja za potrditvena polja in / ali radijske gumbe.
  2. Pokličite postopek ToggleTreeViewCheckBoxes (glejte spodaj) v dogodkih OnClick in OnKeyDown drevesnega pogleda. Postopek ToggleTreeViewCheckBoxes spremeni StateIndex izbranega vozlišča, da odraža trenutno preverjeno / nepreverjeno stanje.

Če želite svoj pogled na drevo narediti še bolj profesionalnega, preverite, kje je vozlišče kliknjeno, preden vklopite slike stanja: s tem, ko vozlišče preklopite šele, ko kliknete dejansko sliko, lahko uporabniki še vedno izberejo vozlišče, ne da bi ga spreminjali država.

Če ne želite, da vaši uporabniki širijo / strdijo pogled drevesa, pokličite postopek FullExpand v dogodku OnShow v obrazcih in v dogodku OnCollapsing drevoreda nastavi AllowCollapse na false.

Tu je izvedba postopka ToggleTreeViewCheckBoxes:

postopek ToggleTreeViewCheckBoxes (
Vozlišče: TTreeNode;
cUnCheck,
cPreverjeno,
cRadioUncked,
cRadioChecked: celo število);
var
tmp: TTreeNode;
beginif Dodeljeno (vozlišče) potembeginif Vozlišče. StateIndex = cUnChecked torej
Vozlišče. StateIndex: = cPreverjeno
drugačeče Vozlišče. StateIndex = Preverjeno torej
Vozlišče. StateIndex: = cUnChecked
drugače če Vozlišče. StateIndex = cRadioUnChecked potem začet
tmp: = Vozlišče. Starš;
če ne Dodeljeno (tmp) torej
tmp: = TTreeView (Vozlišče. TreeView) .Items.getFirstNode
drugače
tmp: = tmp.getFirstChild;
medtem Dodeljeno (tmp) dobeginif (tmp StateIndex v
[cRadioUnChecked, cRadioChecked]) torej
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
konec;
Vozlišče. StateIndex: = cRadioChecked;
konec; // če je StateIndex = cRadioUnCheckedkonec; // če je dodeljeno (vozlišče)
konec; (* ToggleTreeViewCheckBoxes *)

Kot je razvidno iz zgornje kode, se postopek začne z iskanjem poljubnih potrditvenih vozlišč in jih samo vklopi ali izklopi. Nato je, če je vozlišče nepreverjen izbirni gumb, postopek premakne v prvo vozlišče na trenutni ravni, nastavi vsa vozlišča na tej ravni, da cRadioUncked (če so cRadioUnChecked ali cRadioChecked vozlišča) in končno preklopi Node na cRadioChecked.

Opazite, kako se kateri koli že preverjeni radijski gumbi ne upoštevajo. Očitno je to zato, ker bi že preverjeni izbirni gumb preklopili na nenadzorovan in puščali vozlišča v nedefiniranem stanju. Komaj bi si želeli večino časa.

Takole lahko naredite kodo še bolj profesionalno: v primeru dogodka OnClick Treeview napišite naslednjo kodo, da preklopite samo potrdite polja, če je bila označena vrednost slike (konstante cFlatUnCheck, cFlatChecked itd. so drugje definirane kot indeksi v StateImages seznam slik):

postopek TForm1.TreeView1Click (Pošiljatelj: TObject);
var
P: TPoint;
začeti
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
če (htOnStateIcon v
TreeView1.GetHitTestInfoAt (P.X, P.Y)) torej
ToggleTreeViewCheckBoxes (
TreeView1.Izbrano,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
konec; (* TreeView1Click *)

Koda dobi trenutni položaj miške, pretvori v koordinate pogleda dreves in preveri, če je bil kliknjen StateIcon s klicanjem funkcije GetHitTestInfoAt. Če bi bil, se pokliče postopek vklopa.

Večinoma pričakujete, da bo preslednica preklopila potrditvena polja ali izbirne gumbe, tako da je tukaj opisano, kako napisati dogodek TreeView OnKeyDown s tem standardom:

postopek TForm1.TreeView1KeyDown (
Pošiljatelj: TObject;
var Ključ: Word;
Shift: TShiftState);
beginif (Tipka = VK_SPACE) in
Dodeljeno (TreeView1.Selected) torej
ToggleTreeViewCheckBoxes (
TreeView1.Izbrano,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
konec; (* TreeView1KeyDown *)

Na koncu je opisano, kako bi lahko izgledali dogodki OnShow obrazca in Treeview's OnChanging, če želite preprečiti strnitev vozlišč drevesnega pogleda:

postopek TForm1.FormCreate (Pošiljatelj: TObject);
začeti
TreeView1.FullExpand;
konec; (* FormCreate *)
postopek TForm1.TreeView1Collapsing (
Pošiljatelj: TObject;
Vozlišče: TTreeNode;
var AllowCollapse: Boolean);
začeti
AllowCollapse: = napačno;
konec; (* TreeView1Clalapsing *)

In končno, če želite preveriti, ali je vozlišče preverjeno, preprosto naredite naslednjo primerjavo (na primer v priročniku za dogodek OnClick Buttona):

postopek TForm1.Button1Click (Pošiljatelj: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
beginif Dodeljeno (TreeView1.Selected) potem začet
tn: = TreeView1.Izbrano;
BoolResult: = tn. StateIndex v
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Besedilo +
#13#10 +
'Izbrano:' +
BoolToStr (BoolResult, True);
konec;
konec; (* Gumb1Click *)

Čeprav takšne vrste kodiranja ni mogoče obravnavati kot kritično, je vašim aplikacijam mogoče dati bolj profesionalen in bolj gladek videz. Tudi s preudarno uporabo potrditvenih polj in izbirnih gumbov lahko vašo aplikacijo olajšajo. Zagotovo bodo videti dobro!

Spodnja slika je bila posneta iz testne aplikacije z uporabo kode, opisane v tem članku. Kot lahko vidite, lahko vozlišča prosto mešate s potrditvenimi polji ali izbirnimi gumbi s tistimi, ki nimajo nobenega, čeprav "praznih" vozlišč ne smete mešati z "potrditveno polje"vozlišča (poglejte izbirne gumbe na sliki), ker je zaradi tega zelo težko razumeti, katera vozlišča so povezana.

instagram story viewer