TreeView s potvrdnim okvirima i radio tipkama

TTreeView Delphi komponenta (nalazi se na kartici palete komponenti "Win32") predstavlja prozor koji prikazuje hijerarhijski popis stavki, poput naslova u dokumentu, unosa u indeksu ili datoteka i mapa na disk.

Stablo s drvećem s potvrdnim okvirom ili gumbom radija?

Delphijev TTreeview izvorno ne podržava potvrdne okvire, ali donja kontrola WC_TREEVIEW ne. Možete dodati potvrdne okvire na treeview nadjačavanjem postupka CreateParams u obliku TTreeView, navođenje stila TVS_CHECKBOXES za kontrolu. Rezultat toga je da sve čvorovi u stablu će im biti pričvršćeni potvrdni okviri. Pored toga, svojstvo StateImages više se ne može koristiti jer WC_TREEVIEW koristi ovaj popis slika interno za implementaciju potvrdnih okvira. Ako želite prebaciti potvrdne okvire, to ćete morati učiniti pomoću Pošalji poruku ili TreeView_SetItem / TreeView_GetItem makronaredbe iz CommCtrl.pas. WC_TREEVIEW podržava samo potvrdne okvire, a ne radio gumbe.

Pristup koji ćete otkriti u ovom članku je puno fleksibilniji: možete imati potvrdne okvire i radio gumbe pomiješane s drugim čvorovima na bilo koji način bez promjene bez promjene TTreeviewa ili stvaranja novog

instagram viewer
klasa od njega da bi to učinio. Također, sami odlučite koje ćete slike koristiti za potvrdne okvire / radio gumbe jednostavno dodavanjem odgovarajućih slika na popis slika StateImages.

Dodajte potvrdni okvir ili radio gumb

Suprotno onome u što možete vjerovati, ovo je vrlo jednostavno Delphi. Evo nekoliko koraka za to:

  1. Postavite popis slika (TImageList komponenta na kartici palete komponenti "Win32") za TTreeview. Svojstvo StateImages sadrži slike provjerenih i neprovjerenih stanja za potvrdne okvire i / ili radio gumbe.
  2. Pozovite postupak ToggleTreeViewCheckBoxes (vidi dolje) u OnClick i OnKeyDown događajima s stabla. Postupak ToggleTreeViewCheckBoxes mijenja StateIndex odabranog čvora tako da odražava trenutno provjereno / neprovjereno stanje.

Da biste svoj prikaz stabla učinili još profesionalnijim, trebali biste provjeriti gdje je kliknut čvor prije izmjene vrijednosti stanja: prebacivanjem čvora samo kad se klikne na stvarnu sliku, vaši korisnici i dalje mogu odabrati čvor bez promjene njegovog država.

Uz to, ako ne želite da vaši korisnici proširuju / urušavaju prikaz stabla, nazovite postupak FullExpand u obrascu OnShow i postavite AllowCollapse na false u događaju OnCollapsing pogleda na stablo.

Evo provedbe postupka ToggleTreeViewCheckBoxes:

postupak ToggleTreeViewCheckBoxes (
Čvor: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: cijeli broj);
var
tmp: TTreeNode;
beginif Dodijeljeno (čvor) thenbeginif Čvor. StateIndex = cUnChecked zatim
Čvor. StateIndex: = provjereno
drugoako Čvor. StateIndex = provjereno zatim
Čvor. StateIndex: = cUnChecked
inače ako Čvor. StateIndex = cRadioUnChecked thenbegin
tmp: = Čvor. Roditelj;
ako ne Dodijeljeno (tmp) zatim
tmp: = TTreeView (Čvor. TreeView) .Items.getFirstNode
drugo
tmp: = tmp.getFirstChild;
dok Dodijeljeno (tmp) dobeginif (TMP. StateIndex u
[cRadioUnChecked, cRadioChecked]) zatim
TMP. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
kraj;
Čvor. StateIndex: = cRadioChecked;
kraj; // ako je StateIndex = cRadioUnCheckedkraj; // ako je dodijeljen (čvor)
kraj; (* ToggleTreeViewCheckBoxes *)

Kao što vidite iz gornjeg koda, postupak započinje pronalaženjem bilo kojih čvorova u potvrdnom polju i samo ih uključuje ili isključuje. Dalje, ako je čvor neprovjereni radio gumb, postupak se pomiče na prvi čvor na trenutnoj razini, postavlja sve čvorove na toj razini da se cRadioUn provjeri (ako su cRadioUnChecked ili cRadioChecked čvorovi) i konačno prebaci Node na cRadioChecked.

Primjetite kako se ignoriraju bilo koji već provjereni radijski gumbi. Očito je to zato što bi već provjereni radio gumb bio prebačen na neprovjeren, ostavljajući čvorove u nedefiniranom stanju. Teško ono što biste željeli većinu vremena.

Evo kako da kôd učinite još profesionalnijim: u OnClick događaju Treeview-a napišite sljedeći kôd da biste samo promijenili potvrdne okvire ako je klikova stanja prikazana (konstante cFlatUnCheck, cFlatChecked itd. drugdje su definirane kao indeksi u StateImages popis slika):

postupak TForm1.TreeView1Click (Pošiljatelj: TObject);
var
P: TPoint;
početi
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
ako (htOnStateIcon u
TreeView1.GetHitTestInfoAt (P.X, P.Y)) zatim
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
kraj; (* TreeView1Click *)

Kôd dobiva trenutnu poziciju miša, pretvara se u koordinate pogleda stabla i provjerava je li StateIcon pritisnut pozivom na funkciju GetHitTestInfoAt. Ako je bio, poziva se postupak prebacivanja.

Uglavnom, očekujete da razmaknica promijeni potvrdne okvire ili radio gumbe, pa evo kako napisati događaj TreeView OnKeyDown koristeći taj standard:

postupak TForm1.TreeView1KeyDown (
Pošiljalac: TObject;
var Ključ: Riječ;
Shift: TShiftState);
beginif (Ključ = VK_SPACE) i
Dodijeljeno (TreeView1.Selected) zatim
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
kraj; (* TreeView1KeyDown *)

Konačno, evo kako bi mogli izgledati događaji u programu OnShow i Treeview's OnChanging ako želite spriječiti urušavanje čvorova stabla:

postupak TForm1.FormCreate (pošiljalac: TObject);
početi
TreeView1.FullExpand;
kraj; (* FormCreate *)
postupak TForm1.TreeView1Collapsing (
Pošiljalac: TObject;
Čvor: TTreeNode;
var AllowCollapse: Boolean);
početi
AllowCollapse: = netočno;
kraj; (* TreeView1Collapsing *)

Konačno, da biste provjerili je li čvor provjeren, jednostavno napravite slijedeću usporedbu (na primjer, Button-ov alat za obradu događaja OnClick, na primjer):

postupak TForm1.Button1Click (Pošiljatelj: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
beginif Dodijeljeno (TreeView1.Selected) thenbegin
tn: = TreeView1.Selected;
BoolResult: = tn. StateIndex u
[cFlatChecked, cFlatRadioChecked];
Memo1.Tekst: = tn. Tekst +
#13#10 +
'Odabrano:' +
BoolToStr (BoolResult, True);
kraj;
kraj; (* Button1Click *)

Iako se ova vrsta kodiranja ne može smatrati kritičnom za misiju, može dati vašim aplikacijama profesionalniji i glatkiji izgled. Također, upotrebom potvrdnih okvira i radijskih gumba, oni mogu vašu aplikaciju olakšati. Sigurno će izgledati dobro!

Ova je slika dolje preuzeta iz testne aplikacije pomoću koda opisanog u ovom članku. Kao što vidite, čvorove možete slobodno miješati s potvrdnim okvirima ili radio tipkama s onima koji nemaju, iako ne biste trebali miješati "prazne" čvorove s "okvir"čvorovi (pogledajte radio tipke na slici) jer je to vrlo teško vidjeti koji su čvorovi povezani.