TTreeView Delphi komponent visar en hierarkisk lista över objekt— trädnoder. En nod presenteras av nodtext och en valfri bild. Varje nod i en trädvy är ett exempel på en klass TTreeNode.
Medan du kan fylla i trädvyn med objekt vid designtid, använder du TreeView Items Editor, i de flesta fall skulle du fylla din trädvy vid körning - beroende på vad din ansökan handlar om.
TreeView Items Editor visar att det bara finns en handfull information som du kan "bifoga" till en nod: text och några få bildindex (för normaltillstånd, utökat, valt och lika).
I själva verket är trädvisningskomponenten lätt att programmera mot. Det finns ett par metoder för att lägga till nya noder i trädet och ställa in deras hierarki.
Så här lägger du till 10 noder i trädvyn (med namnet "TreeView1"). Observera att objektegenskaperna ger åtkomst till alla noder i trädet. AddChild lägger till en ny nod i trädvyn. Den första parametern är överordnad nod (för att bygga upp hierarkin) och den andra parametern är nodtexten.
AddChild returnerar den nyligen tillagda TTreeNode. I ovanstående
kodprov, läggs alla 10 noder till som rotnoder (har ingen överordnad nod).I mer komplexa situationer vill du att dina noder ska ha mer information - helst att ha några speciella värden (egenskaper) som är specifika för det projekt du utvecklar.
Säg att du vill visa kundbeställningsdata från din databas. Varje kund kan ha fler beställningar och varje beställning består av fler artiklar. Detta är en hierarkisk relation som man kan visa i en trädvy:
I din databas skulle det finnas mer information för varje beställning och för varje artikel. Trädvyn visar (läsbart) det aktuella läget - och du vill se per beställningsinformation (eller till och med per objekt) för den valda ordningen.
När användaren väljer noden "Order_1_1" vill du att orderinformationen (total summa, datum, etc) ska visas för användaren.
Du kan vid den tidpunkten hämta önskad information från databasen, MEN du skulle behöva känna den unika identifieraren (låt oss säga ett heltal) för den valda ordningen för att ta rätt data.
Vi behöver ett sätt att lagra denna orderidentifierare tillsammans med noden men vi kan inte använda egenskapen Text. Det anpassade värdet vi behöver lagra i varje nod är ett heltal (bara ett exempel).
När en sådan situation inträffar kanske du frestas att leta efter egenskapen Tag (många Delphi-komponenter har) men egenskapen Tag exponeras inte av klassen TTreeNode.
Lägg till anpassade data i trädnoder: TreeNode. Dataegenskap
Egenskapen Data i en trädnod låter dig koppla dina anpassade data till en trädnod. Data är en pekare och kan peka på objekt och poster. Visning av XML-data (RSS-flöde) i en TreeView visar hur du lagrar en inspelningstyp variabel i dataegenskapen i en trädnod.
Många klasser av objekttyp exponerar dataegenskapen - du kan använda för att lagra alla objekt tillsammans med objektet. Ett exempel är TListItem för en TListView-komponent. här är hur man lägger till objekt i egenskapen Data.
Lägg till anpassade data i trädnoder: TreeView. CreateNodeClass
Om du inte vill använda dataegenskapen i TTreeNode, utan snarare vill ha din egen TreeNode utökad med några egenskaper, har Delphi också en lösning.
Säg att du vill kunna göra
Så här utvidgar du standard TTreeNode med några egna egenskaper:
- Skapa din TMyTreeNode genom att utöka TTreeNode.
- Lägg till det en strängegenskap MyProperty.
- Hantera OnCreateNodeClass för trädvyn för att ange din nodklass ska skapas.
- Exponera något som TreeView1_SelectedNode-egenskapen på formnivå. Detta skulle vara av typen TMyTreeNode.
- Hantera trädvyns OnChange för att skriva till SelectedNode värdet på den nod som är vald.
- Använd TreeView1_Selected.myProperty för att läsa eller skriva nytt anpassat värde.
Här är den fullständiga källkoden (TButton: "Button1" och TTreeView: "TreeView1" på ett formulär):
Den här gången används inte dataegenskapen i klassen TTreeNode. Snarare utvidgar du klassen TTreeNode till att ha din egen version av en trädnod: TMyTreeNode.
Med hjälp av händelsen OnCreateNodeClass i trädvyn skapar du en nod i din anpassade klass istället för standard TTreenode-klassen.