Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#33

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 13:32
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.
  Mit Zitat antworten Zitat