TreeView -valintaruudut ja radiopainikkeet

click fraud protection

TTreeView Delphi -komponentti (sijaitsee "Win32" -komponenttipalettivälilehdellä) edustaa ikkunaa, joka näyttää hierarkkinen luettelo kohteista, kuten asiakirjan otsikot, hakemiston merkinnät tai tiedostot ja hakemistot levy.

Puusolmu valintaruudulla tai radiopainikkeella?

Delphin TT-näkymä ei tue natiivisti valintaruutuja, mutta taustalla oleva WC_TREEVIEW-ohjaus ei. Voit lisätä valintaruudut puunäkymä ohittamalla TTreeView: n CreateParams -menettely, määrittelemällä TVS_CHECKBOXES-tyyli ohjaukselle. Tuloksena on, että kaikki solmut puunäkymässä valintaruudut liitetään niihin. Lisäksi StateImages-ominaisuutta ei voida enää käyttää, koska WC_TREEVIEW käyttää tätä kuvallista sisäisesti valintaruutujen toteuttamiseen. Jos haluat vaihtaa valintaruudut, sinun on tehtävä se käyttämällä Lähetä viesti tai TreeView_SetItem / TreeView_GetItem -makrot alkaen CommCtrl.pas. WC_TREEVIEW tukee vain valintaruutuja, ei radionäppäimiä.

Tässä artikkelissa tutustuttava lähestymistapa on paljon joustavampi: sinulla voi olla valintaruudut ja valintanapit sekoitettuna muiden solmujen kanssa haluamallasi tavalla muuttamatta TT-näkymää tai luomalla uutta

instagram viewer
luokka siitä tämän työn tekemiseen. Voit myös päättää itse, mitä kuvia käytetään valintaruuduissa / radiopainikkeissa yksinkertaisesti lisäämällä oikeat kuvat StateImages-kuvalistalle.

Lisää valintaruutu tai radiopainike

Toisin kuin uskot, tämä on melko helppoa suorittaa Delfoi. Seuraavat vaiheet saadaksesi sen toimimaan:

  1. Asenna kuvan luettelo (TImageList-komponentti "Win32" -komponenttipaletti-välilehdellä) TTreeview-kuvaan. StateImages-ominaisuus, joka sisältää valittujen ja ei valittujen tilojen valintaruutujen ja / tai valintanappien kuvia.
  2. Kutsu ToggleTreeViewCheckBoxes-menettely (katso alla) puunäkymän OnClick- ja OnKeyDown-tapahtumissa. ToggleTreeViewCheckBoxes-menettely muuttaa valitun solmun StateIndex-kuvaa heijastamaan nykyistä tarkistettua / ei-tarkastettua tilaa.

Jotta puunäkymästä tulisi entistä ammattimaisempaa, sinun tulisi tarkistaa, mihin solmua napsautetaan, ennen kuin vaihdat tilakuvia: Vaihtamalla solmua vain, kun todellista kuvaa napsautetaan, käyttäjät voivat silti valita solmun muuttamatta sitä osavaltio.

Lisäksi, jos et halua käyttäjien laajentavan / tiivistävän puunäkymää, soita FullExpand-menettelyyn OnShow-lomakkeissa ja aseta AllowCollapse-arvoksi väärä puunäkymän OnCollapsing-tapahtumassa.

Tässä on ToggleTreeViewCheckBoxes-menettelyn toteutus:

menettely ToggleTreeViewCheckBoxes (
Solmu: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: kokonaisluku);
var
tmp: TTreeNode;
beginif Määritetty (solmu) thenbeginif Solmu. StateIndex = cUnChecked sitten
Solmu. StateIndex: = tarkistettu
muujos Solmu. StateIndex = cTarkistettu sitten
Solmu. StateIndex: = cUnChecked
muuten jos Solmu. StateIndex = cRadioUnChecked thenbegin
tmp: = Solmu. Parent;
jos ei Annettu (tmp) sitten
tmp: = TTreeView (Solmu. TreeView) .Items.getFirstNode
muu
tmp: = tmp.getFirstChild;
sillä aikaa Annettu (tmp) dobeginif (TMP. StateIndex sisään
[cRadioUnChecked, cRadioChecked]) sitten
TMP. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
pää;
Solmu. StateIndex: = cRadioChecked;
pää; // jos StateIndex = cRadioUnCheckedpää; // jos määritetty (solmu)
pää; (* ToggleTreeViewCheckBoxes *)

Kuten yllä olevasta koodista voidaan nähdä, menettely alkaa etsimällä valintaruudun solmut ja kytkemällä ne vain päälle tai pois päältä. Seuraavaksi, jos solmu on tarkistamaton valintanappi, menettely siirtyy nykyisen tason ensimmäiseen solmuun, asettaa kaikki solmut tällä tasolla cRadioUnchecked (jos ne ovat cRadioUnChecked tai cRadioChecked) solmut) ja lopuksi vaihtaa solmun cRadioChecked.

Huomaa, kuinka jo tarkistettuja valintanappia ei huomioida. Ilmeisesti tämä johtuu siitä, että jo tarkistettu valintanappi vaihdetaan valitsematta, jättäen solmut määrittelemättömään tilaan. Tuskin mitä haluaisit suurimman osan ajasta.

Näin voit tehdä koodista entistä ammattimaisemman: kirjoita puunäkymän OnClick-tapahtumaan seuraava koodi vain vaihtaaksesi valintaruudut, jos tilakuva on napsautettu (vakio cFlatUnCheck, cFlatChecked jne. määritetään muualla indekseinä osaksi StateImages kuvalista):

menettely TForm1.TreeView1Click (Lähettäjä: TObject);
var
P: TPoint;
alkaa
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
jos (htOnStateIcon sisään
TreeView1.GetHitTestInfoAt (P.X, P.Y)) sitten
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
pää; (* TreeView1Click *)

Koodi saa hiiren nykyisen sijainnin, muuntaa puunäkymän koordinaateiksi ja tarkistaa, onko StateIconia napsautettu napsauttamalla GetHitTestInfoAt-toimintoa. Jos se oli, kytkentämenettelyä kutsutaan.

Voit yleensä odottaa välilyönnin vaihtavan valintaruudut tai valintanapit, joten tässä on miten kirjoittaa TreeView OnKeyDown -tapahtuma käyttämällä tätä standardia:

menettely TForm1.TreeView1KeyDown (
Lähettäjä: TObject;
var Avain: Sana;
Vaihto: TShiftState);
beginif (Avain = VK_SPACE) ja
Määritetty (TreeView1.Valittu) sitten
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
end; (* TreeView1KeyDown *)

Lopuksi, miten lomakkeen OnShow ja Treeview's OnChanging -tapahtumat voisivat näyttää, jos haluat estää puunäkymän solmujen romahtamisen:

menettely TForm1.FormCreate (Lähettäjä: TObject);
alkaa
TreeView1.FullExpand;
pää; (* FormCreate *)
menettely TForm1.TreeView1Collapsing (
Lähettäjä: TObject;
Solmu: TTreeNode;
var AllowCollapse: Boolean);
alkaa
AllowCollapse: = väärä;
pää; (* TreeView1Collapsing *)

Lopuksi, tarkistaaksesi, tarkistetaanko solmu, tee seuraava vertailu (esimerkiksi Buttonin OnClick-tapahtumakäsittelyohjelmassa):

menettely TForm1.Button1Click (Lähettäjä: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
beginif Määritetty (TreeView1.Valittu) thenbegin
tn: = TreeView1.Valittu;
BoolResult: = tn. StateIndex sisään
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Teksti +
#13#10 +
'Valittu:' +
BoolToStr (BoolResult, True);
pää;
pää; (* Button1Click *)

Vaikka tämäntyyppistä koodausta ei voida pitää missiokriittisenä, se voi antaa sovelluksillesi ammattimaisemman ja sujuvamman ilmeen. Lisäksi käyttämällä valintaruutuja ja valintanappeja harkiten, ne voivat helpottaa sovelluksesi käyttöä. He varmasti näyttävät hyvältä!

Tämä alla oleva kuva on otettu testisovelluksesta tässä artikkelissa kuvatulla koodilla. Kuten näet, voit sekoittaa vapaasti valintaruuduilla tai valintanapeilla olevia solmuja sellaisiin, joissa ei ole yhtään, vaikka et pitäisi sekoittaa "tyhjiä" solmuja "valintaruutu"" solmut (katsokaa kuvan valintanappia), koska tämä tekee erittäin vaikeaksi nähdä mitä solmut liittyvät.

instagram story viewer