Lagra mer anpassade data i trädnoden i en trädvy

TTreeView Delphi-komponenten visar en hierarkisk lista med artiklar-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 med hjälp av TreeView Items Editor, skulle du i de flesta fall fylla din trädvy vid körning - beroende på vad din applikation 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 artikel) för den valda ordningen.

När användaren väljer noden "Order_1_1" vill du att beställningsinformationen (total summa, datum osv.) Ska visas för användaren.

Du kan vid den tidpunkten hämta nödvändig data 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 kan du bli frestad 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: Egenskapen TreeNode.Data

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 man lagrar en posttypvariabel i dataegenskapen i en trädnod.

Många klasser av objekttyp exponerar egenskapen Data-du kan använda för att lagra alla objekt tillsammans med objektet. Ett exempel är TListItem för en TListView-komponent. Så här lägger du 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:

  1. Skapa din TMyTreeNode genom att utöka TTreeNode.
  2. Lägg till det en strängegenskap MyProperty.
  3. Hantera OnCreateNodeClass för trädvyn för att ange din nodklass ska skapas.
  4. Exponera något som TreeView1_SelectedNode-egenskapen på formnivå. Detta skulle vara av typen TMyTreeNode.
  5. Hantera trädvyns OnChange för att skriva till SelectedNode värdet på den nod som är vald.
  6. 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 för din anpassade klass istället för standard TTreenode-klassen.