„TreeView“ su žymės langeliais ir radijo mygtukais

„TTreeView Delphi“ komponentas (esantis „Win32“ komponentų paletės skirtuke) žymi langą, kuriame rodoma a hierarchinis elementų sąrašas, pavyzdžiui, dokumento antraštės, įrašai rodyklėje arba failai ir katalogai diskas.

Medžio mazgas su žymimu langeliu ar radijo mygtuku?

„Delphi“ „TTreeview“ natūraliai nepalaiko žymimųjų laukelių, tačiau pagrindinė „WC_TREEVIEW“ kontrolė yra. Galite pridėti žymimuosius laukelius prie medžio vaizdas nepaisydami „TTreeView“ „CreateParams“ procedūros, nurodydami „TVS_CHECKBOXES“ stilių valdymui. Rezultatas - viskas mazgai medžio vaizde bus pritvirtinti žymimieji langeliai. Be to, „StateImages“ nuosavybė nebegalės būti naudojama, nes „WC_TREEVIEW“ šį vaizdų sąrašą naudoja viduje, kad įdiegtų žymimuosius laukelius. Jei norite perjungti žymimuosius laukelius, turėsite tai padaryti naudodami Siųsti žinutę arba „TreeView_SetItem“ / „TreeView_GetItem“ makrokomandos „CommCtrl.pas“. „WC_TREEVIEW“ palaiko tik žymimuosius laukelius, o ne radijo mygtukus.

Šiame straipsnyje pastebimas požiūris yra daug lankstesnis: galite turėti žymimuosius laukelius ir radijo mygtukai sumaišomi su kitais mazgais bet kokiu jums pageidaujamu būdu, nekeisdami „TTreeview“ ar nesukurdami naujo

instagram viewer
klasė iš to padaryti šį darbą. Be to, jūs patys nuspręsite, kokius vaizdus naudoti žymimuosiuose langeliuose / radijo mygtukuose, tiesiog pridėdami tinkamus vaizdus į „StateImages“ vaizdų sąrašą.

Pridėkite žymės langelį arba radijo mygtuką

Priešingai nei jūs galite manyti, tai padaryti yra gana paprasta Delfi. Štai, kad jis veiktų:

  1. Nustatykite „TTreeview“ vaizdų sąrašą („TImageList“ komponentą „Win32“ komponentų paletės skirtuko lape). „StateImages“ nuosavybė, kurioje yra pažymėtų ir nepatikrintų būsenų (-ų) vaizduojamieji langeliai ir (arba) radijo mygtukai.
  2. Iškvieskite „ToggleTreeViewCheckBoxes“ procedūrą (žr. Toliau) medžio vaizdo „OnClick“ ir „OnKeyDown“ įvykiuose. „ToggleTreeViewCheckBoxes“ procedūra keičia pasirinkto mazgo „StateIndex“, kad atspindėtų esamą patikrintą / nepatikrintą būseną.

Norėdami, kad jūsų medžio vaizdas būtų dar profesionalesnis, prieš perjungdami būsenas, turėtumėte patikrinti, kur spustelėtas mazgas: tik perjungdami mazgą, kai paspaudžiamas tikras vaizdas, jūsų vartotojai vis tiek gali pasirinkti mazgą nekeisdami jo valstybės.

Be to, jei nenorite, kad jūsų vartotojai išplėstų / sutrauktų medžio rodinį, paskambinkite „FullExpand“ procedūrai, esančiai „OnShow“ įvykio formose, ir nustatykite, kad medžio peržiūros „OnCollapsing“ įvykyje „AllowCollapse“ būtų klaidinga.

Štai „ToggleTreeViewCheckBoxes“ procedūros įgyvendinimas:

procedūra „ToggleTreeViewCheckBoxes“ (
Mazgas: TTreeNode;
„cUnCheched“,
cPatikrinta,
cRadioUncheched,
„cRadioChecked“: sveikasis skaičius);
var
tmp: TTreeNode;
pradžia Paskirtas (mazgas) tadabeginifas Mazgas. „StateIndex“ = „cUnCheched“ tada
Mazgas. „StateIndex“: = patikrinta
Kitasjei Mazgas. „StateIndex“ = patikrinta tada
Mazgas. „StateIndex“: = „cUnCheched“
kitu atveju Mazgas. „StateIndex“ = „cRadioUnChecked“ tada pradedama
tmp: = mazgas. Tėvas;
jei ne Paskirtas (tmp) tada
tmp: = „TTreeView“ (mazgas. „TreeView“ .Items.getFirstNode
Kitas
tmp: = tmp.getFirstChild;
kol Paskirtas (tmp) dobeginifas (tmp. „StateIndex“ į
[cRadioUnChecked, cRadioChecked]) tada
tmp. „StateIndex“: = „cRadioUnChecked“;
tmp: = tmp.getNextSibling;
galas;
Mazgas. „StateIndex“: = „cRadioChecked“;
galas; // if StateIndex = cRadioUnCheckedgalas; // jei priskirtas (mazgas)
galas; (* „ToggleTreeViewCheckBoxes“ *)

Kaip matote iš aukščiau pateikto kodo, procedūra pradedama suradus bet kokius žymimuosius laukelius ir tiesiog juos įjungiant arba išjungiant. Tada, jei mazgas yra nepatikrintas radijo mygtukas, procedūra pereina į pirmąjį mazgą dabartiniame lygyje, nustato visus mazgus tame lygyje į „cRadioUnchecked“ (jei jie yra „cRadioUnChecked“ arba „cRadioChecked“ mazgai) ir galiausiai perjungia mazgą į „cRadioChecked“.

Atkreipkite dėmesį, kaip neatsižvelgiama į visus jau patikrintus radijo mygtukus. Akivaizdu, kad taip yra todėl, kad jau patikrintas radijo mygtukas būtų perjungtas į nepatikrintą, paliekant mazgus neapibrėžtoje būsenoje. Vargu ar to, ko dažniausiai norėtum.

Štai kaip padaryti kodą dar profesionalesnį: „Tree View“ „OnClick“ įvykyje parašykite šį kodą, kad tik perjungtumėte žymės langeliai, jei buvo spustelėtas būsenos vaizdas (konstantos „cFlatUnCheck“, „cFlatChecked“ ir kt. kitur yra apibrėžtos kaip „StateImages“ rodyklės vaizdų sąrašas):

procedūra TForm1.TreeView1Click (Siuntėjas: TObject);
var
P: TPoint;
prasideda
„GetCursorPos“ (P);
P: = TreeView1.ScreenToClient (P);
jei („htOnStateIcon“ į
„TreeView1.GetHitTestInfoAt“ (P.X, P.Y)) tada
„ToggleTreeViewCheckBoxes“ (
TreeView1.Pasirinkta,
„cFlatUnCheck“,
cFlatCheched,
„cFlatRadioUnCheck“,
cFlatRadioChecked);
galas; (* „TreeView1Click“)

Kodas gauna dabartinę pelės padėtį, paverčiamas medžio apžvalgos koordinatėmis ir patikrina, ar „StateIcon“ nebuvo spustelėtas, paskambinus „GetHitTestInfoAt“ funkcijai. Jei taip buvo, vadinama perjungimo procedūra.

Labiausiai tikėtumėte, kad tarpo klavišas perjungs žymimuosius laukelius arba radijo mygtukus, taigi, štai, kaip surašyti „TreeView OnKeyDown“ įvykį naudojant šį standartą:

procedūra TForm1.TreeView1KeyDown (
Siuntėjas: „TObject“;
var raktas: žodis;
„Shift“: „TShiftState“);
pradžia (Raktas = VK_SPACE) ir
Paskirtas („TreeView1.Selected“) tada
„ToggleTreeViewCheckBoxes“ (
TreeView1.Pasirinkta,
„cFlatUnCheck“,
cFlatCheched,
„cFlatRadioUnCheck“,
cFlatRadioChecked);
galas; (* „TreeView1KeyDown“ *)

Pagaliau, kaip formos „OnShow“ ir „Treeview“ „OnChanging“ įvykiai gali atrodyti, jei norėtumėte užkirsti kelią medžio peržiūros mazgų sugriuvimui:

procedūra TForm1.FormCreate (Siuntėjas: TObject);
prasideda
„TreeView1.FullExpand“;
galas; (* „FormCreate“ *)
procedūra „TForm1.TreeView1“ kopijavimas (
Siuntėjas: „TObject“;
Mazgas: TTreeNode;
var „AllowCollapse“: Boolean);
prasideda
AllowCollapse: = klaidinga;
galas; (* „TreeView1Collapsing“)

Galiausiai, norėdami patikrinti, ar mazgas yra patikrintas, tiesiog atlikite šį palyginimą (pavyzdžiui, mygtuko „OnClick“ įvykių apdorojimo priemonėje):

procedūra TForm1.Button1Click (Siuntėjas: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
pradžia Paskirtas („TreeView1.Selected“) tada pradedama
tn: = TreeView1.Pasirinkta;
„BoolResult“: = tn. „StateIndex“ į
[cFlatChecked, cFlatRadioChecked];
„Memo1.Text“: = tn. Tekstas +
#13#10 +
'Pasirinkta:' +
„BoolToStr“ („BoolResult“, „True“);
galas;
galas; (* Button1Click *)

Nors šio tipo kodavimo negalima laikyti kritiškai svarbiu, jis jūsų programoms gali suteikti profesionalesnį ir sklandesnį vaizdą. Be to, protingai naudodamiesi žymės langeliais ir radijo mygtukais, jie gali palengvinti jūsų programos naudojimą. Jie tikrai atrodys gerai!

Šis paveikslėlis paimtas iš bandomosios programos, naudojant šiame straipsnyje aprašytą kodą. Kaip matote, galite laisvai maišyti mazgus, turinčius žymimuosius laukelius arba radijo mygtukus, su tais, kurių nėra, nors neturėtumėte maišyti „tuščių“ mazgų su „žymimasis langelis"mazgai (pažiūrėkite į radijo mygtukus paveikslėlyje), nes tai labai sunku pamatyti, kokie mazgai yra susiję.

instagram story viewer