TreeView ar izvēles rūtiņām un radio pogām

Komponents TTreeView Delphi (atrodas cilnē "Win32" komponentu palete) apzīmē logu, kurā redzams a hierarhisku vienumu sarakstu, piemēram, dokumenta virsrakstus, ierakstus indeksā vai failus un direktorijus disks.

Koku mezgls ar izvēles rūtiņu vai radio pogu?

Delphi TTreeview neatbalsta izvēles rūtiņas, bet pamatā esošā WC_TREEVIEW vadība to dara. Jūs varat pievienot izvēles rūtiņas koku skats ignorējot TTreeView CreateParams procedūru, norādot kontrolei TVS_CHECKBOXES stilu. Rezultāts ir tas viss mezgli koku skatā tām būs pievienotas izvēles rūtiņas. Turklāt StateImages īpašumu vairs nevar izmantot, jo WC_TREEVIEW izmanto šo attēlu sarakstu iekšēji, lai ieviestu izvēles rūtiņas. Ja vēlaties pārslēgt izvēles rūtiņas, tas būs jādara, izmantojot Sūtīt ziņu vai TreeView_SetItem / TreeView_GetItem makro no plkst CommCtrl.pas. WC_TREEVIEW atbalsta tikai izvēles rūtiņas, nevis radio pogas.

Pieeja, kuru šajā rakstā vēlaties atklāt, ir daudz elastīgāka: jums var būt izvēles rūtiņas un radio pogas sajauktas ar citiem mezgliem, kā vien vēlaties, nemainot TTreeview vai neveidojot jaunu

instagram viewer
klase no tā, lai padarītu šo darbu. Turklāt jūs pats izlemjat, kādus attēlus izmantot izvēles rūtiņām / radiopogām, vienkārši pievienojot atbilstošus attēlus StateImages attēlu sarakstam.

Pievienojiet izvēles rūtiņu vai radio pogu

Pretēji tam, ko jūs varētu ticēt, to ir diezgan vienkārši paveikt Delfi. Tālāk ir norādītas darbības, lai tā darbotos:

  1. TTreeview iestatiet attēlu sarakstu (TImageList komponents cilnē "Win32" komponentu palete). StateImages īpašums, kas satur pārbaudītā un nekontrolētā stāvokļa (-u) attēlus izvēles rūtiņām un / vai radiopogām.
  2. Zvaniet uz ToggleTreeViewCheckBoxes procedūru (sk. Tālāk) koka skata notikumos OnClick un OnKeyDown. ToggleTreeViewCheckBoxes procedūra maina atlasītā mezgla StateIndex, lai atspoguļotu pašreizējo pārbaudīto / nekontrolēto stāvokli.

Lai jūsu koka skatu padarītu vēl profesionālāku, pirms stāvokļa attēlu pārslēgšanas jums jāpārbauda, ​​kur ir noklikšķināts uz mezgla: tikai pārslēdzot mezglu, kad tiek noklikšķināts uz faktiskā attēla, jūsu lietotāji joprojām var izvēlēties mezglu, nemainot to Valsts.

Turklāt, ja nevēlaties, lai lietotāji izvērstu / sakļautu koka skatu, izsauciet FullExpand procedūru formās OnShow un iestatiet AllowCollapse par nepatiesu koka skata OnCollapsing notikumā.

Šeit aprakstīta ToggleTreeViewCheckBoxes procedūras ieviešana:

procedūra ToggleTreeViewCheckBoxes (
Mezgls: TTreeNode;
cUnChecked,
cPārbaudīts,
cRadioUnchecked,
cRadioChecked: vesels skaitlis);
var
tmp: TTreeNode;
iesākums Piešķirts (Mezgls) tadbeginifs Mezgls. StateIndex = cUnChecked tad
Mezgls. StateIndex: = pārbaudīts
citsja Mezgls. StateIndex = cPārbaudīts tad
Mezgls. StateIndex: = pārbaudīts
citur ja Mezgls. StateIndex = cRadioUnChecked tad sāk
tmp: = mezgls. Vecāks;
ja nē Piešķirts (tmp) tad
tmp: = TTreeView (Mezgls. TreeView) .Items.getFirstNode
cits
tmp: = tmp.getFirstChild;
kamēr Piešķirts (tmp) dobeginifs (tmp. StateIndex iekšā
[cRadioUnChecked, cRadioChecked]) tad
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
beigas;
Mezgls. StateIndex: = cRadioChecked;
beigas; // ja StateIndex = cRadioUnCheckedbeigas; // ja piešķirts (mezgls)
beigas; (* ToggleTreeViewCheckBoxes *)

Kā redzat no iepriekšējā koda, procedūra sākas, atrodot izvēles rūtiņu mezglus un vienkārši tos ieslēdzot vai izslēdzot. Pēc tam, ja mezgls ir nekontrolēta radiopoga, procedūra tiek pārvietota uz pirmo mezglu pašreizējā līmenī, iestatīti visi mezgli šajā līmenī uz cRadioUnchecked (ja tie ir cRadioUnChecked vai cRadioChecked mezgli) un visbeidzot pārslēdz mezglu uz cRadioChecked.

Ievērojiet, kā tiek ignorētas visas jau pārbaudītās pogas. Acīmredzot tas notiek tāpēc, ka jau pārbaudīta radio poga tiktu pārslēgta uz nekontrolētu, atstājot mezglus nenoteiktā stāvoklī. Diez, ko jūs gribētu lielāko daļu laika.

Tālāk parādīts, kā padarīt kodu vēl profesionālāku: Treeview OnClick pasākumā uzrakstiet šo kodu, lai tikai pārslēgtu izvēles rūtiņas, ja tika noklikšķināts uz valsts attēla (konstantes cFlatUnCheck, cFlatChecked utt. citur tiek definētas kā indeksi StateImages attēlu saraksts):

procedūra TForm1.TreeView1Click (Sūtītājs: TObject);
var
P: TPoint;
sākt
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
ja (htOnStateIcon iekšā
TreeView1.GetHitTestInfoAt (P.X, P.Y)) tad
ToggleTreeViewCheckBoxes (
TreeView1.Izvēlēts,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
beigas; (* TreeView1Click *)

Kods iegūst pašreizējo peles pozīciju, pārveido koku skata koordinātēs un pārbauda, ​​vai nav noklikšķinājis uz StateIcon, izsaucot funkciju GetHitTestInfoAt. Ja tas tā bija, tiek izsaukta pārslēgšanas procedūra.

Galvenokārt, jūs gaidījāt, ka atstarpes taustiņš pārslēdz izvēles rūtiņas vai radio pogas, tāpēc šeit ir aprakstīts, kā uzrakstīt TreeView OnKeyDown notikumu, izmantojot šo standartu:

procedūra TForm1.TreeView1KeyDown (
Sūtītājs: TObject;
var Taustiņš: Vārds;
Shift: TShiftState);
iesākums (Taustiņš = VK_SPACE) un
Piešķirts (TreeView1.Selected) tad
ToggleTreeViewCheckBoxes (
TreeView1.Izvēlēts,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
beigas; (* TreeView1KeyDown *)

Visbeidzot, šeit ir redzams, kā veidlapas OnShow un Treeview notikumi OnChanging varētu izskatīties, ja vēlaties novērst koka skata mezglu sabrukšanu:

procedūra TForm1.FormCreate (Sūtītājs: TObject);
sākt
TreeView1.FullExpand;
beigas; (* FormCreate *)
procedūra TForm1.TreeView1Collapsing (
Sūtītājs: TObject;
Mezgls: TTreeNode;
var AllowCollapse: Būla);
sākt
AllowCollapse: = nepatiess;
beigas; (* TreeView1Collapsing *)

Visbeidzot, lai pārbaudītu, vai mezgls ir pārbaudīts, vienkārši veiciet šādu salīdzināšanu (piemēram, Button OnClick notikumu apstrādātājā):

procedūra TForm1.Button1Click (Sūtītājs: TObject);
var
BoolResult: Būla;
tn: TTreeNode;
iesākums Piešķirts (TreeView1.Selected) tad sāk
tn: = TreeView1.Izvēlēts;
BoolResult: = tn. StateIndex iekšā
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Teksts +
#13#10 +
'Atlasīts:' +
BoolToStr (BoolResult, True);
beigas;
beigas; (* Button1Click *)

Lai gan šāda veida kodēšanu nevar uzskatīt par kritisku misijai, tā var dot jūsu lietojumprogrammām profesionālāku un vienmērīgāku izskatu. Turklāt, saprātīgi izmantojot izvēles rūtiņas un radio pogas, tie var padarīt jūsu lietojumprogrammu vieglāku. Viņi noteikti izskatīsies labi!

Šis attēls ir ņemts no testa lietotnes, izmantojot šajā rakstā aprakstīto kodu. Kā redzat, jūs varat brīvi sajaukt mezglus, kuriem ir izvēles rūtiņas vai radio pogas, ar tiem, kuriem tādu nav, lai gan jums nevajadzētu sajaukt "tukšus" mezglus ar "izvēles rūtiņu"mezgli (apskatiet attēlā esošās radio pogas), jo tas ļoti apgrūtina to, kādi mezgli ir saistīti.