AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fehlerhafter Zugriff auf NodeData von VirtualStringTree
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlerhafter Zugriff auf NodeData von VirtualStringTree

Ein Thema von Hobbycoder · begonnen am 13. Mär 2017 · letzter Beitrag vom 14. Mär 2017
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz