Sla meer aangepaste gegevens op in de boomknoop van een boomweergave

De component TTreeView Delphi geeft een hiërarchische lijst met items-boomknooppunten weer. Een knooppunt wordt gepresenteerd door knooppunttekst en een optionele afbeelding. Elk knooppunt in een structuurweergave is een instantie van een klasse TTreeNode.

Hoewel je tijdens het ontwerpen de boomweergave kunt invullen met items, met behulp van de TreeView Items Editor, vul je in de meeste gevallen je boomweergave tijdens de uitvoering in, afhankelijk van waar je applicatie over gaat.

De TreeView Items Editor onthult dat er slechts een handvol informatie is die u kunt "koppelen" aan een knooppunt: tekst en een paar afbeeldingsindexen (voor de normale status, uitgebreid, geselecteerd en gelijksoortig).

In essentie is de boomweergavecomponent eenvoudig te programmeren. Er zijn een aantal methoden om nieuwe knooppunten aan de structuur toe te voegen en hun hiërarchie in te stellen.

U kunt als volgt 10 knooppunten toevoegen aan de boomstructuur ("TreeView1" genoemd). Merk op dat de eigenschap Items toegang biedt tot alle knooppunten in de boom. AddChild voegt een nieuw knooppunt toe aan de boomstructuur. De eerste parameter is het bovenliggende knooppunt (om de hiërarchie op te bouwen) en de tweede parameter is de knooppunttekst.

AddChild retourneert de nieuw toegevoegde TTreeNode. In het bovenstaande codevoorbeeld worden alle 10 knooppunten toegevoegd als hoofdknooppunten (hebben geen bovenliggend knooppunt).

In meer complexe situaties wilt u dat uw knooppunten meer info bevatten - bij voorkeur enkele speciale waarden (eigenschappen) die specifiek zijn voor het project dat u ontwikkelt.

Stel dat u klantorder-artikelgegevens uit uw database wilt weergeven. Elke klant kan meer bestellingen hebben en elke bestelling bestaat uit meer artikelen. Dit is een hiërarchische relatie die men in een boomstructuur kan weergeven:

In uw database zou er meer informatie zijn voor elke bestelling en voor elk item. De boomstructuur toont de (alleen-lezen) huidige status - en u wilt per order (of zelfs per item) details zien voor de geselecteerde order.

Wanneer de gebruiker het knooppunt "Order_1_1" selecteert, wilt u dat de bestelgegevens (totale som, datum, enz.) Aan de gebruiker worden weergegeven.

U kunt op dat moment de vereiste gegevens uit de database halen, MAAR u zou de unieke identificatie (laten we zeggen een geheel getal) van de geselecteerde volgorde moeten weten om de juiste gegevens te verzamelen.

We hebben een manier nodig om deze bestelidentificatie samen met het knooppunt op te slaan, maar we kunnen de eigenschap Text niet gebruiken. De aangepaste waarde die we in elk knooppunt moeten opslaan, is een geheel getal (slechts een voorbeeld).

Wanneer een dergelijke situatie zich voordoet, kunt u in de verleiding komen om te zoeken naar de eigenschap Tag (veel Delphi-componenten hebben) maar de eigenschap Tag wordt niet weergegeven door de klasse TTreeNode.

Aangepaste gegevens toevoegen aan boomknooppunten: de eigenschap TreeNode.Data

Met de eigenschap Data van een boomknooppunt kunt u uw aangepaste gegevens koppelen aan een boomknooppunt. Gegevens zijn een aanwijzer en kunnen verwijzen naar objecten en records. De XML-gegevens (RSS-feed) weergeven in een TreeView laat zien hoe een recordtype variabele kan worden opgeslagen in de eigenschap Data van een boomknooppunt.

Veel itemtypeklassen leggen de eigenschap Data bloot, die u kunt gebruiken om elk object samen met het item op te slaan. Een voorbeeld is het TListItem van een TListView-component. U kunt als volgt objecten toevoegen aan de eigenschap Data.

Aangepaste gegevens toevoegen aan boomknooppunten: The TreeView.CreateNodeClass

Als u de eigenschap Data van de TTreeNode niet wilt gebruiken, maar liever uw eigen TreeNode wilt uitbreiden met enkele eigenschappen, heeft Delphi ook een oplossing.

Stel dat je dat wilt kunnen doen

Ga als volgt te werk om de standaard TTreeNode uit te breiden met een paar eigen eigenschappen:

  1. Maak uw TMyTreeNode door de TTreeNode uit te breiden.
  2. Voeg een stringeigenschap MyProperty toe.
  3. Gebruik de OnCreateNodeClass voor de structuurweergave om aan te geven dat uw knooppuntklasse moet worden gemaakt.
  4. Stel zoiets als eigenschap TreeView1_SelectedNode op het formulierniveau bloot. Dit zou van het type TMyTreeNode zijn.
  5. Gebruik de OnChange-structuurweergave om de waarde van het geselecteerde knooppunt naar de SelectedNode te schrijven.
  6. Gebruik TreeView1_Selected.myProperty om een ​​nieuwe aangepaste waarde te lezen of te schrijven.

Hier is de volledige broncode (TButton: "Button1" en TTreeView: "TreeView1" op een formulier):

Deze keer wordt de eigenschap Data van de klasse TTreeNode niet gebruikt. In plaats daarvan breidt u de klasse TTreeNode uit met uw eigen versie van een boomknooppunt: TMyTreeNode.

Met behulp van de OnCreateNodeClass-gebeurtenis van de structuurweergave maakt u een knooppunt van uw aangepaste klasse in plaats van de standaard TTreenode-klasse.