Ich würde auch nur noch auf ein VST zurückgreifen, es arbeitet sich damit wesentlich leichter.
OK, auch ich habe anfangs da so meine Schwierigkeiten gehabt, es ist schon eine recht "große" Komponente.
Jedoch wenn man sich dann etwas auskennt merkt man das soooo viele Vorteile vorhanden sind.
Das klassiche Tutorial zu dem VST ist für Einsteiger sicher ein guter Anfang.
ABER: So würde ich nicht mehr mit VST arbeiten. Im Tutorial wird für den NodeText immer erst ein Record(man kann auch ne Klasse/Instanz) angelegt.
In diesem dann Text abgelegt und im "onGetText" Event, erst die Node-Daten holen(zugriff auf das Record) und dann wird der Text zugewiesen.
Hierbei muss noch eine "onNodeInit" procedure bestückt werden....naja alles viel Vorbereitungsarbeit.
Ich mache das jetzt immer so, das zu einem VST eine Datenklasse gehört (man soll ja sowieso Daten und GUI-Komponenten voneinander trennen).
Also grobes Beispiel. Alle deine Datenbankeinträge (was ja auch schon wie so eine Art eigene Klasse angesehen werden kann) kannst du direkt im onGetText-Event den Node-Text zuweisen. Dabei würde aber immer wieder auf die Datenbank zugeriffen da die Nodetexte dynamisch dargestellt werden.
Du könntest als Datenklasse ein TStringlist nutzen. Alle Daten(Texte) die du anzeigen willst kommen dort "einmal" rein und dann kannst du die Texte leicht darstellen lassen.
Code: Alles auswählen
var SL:TStringList;
procedure TfrmMain.ProjektBaumGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: String);
begin
CellText := SL[Node^.index];
end;
Wenn du mehrere Zellen mit unterschiedlichem Text hast brauchst du etwas anderes als eine StringList.
Ich habe in meinen Projekten wiegesagt immer eine Daten Klasse.
Code: Alles auswählen
type MeineDatenklasse: TMyData;
var ObjectList: TObjectList;
procedure TfrmMain.ProjektBaumGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: String);
begin
case Column of
0 : CellText := TMyData(ObjectList.items[Node^.index]).Text_1;
1 : CellText := TMyData(ObjectList.items[Node^.index]).Text_2;
end;
// oder kürzer
with TMyData(ObjectList.items[Node^.index]) do
case Column of
0 : CellText := Text_1;
1 : CellText := Text_2;
end;
end;
EDIT:
Für diese art der Darstellung von Texten (und auch Bilder wenn man mag) spart einiges an Vorbereitungen und was am aller wichtigsten ist, du arbeitest Komponenten unabhängiger.
Du könntest das VST gegen etwas anderes ersetzen und musst dann noch noch in GUI die Ausgabe/Ansicht anpassen.