![]() |
Fehlerhafter Zugriff auf NodeData von VirtualStringTree
Ich mache grade meine ersten Schritt mit dem VirtualStringTree. Das Konzept ist ja nicht wirklich schlecht.
Nun bin ich aber auf ein Problem gestoßen, bei dem ich nicht wirklich weiter komme. Ich will Dateien per Drag-and-Drop erfassen und für die weitere Verwendung erst mal ein einem VirtualStringTree darstellen. Das klapp auch sehr gut. Für die Daten die zu den Dateien gehören erstelle ich mir ein Objekt mit den Properties, die ich brauche. Auch keine Problem. Jetzt will ich in einem Formular dem Anwender die Möglichkeit geben, diese Properties noch zu ändern, damit die weitere Verarbeitung individueller wird. Aber wenn ich dann auf mein Datenobjekt zugreife, bekomme ich recht merkwürdige Daten, die Teilweise dann zu einer Exception führen. Hier mal ein bischen Code: Das Datenobject:
Delphi-Quellcode:
Das erstellen von Nodes:
TTreeData = class
private FFilename: string; FIconIndex: Integer; FDokumentenType: TDokumentenTyp; FFGST: Boolean; FTermin: Boolean; FKennzeichen: Boolean; FFiletype: string; FDebitor: Boolean; FFGSTText: string; FKennzeichenText: string; FDebitorText: string; procedure SetDebitor(const Value: Boolean); procedure SetDokumentenType(const Value: TDokumentenTyp); procedure SetFGST(const Value: Boolean); procedure SetFiletype(const Value: string); procedure SetKennzeichen(const Value: Boolean); procedure SetTermin(const Value: Boolean); procedure SetDebitorText(const Value: string); procedure SetFGSTText(const Value: string); procedure SetKennzeichenText(const Value: string); public constructor Create(const AFilename: string; const Kennzeichen, FGST, Debitor, Termin: Boolean; const KennzeichenText, FGSTText, DebitorText: string; const DokumentenTyp: TDokumentenTyp); destructor Destroy; override; property IconIndex: Integer read FIconIndex write FIconIndex; property Filename: string read FFilename write FFilename; property Filetype: string read FFiletype write SetFiletype; property Kennzeichen: Boolean read FKennzeichen write SetKennzeichen; property KennzeichenText: string read FKennzeichenText write SetKennzeichenText; property FGST: Boolean read FFGST write SetFGST; property FGSTText: string read FFGSTText write SetFGSTText; property Debitor: Boolean read FDebitor write SetDebitor; property DebitorText: string read FDebitorText write SetDebitorText; property Termin: Boolean read FTermin write SetTermin; property DokumentenType: TDokumentenTyp read FDokumentenType write SetDokumentenType; end;
Delphi-Quellcode:
Dazugehörig der Constructor von TTreeData:
var
node: PVirtualNode; I: Integer; begin for I := 0 to Files.Count-1 do begin node:=vrtlstrngtr1.AddChild(nil, TTreeData.Create(Files[i], chk_kennzeichen.Checked, chk_vin.Checked, chk_debitor.Checked, chk_termin.Checked, edt_kennzeichen.Text, edt_vin.Text, edt_debitor.Text, TDokumentenTyp(rg_dokumententyp.ItemIndex))); end;
Delphi-Quellcode:
Bis hier hin läuft das sehr gut und vor allem Fehlerfrei.
constructor TTreeData.Create(const AFilename: string; const Kennzeichen, FGST, Debitor, Termin: Boolean; const KennzeichenText, FGSTText, DebitorText: string; const DokumentenTyp: TDokumentenTyp);
begin FFilename := AFilename; FKennzeichen:=Kennzeichen; FKennzeichenText:=KennzeichenText; FFGST:=FGST; FFGSTText:=FGSTText; FDebitor:=Debitor; FDebitorText:=DebitorText; FTermin:=Termin; FDokumentenType:=DokumentenTyp; FIconIndex := -1; end; Das VirtualStringTree liegt auf einem Formular, wo der Anwender dann die Properties zu den TTreeData-Objekten einstellen können soll. Das geschieht folgendermaßen:
Delphi-Quellcode:
Hier treten nun Fehler auf. Im Debugger kann ich sehen, dass z.B. im TreeData.Filename beim Hinzufügen der Nodes der korrekte Dateiname steht.
if vrtlstrngtr1.TotalCount>0 then
begin Node := vrtlstrngtr1.GetFirst(); if (vrtlstrngtr1.SelectedCount=vrtlstrngtr1.TotalCount) or (vrtlstrngtr1.SelectedCount=0) then begin while Assigned(Node) do begin Data := vrtlstrngtr1.GetNodeData(Node); Data.Kennzeichen:=chk_kennzeichen.Checked; Data.KennzeichenText:=edt_kennzeichen.Text; Data.FGST:=chk_vin.Checked; Data.FGSTText:=edt_vin.Text; Data.Debitor:=chk_debitor.Checked; Data.DebitorText:=edt_debitor.Text; Data.DokumentenType:=TDokumentenTyp(rg_dokumententyp.ItemIndex); Node := vrtlstrngtr1.GetNext(Node); end; end else begin while Assigned(Node) do begin if vrtlstrngtr1.Selected[Node] then begin Data := vrtlstrngtr1.GetNodeData(Node); Data.Kennzeichen:=chk_kennzeichen.Checked; Data.KennzeichenText:=edt_kennzeichen.Text; Data.FGST:=chk_vin.Checked; Data.FGSTText:=edt_vin.Text; Data.Debitor:=chk_debitor.Checked; Data.DebitorText:=edt_debitor.Text; Data.DokumentenType:=TDokumentenTyp(rg_dokumententyp.ItemIndex); end; Node := vrtlstrngtr1.GetNext(Node); end; end; vrtlstrngtr1.Refresh; end; Wenn ich aber wieder darauf zugreife (siehe letzter Codeabschnitt), dann bekomme einen gänzlich anderen Speicherbereich, der in das TreeData-Objekt geladen wird. Und das knallt. Da ich zum ersten mal mit VirtualStringTree arbeite bin ich mir nicht ganz sicher, ob ich richtig auf die Daten zugreife. Also meine Frage: Wo mache ich den Fehler? Gruß Hobbycoder |
AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree
Auch hier liefere ich mir selbst die Antwort:
der Zugriff auf das TreeDataObject war falsch. Richtig muss das lauten:
Delphi-Quellcode:
Data := TTreeData(vrtlstrngtr1.GetNodeData(Node)^);
|
AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree
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:
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. :wink: 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. :stupid: |
AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree
und noch ein Tipp:
Wenn du größere Änderungen an der Struktur bzw. den Daten des Treeviews machen mußt, solltest du TreeView.BeginUpdate und TreeView.EndUpdate verwenden. Das verhindert das neuzeichnen des Treeviews während du die Struktur/Daten änderst und vermeided so Flacker-Effekte. |
AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree
Danke für eure Tipps. Ich werde das berücksichtigen. :thumb:
|
AW: Fehlerhafter Zugriff auf NodeData von VirtualStringTree
Zitat:
Delphi-Quellcode:
und Konsorten aufgerufen werden, bevor du dein
OnGetText
Delphi-Quellcode:
vollständig initialisiert hast (für den Fall, dass du beim manuellen Hinzufügen der Nodes per
NodeData
Delphi-Quellcode:
bleibst).
AddChild
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 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