Puuvaade ruutude ja raadionuppudega

Komponent TTreeView Delphi (asub komponendi paleti vahekaardil "Win32") tähistab akent, kus kuvatakse a üksuste hierarhiline loetelu, näiteks dokumendi pealkirjad, registrikanded või failid ja kataloogid ketas.

Puusõlm kasti või raadionupuga?

Delphi TT-vaade ei toeta loomulikult ruute, kuid selle aluseks olev WC_TREEVIEW juhtimisfunktsioon on küll. Saate ruutu lisada märkeruute puuvaade alistades TTreeView "CreateParams" protseduuri, määrates juhtimiseks TVS_CHECKBOXES stiili. Tulemuseks on see, et kõik sõlmed puuvaates on nende külge kinnitatud märkeruudud. Lisaks ei saa vara StateImages enam kasutada, kuna WC_TREEVIEW kasutab seda pildiloendit sisemiselt ruutude rakendamiseks. Kui soovite märkeruute ümber lülitada, peate seda tegema kasutades Saada sõnum või TreeView_SetItem / TreeView_GetItem makrod alates CommCtrl.pas. WC_TREEVIEW toetab ainult märkeruute, mitte raadionuppe.

Selles artiklis käsitletav lähenemisviis on palju paindlikum: teil võivad olla ruudud ja raadionupud segatakse teiste sõlmedega teile meelepärasel viisil, ilma TTreeview muutmata või uut loomata

instagram viewer
klass sellest tööd tegema. Samuti saate ise otsustada, milliseid pilte märkeruutude / raadionuppude jaoks kasutada, lihtsalt lisage õiged pildid loendisse StateImages.

Lisage märkeruut või raadionupp

Vastupidiselt sellele, mida võite uskuda, on seda üsna lihtne teostada Delphi. Selle toimimiseks tehke järgmist.

  1. Seadistage TTreeview jaoks piltide loend (komponent TImageList komponendi paleti vahekaardil "Win32"). StateImages vara, mis sisaldab kontrollitud ja märkimata olekute piltide märkeruute ja / või raadionuppe.
  2. Kutsuge puuvaate sündmuste OnClick ja OnKeyDown protseduur ToggleTreeViewCheckBoxes (vt allpool). ToggleTreeViewCheckBoxes protseduur muudab valitud sõlme StateIndexit nii, et see kajastaks praegust kontrollitud / kontrollimata olekut.

Oma puuvaate veelgi professionaalsemaks muutmiseks peaksite enne olekupiltide vahetamist kontrollima, kus sõlmel klõpsatakse: lülitades sõlme ainult tegelikul pildil klõpsamisel, saavad kasutajad siiski valida sõlme seda muutmata osariik.

Lisaks, kui te ei soovi, et teie kasutajad puuvaadet laiendaksid / ahendaksid, helistage sündmusvormides OnShow protseduurile FullExpand ja määrake puuvaate sündmuse OnCollapsing väärtuseks LubaCollapse väärtuseks vale.

ToggleTreeViewCheckBoxes protseduuri rakendamine on järgmine:

protseduur ToggleTreeViewCheckBoxes (
Sõlm: TTreeNode;
cUnChecked,
c kontrollitud,
cRadioKontrollimata,
cRadioChecked: täisarv);
var
tmp: TTreeNode;
algav Määratud (sõlm) siisbeginif Sõlm. StateIndex = cUnChecked siis
Sõlm. StateIndex: = kontrollitud
muudkui Sõlm. StateIndex = c kontrollitud siis
Sõlm. StateIndex: = kontrollitud
muidu kui Sõlm. StateIndex = cRadioUnChecked siis alustatakse
tmp: = Sõlm. Vanem;
Kui ei Määratud (tmp) siis
tmp: = TTreeView (sõlm. TreeView) .Items.getFirstNode
muud
tmp: = tmp.getFirstChild;
samas Määratud (tmp) dobeginif (tmp. StateIndex sisse
[cRadioUnChecked, cRadioChecked]) siis
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
lõpp;
Sõlm. StateIndex: = cRadioChecked;
lõpp; // kui StateIndex = cRadioUnCheckedlõpp; // kui määratud (sõlme)
lõpp; (* ToggleTreeViewCheckBoxes *)

Nagu ülaltoodud koodist näete, alustab protseduur kõik märkeruudu sõlmed ja lihtsalt neid sisse või välja lülitades. Järgmisena, kui sõlmeks on kontrollimata raadionupp, liigub protseduur praeguse taseme esimesele sõlmele, seab kõik sõlmed sellel tasemel cRadioUnchecked (kui need on cRadioUnChecked või cRadioChecked sõlmed) ja lülitab sõlme lõpuks sisse cRadioChecked.

Pange tähele, kuidas kõiki juba kontrollitud raadionuppe eiratakse. Ilmselt on selle põhjuseks see, et juba kontrollitud raadionupp lülitatakse kontrollimata, jättes sõlmed määratlemata olekusse. Vaevalt, mida te enamiku ajast soovite.

Koodi veelgi professionaalsemaks muutmiseks tehke järgmist: puuvaate OnClicki sündmusel kirjutage järgmine kood, et ainult märkeruudud, kui olekupilti klõpsati (konstandid cFlatUnCheck, cFlatChecked jne määratletakse mujal indeksina osariiki StateImages piltide loend):

protseduur TForm1.TreeView1Click (saatja: TObject);
var
P: TPoint;
alustada
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
kui (htOnStateIcon sisse
TreeView1.GetHitTestInfoAt (P.X, P.Y)) siis
ToggleTreeViewCheckBoxes (
TreeView1.Valitud,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
lõpp; (* TreeView1Click *)

Kood saab hiire praeguse asukoha, teisendab puuvaate koordinaatideks ja kontrollib funktsiooni GetHitTestInfoAt, kas StateIconil klõpsati. Kui oli, kutsutakse ümberlülitusprotseduur.

Enamasti eeldaks, et tühikuklahv lülitab märkeruudud või raadionupud, nii et puuView OnKeyDown-sündmust saab selle standardi abil kirjutada järgmiselt:

protseduur TForm1.TreeView1KeyDown (
Saatja: TObject;
var võti: sõna;
Shift: TShiftState);
algav (Võti = VK_SPACE) ja
Määratud (TreeView1.Valitud) siis
ToggleTreeViewCheckBoxes (
TreeView1.Valitud,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
lõpp; (* TreeView1KeyDown *)

Lõpuks näete siin, kuidas vormi OnShow ja Treeview'i sündmused muutmisel võiksid välja näha, kui soovite vältida puuvaate sõlmede kokkuvarisemist:

protseduur TForm1.FormCreate (saatja: TObject);
alustada
TreeView1.FullExpand;
lõpp; (* FormCreate *)
protseduur TForm1.TreeView1Koppeldamine (
Saatja: TObject;
Sõlm: TTreeNode;
var AllowCollapse: tõeväärtus);
alustada
AllowCollapse: = vale;
lõpp; (* TreeView1Koppel *)

Lõpuks, et kontrollida, kas sõlme on kontrollitud, teete lihtsalt järgmise võrdluse (näiteks Buttoni OnClicki sündmuste käitlejas):

protseduur TForm1.Button1Click (saatja: TObject);
var
BoolResult: tõeväärtus;
tn: TTreeNode;
algav Määratud (TreeView1.Valitud) siis alustatakse
tn: = TreeView1.Valitud;
BoolResult: = tn. StateIndex sisse
[cFlatChecked, cFlatRadioChecked];
Memo1.Tekst: = tn. Tekst +
#13#10 +
'Valitud:' +
BoolToStr (BoolResult, True);
lõpp;
lõpp; (* Button1Click *)

Kuigi seda tüüpi kodeerimist ei saa pidada missioonikriitiliseks, võib see anda teie rakendustele professionaalsema ja sujuvama ilme. Lisaks, kasutades märkeruute ja raadionuppe mõistlikult, saavad need teie rakendust hõlpsamini kasutada. Nad näevad kindlasti head välja!

See allolev pilt on võetud testrakendusest, kasutades selles artiklis kirjeldatud koodi. Nagu näete, võite vabalt segada ruute, millel on märkeruudud või raadionupud, nendega, millel neid pole, kuigi te ei tohiks segada "tühje" sõlme "märkeruut"sõlmed (vaadake pildi raadionuppe), kuna see muudab väga raskeks mõista, millised sõlmed on omavahel seotud.

instagram story viewer