Zitat von
UMOL:
Ich glaube, wir reden aneinander vorbei... ;-)
Ja das ist wohl wahr.
OnGetText ist die falsche Prozedur, um mittels StringList die Daten komplett zu beschaffen. Normalerweise beschaffst Du Dir Deine Daten einmalig und hältst sie in einem ContainerObjekt (z.B. der Stringlist). Den VTV baust Du einmalig auf und weisst dabei den Nodes Objekte aus dem ContainerObjekt zu. D.h. ein Node hat die Referenz auf ein Objekt.
In OnGetText wird dann nichts anderes gemacht, als die Referenz auf das Objekt des Nodes (dessen Text bei OnGetText dargestellt werden soll) aufzulösen und dann den String mit entsprechenden Daten des Objektes zu füllen.
Beispiel:
Delphi-Quellcode:
type
TVST_Hostlist_Node = record
HostObj: THost;
end;
PVST_Hostlist_Node = ^TVST_Hostlist_Node;
Delphi-Quellcode:
function vst_Add_Host(_vst: TVirtualStringTree; _parentNode: PVirtualNode; _Host: THost): PVirtualNode;
var
Data : PVST_Hostlist_Node;
begin
Result := _vst.AddChild(_parentNode); // Child-Node erzeugen
_vst.ValidateNode(Result, False); // Pointer initialisieren
Data := _vst.GetNodeData(Result); // Pointer auf Child-Datenbereich holen
Data^.HostObj := _Host;
Logger.Debug2Log('vst_Add_Host: ' + _Host.toString);
end;
Delphi-Quellcode:
procedure TForm1.VST_HostListGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
NodeData : PVST_Hostlist_Node;
lHost : THost;
begin
NodeData := Sender.GetNodeData(Node);
lHost := NodeData.HostObj;
if lHost <> nil then begin
case Column of
0: CellText := lHost.Hostname;
1: CellText := lHost.Hostadress;
2: CellText := lHost.ClientCounterStr;
3: CellText := '';
4: CellText := '';
end;
end;
end;
Gruß,
Christoph