TTreeView/fi: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: TTreeView/fi
| Old | New | Line | |
|---|---|---|---|
| 1 | + | # Puunäkymä | |
| 2 | + | ||
| 3 | + | **TTreeView**  eli puunäkymä on on graafinen ohjauselementti, joka esittää hierarkkisen näkymän informaatiosta. Jokaisella kohteella voi olla useita alakohteita. | |
| 4 | + | ||
| 5 | + | Kohteet voidaan laajentaa paljastamaan alakohteita, jos niitä on olemassa ja piilottamaan sen alle kuuluvat kohteet. | |
| 6 | + | ||
| 7 | + | ## Uuden kohteen lisääminen koodilla | |
| 8 | + | ||
| 9 | + | Käytä TTreeView.Items.AddChild tai AddChildObject. | |
| 10 | + | ||
| 11 | + | ## Puunäkymän luominen joka lataa kohteita vain laajentamisen yhteydessä | |
| 12 | + | ||
| 13 | + | Jos halutaan lisätä laajennussymboli solmuun, jossa ei ole osia, käytä: | |
| 14 | + | ||
| 15 | + | ``` pascal | |
| 16 | + | MyNode.HasChildren := True; | |
| 17 | + | ``` | |
| 18 | + | ||
| 19 | + | Aseta sitten tapahtumakäsittelijä OnExpanding-tapahtumaan. Tässäkin sinun pitäisi palata, jos laajennus todella voidaan tehdä tai ei, ja jos kyllä, niin pitäisi lisätä alikohtia solmuun. Jos laajennusta ei voida tehdä, laajennusmerkki poistuu automaattisesti, vaikka olet aiemmin asettanut HasChildrenin todeksi. | |
| 20 | + | ||
| 21 | + | ## Lyhyt esimerkki puunäkymän käyttämisestä | |
| 22 | + | ||
| 23 | + | Tässä on nopeasti tehty esimerkki: | |
| 24 | + | ||
| 25 | + | Luodaan uusi sovellus. Laitetaan lomakkeelle TTreeview-komponentti. Lisätään vielä pari [[TButton/fi|painiketta (TButton)]]. Muutetaan Button1:n Caption-ominaisuus arvoon "Add Child" ja button2:n Caption-ominaisuus arvoon "Delete". | |
| 26 | + | ||
| 27 | + | Liitetään seuraava koodi näiden painikkeiden OnClick-tapahtumiin, käännetään ja ajetaan ohjelma. | |
| 28 | + | ||
| 29 | + | ``` pascal | |
| 30 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 31 | + | var | |
| 32 | + | i: integer; | |
| 33 | + | s: string; | |
| 34 | + | begin | |
| 35 | + | // if there are no nodes, create a root node with a parent of nil | |
| 36 | + | if TreeView1.Items.Count = 0 then | |
| 37 | + | begin | |
| 38 | + | Treeview1.Items.Add (nil,'Root Node'); | |
| 39 | + | exit; | |
| 40 | + | end; | |
| 41 | + | ||
| 42 | + | // Set up a simple text for each new node - Node1 , Node2 etc | |
| 43 | + | i := treeview1.Items.Count; | |
| 44 | + | s := 'Node ' + inttostr(i); | |
| 45 | + | //Add a new node to the currently selected node | |
| 46 | + | if TreeView1.Selected <> nil then | |
| 47 | + | Treeview1.Items.AddChild(Treeview1.Selected ,s); | |
| 48 | + | end; | |
| 49 | + | ||
| 50 | + | procedure TForm1.Button2Click(Sender: TObject); | |
| 51 | + | ||
| 52 | + | //A procedure to recursively delete nodes | |
| 53 | + | procedure DeleteNode(Node:TTreeNode); | |
| 54 | + | begin | |
| 55 | + | while Node.HasChildren do | |
| 56 | + | DeleteNode(node.GetLastChild); | |
| 57 | + | TreeView1.Items.Delete(Node) ; | |
| 58 | + | end; | |
| 59 | + | ||
| 60 | + | begin | |
| 61 | + | if TreeView1.Selected = nil then | |
| 62 | + | exit; | |
| 63 | + | ||
| 64 | + | //if selected node has child nodes, first ask for confirmation | |
| 65 | + | if treeview1.Selected.HasChildren then | |
| 66 | + | if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then | |
| 67 | + | exit; | |
| 68 | + | DeleteNode(TreeView1.Selected); | |
| 69 | + | end; | |
| 70 | + | ``` | |
| 71 | + | ||
| 72 | + | Ohjelman ajon alussa puunäkymä on tyhjä. Jos valitaan "Lisää lapsi" ("Add Child"-painike), luodaan juurisolmu. Sen jälkeen lapsi lisätään mihin tahansa **valitulle solmulle** klikkaamalla painiketta "Lisää lapsi". | |
| 73 | + | ||
| 74 | + | "Delete" (poista) painike poistaa valitun solmun. Jos sillä ei ole lapsia, se poistaa sen välittömästi, mutta jos sillä on lapsia, se kysyy ensin. | |
| 75 | + | ||
| 76 | + | ## Esimerkki usean solmun valinnasta useille käyttäjävalinnoille | |
| 77 | + | ||
| 78 | + | Valitaan TTreeview-komponentti, siirrytään komponenttimuokkaimeen ja asetetaan options ominaisuus "tvoAllowMultiSelect" arvoon true. Sitten toistetaan valittujen solmujen päälle ja hankitaan valittujen kansioiden tai tiedostojen polut, seuraava esimerkki täyttää kyseisten valittujen solmujen tekstipolut muistikentille | |
| 79 | + | ||
| 80 | + | Koodi: | |
| 81 | + | ||
| 82 | + | ``` pascal | |
| 83 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 84 | + | var | |
| 85 | + | i: Integer; | |
| 86 | + | begin | |
| 87 | + | if TreeView1.SelectionCount=0 then | |
| 88 | + | exit; | |
| 89 | + | Memo1.Lines.Clear; | |
| 90 | + | for i:=0 to TreeView1.SelectionCount-1 do | |
| 91 | + | Memo1.Lines.Add(TreeView1.Selections[i].GetTextPath); | |
| 92 | + | end; | |
| 93 | + | ``` | |
| 94 | + | ||
| 95 | + | ## Puunäkymän datan vapautus | |
| 96 | + | ||
| 97 | + | Käyteään puunäkymän OnDeletion -tapahtumaa vapauttaamaan objektit. | |
| 98 | + | ||
| 99 | + | ``` pascal | |
| 100 | + | procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode); | |
| 101 | + | begin | |
| 102 | + | TMyObject(Node.Data).Free; | |
| 103 | + | end; | |
| 104 | + | ``` | |
| 105 | + | ||
| 106 | + | ## Vedä ja pudota menetelmän käyttö puunäkymässä | |
| 107 | + | ||
| 108 | + | Jos halutaan sallia "vedä ja pudota"-menetelmä, niin on | |
| 109 | + | ||
| 110 | + | 1. Asetetaan ominaisuus "DragMode" arvoon DmAutomatic. | |
| 111 | + | 2. Luodaan tapahtuma "OndragOver": | |
| 112 | + | ||
| 113 | + | ``` pascal | |
| 114 | + | procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | |
| 115 | + | begin | |
| 116 | + | Accept := true; | |
| 117 | + | end; | |
| 118 | + | ``` | |
| 119 | + | ||
| 120 | + | ## Katso myös | |
| 121 | + | ||
| 122 | + | - [[doc:/lcl/comctrls/ttreeview.html|TTreeView doc]] | |
| 123 | + | - [[TListView]] | |
| 124 | + | ||
| 125 | + | --- | |
| 126 | + | *From the Free Pascal wiki, page "TTreeView/fi", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
