Ich kann es zwar jetzt kompilieren aber ich verstehe noch immer etwas nicht.
Einmal steht in GetText:
Delphi-Quellcode:
{$IFDEF WITHCARDINAL}
CellText := FMyDataClasses[NodeData^].Name;
{$ELSE}
CellText := NodeData^.Name;
{$ENDIF}
Und ein anderes mal in InitChildren:
Delphi-Quellcode:
{$IFDEF WITHCARDINAL}
NodeData^ := Node^.Index;
{$ELSE}
NodeData^ := FMyDataClasses[Node^.Index];
{$ENDIF}
WITHCARDINAL ist also vertauscht. Was ist das richtige?
Hallo Jim,
vertauscht ist da nichts. Das ist schon alles richtig so. In der Version WITHCARDINAL habe ich in NodeData^ nur den Index des Objektes in der TObjectList. Folglich muss ich bei GetText auf das Object in der TObjectList mit dem Index NodeData^ zugreifen.
Ich hatte mit den Compilerschaltern nur zeigen wollen, dass man entweder mit einem Index ODER mit einem (Zeiger auf ein) Objekt arbeiten kann. Das war jetzt vielleicht etwas verwirrend. Am besten suchst du dir eine Variante aus und löschst dann alles was nicht dazu gehört. Dann wird aus dem oben gezeigten SourceCode bspw. folgendes:
Ich bleibe jetzt mal bei der Variante mit dem Object. Die ist nachher an allen anderen Stellen im SourceCode wesentlich übersichtlicher.
Delphi-Quellcode:
procedure TForm1.vst1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
NodeData: PMyDataClass;
begin
if (vst1.GetNodeLevel(Node) = 0) then begin
NodeData := vst1.GetNodeData(Node);
CellText := NodeData^.Name;
end else
CellText := 'SubItem ' + IntToStr(Node^.Index + 1);
end;
procedure TForm1.vst1InitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
var InitialStates: TVirtualNodeInitStates);
var
NodeData: PMyDataClass;
begin
NodeData := vst1.GetNodeData(Node);
NodeData^ := FMyDataClasses[Node^.Index];
if (vst1.GetNodeLevel(Node) = 0) then begin // Nur auf dem ersten NodeLevel Children zulassen
if (NodeData^.HasChildren) then begin
Include(InitialStates, ivsHasChildren); // Hier wird im Status der Node vermerkt, dass die Node mindestens 1 ChildNode hat und das + Symbol angezeigt werden soll
end;
end;
end;
Im Init wird einmal das Objekt zugewiesen und nachher wird mit Hilfe von
NodeData^
immer wieder direkt darauf zugegriffen. Ich hoffe das hier macht es etwas übersichtlicher. Wenn nicht, dann frag nochmal nach. Ich helfe dir gerne. Stand anfangs vor dem selben Problem und hatte mich immer ein Stückchen weiter vorgearbeitet.