Einzelnen Beitrag anzeigen

Aviator

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

AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree

  Alt 13. Mär 2017, 20:27
Hallo Hobbycoder,

ich finde es super, dass du nicht aufgibst und auch immer weiter probierst und testest. Nur so kann man beim Programmieren was schaffen.

Ich würde dir für den Anfang mal die Advanced VirtualTree Demo ans Herz legen die mit dem VirtualTreeView mitkommt. Da kann man sehr viel lernen. Es ist allerdings eher eine Einstiegsdemo auch wenn sie Advanced heißt. Gewisse Dinge sollte man anders lösen als es in der Demo gemacht wird.

Hier mal noch ein paar Tipps wie du deinen eigenen Source verbessern kannst:
  • Benutze anstatt von vst.AddChild() lieber die RootNodeCount Property des VirtualTrees. Die trifft das virtuelle etwas besser, da immer nur die Nodes initialisiert werden, die aktuell sichtbar sind oder bereits sichtbar waren. Für den Anfang kann man zwar AddChild() verwenden, aber das solltest du dir besser nicht angewöhnen. Hier verweise ich immer gerne auf den Kommentar von Mike Lischke der über der AddChild() Function in der VirtualTrees.pas zu finden ist.
    Delphi-Quellcode:
    procedure TForm1.InitTree;
    begin
      vst1.RootNodeCount := 10; // <-- Hier die Anzahl der benötigten Nodes auf der RootEbene eintragen
    end;
    Hinzu kommt, dass du dann das Event OnInitNode() und OnInitChildren() benutzen musst, um die entsprechenden Nodes zu initialisieren. Du kannst ja einmal selbst ausprobieren, ob du weiter kommst. Falls nicht, lass es uns wissen und wir helfen dir. Es kann natürlich immer etwas dauern bis mal jemand zurückschreiben kann. Also nicht direkt nervös werden.
  • Verwende Pointer anstelle von harten Casts
    Delphi-Quellcode:
    PTreeData = ^TTreeData;

    procedure TForm1.vst1GetText(Sender: TBaseVirtualTree; Column: TColumnIndex; Node: PVirtualNode; CellText: string); // <-- Der Header könnte ein paar Fehler haben, habe ich jetzt mal so aus dem Kopf runtergetippt (glaube hier fehlt noch StaticText oder sowas
    var
      NodeData: PTreeData;
    begin
      NodeData := Sender.GetNodeData(Node);
      case Column of
        0: CellText := NodeData^.DebitorText;
        1: CellText := NodeData^.FGSTText;
      end;
    end;
  • Ein weiterer Tipp der bei mir bisher immer gut funktioniert hat: Verwende immer (wie das in der VirtualTreeView Komponente auch gemacht wird) die Bezeichner Node für PVirtualNode und NodeData für PTreeData (oder auch einen anderen Datentyp). Der Vorteil ist, dass du immer die gleichen Bezeichner hast und dich nicht jedes Mal aufs Neue ärgerst, dass dir der Bezeichner gerade nicht einfällt.
  • Verwende das OnGetNodeDataSize Event um die NodeDataSize festzulegen. Das ist vor allem bei Records wichtig, da die in der Größe variieren. Bei Zeigern auf eine Objektinstanz ist es soweit ich weiß nicht zwingend erforderlich, da der DefaultWert auf 4 Byte gesetzt wurde. Hier könnte es bei 64-bit Kompilaten zu Problemen kommen.
    Delphi-Quellcode:
    procedure TForm1.vst1OnGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
    begin
      NodeDataSize := SizeOf(TTreeData); // Achtung: Hier nicht den Pointer sondern den eigentlichen Record bzw. die Klasse verwenden
    end;
  • Schau dir mal die Methoden TVirtualStringTree.GetNext, TVirtualStringTree.GetNextSelected, TVirtualStringTree.GetNextVisible, TVirtualStringTree.GetNextChecked usw. an. Analog dazu gibt es auch TVirtualStringTree.GetPrevious, ... Methoden. Somit musst du bspw. nicht selbst prüfen, ob eine Node gerade Selected ist. Der Tree durchsucht sich selbst und gibt dir die entsprechende Node zurück. Spart dir einiges an Tipparbeit und geht meistens auch ein Ticken schneller.

So jetzt fällt mir langsam nichts mehr ein was ich dir für deinen Source bzw. genrell für Tipps für den VST geben kann. Ich hoffe du kannst damit etwas anfangen.

PS: Und nicht beleidigt sein, dass nicht innerhalb von einer Stunde jemand geantwortet hat. Gerade um die Zeit sind nicht mehr so viele auf der Arbeit und haben Feierabend und wollen nichts mehr vom Programmieren wissen.
  Mit Zitat antworten Zitat