![]() |
Daten-Rekord zu TreeView hinzufügen - Problem/AV
Ich bin scheinbar wieder zu doof die Sachen anzuwenden, die ich einst gelernt habe.
Für eine VirtualStringTree die nur sehr wenige Nodes enthalten soll (weniger als 10), benutze ich ein Rekord und folgendes Konstrukt:
Delphi-Quellcode:
type
PVSTData = ^TVSTData; TVSTData = packed record sTitle, sInformation: string; end;
Delphi-Quellcode:
Den Code AddVSTStructure habe ich vor langer Zeit hier im Forum gefunden und er hat auch immer funktioniert.
procedure AddVSTStructure(aVST: TVirtualStringTree; aRecord: TVSTData);
var Data: PVSTData; Node: PVirtualNode; begin Node := aVST.AddChild(nil); Data := aVST.GetNodeData(Node); Data^ := aRecord; end; procedure TForm1.Button1Click(Sender: TObject); var aVSTData: TVSTData; begin aVSTData.sTitle:= 'Title'; aVSTData.sInformatio := 'Info'; AddVSTStructure(VirtualStringTree1, aVSTData); end; procedure TForm1.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Data: PVSTData; begin Data := VirtualStringTree1.GetNodeData(Node); Finalize(Data^); end; Nur bei diesem simplen Beispiel erhalte ich eine AV beim Klicken auf den Button (Zugriffsverletzung). Der node wird hinzugefügt, es gibt aber eine AV. Das Problem ist: mein Testprojekt enthält nur diesen Button, das VST und sonst nichts. |
AW: Ich bin wieder zu doof - TreeView
Gibt Deinem Beitrag bitten dennoch einen Aussagekräftigen Titel - das macht es für andere leichter, diesen zu finden, wenn sie ein ähnliches Problem haben.
Danke Dir. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
In welcher Zeile tritt denn die access violation auf?
Mir ist aufgefallen, dass bei deiner AddVSTStructure Methode der Aufruf von ValidateNode fehlt. Aber das hat nichts mit der access violation zu tun... . Das ganze sollte jedoch so aussehen:
Delphi-Quellcode:
function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode;
var Data: PTreeData; begin Result:=AVST.AddChild(ANode); Data:=AVST.GetNodeData(Result); Avst.ValidateNode(Result, False); Data^.FCaption:=ARecord.FCaption; end; Zitat:
Grüße Headbucket |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Also am SourceCode selbst kann ich keinen Fehler erkennen. Bist du mal mit dem Debugger durchgegangen und hast dir (ggf. anhand des StackTraces) mal angeschaut wo er die AV bringt?
EDIT: Von der Methode AddChild() sollte man generell Abstand nehmen. Siehe auch den Kommentar über dere AddChild() Methode in der VirtualTrees.pas Dann brauchst du auch keine ValidateChildren mehr, da du die Daten dann selbst vorhalten musst. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Wo die AV auftritt weiß ich nicht. Der Code hat wie gesagt bisher immer wunderbar funktioniert.
Delphi-Quellcode:
Ich hasse VirtualStringTree einfach.
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var Data: PVSTData; begin Data := VirtualStringTree1.GetNodeData(Node); CellText := Data.sTitle; end; Ich dachte ich kann schnell einen Node mit 1 Children erzeugen und delbst das klappt nicht. Edit: Zitat:
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Zitat:
Delphi-Quellcode:
CellText := Data^.sTitle;
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Zitat:
Also im Prinzip einfach: wenn ich die Zeile im Button mit AddVSTStructure() weglasse, kommt keine AV. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Data ist ein Zeiger. Du versuchst also in GetText auf die Adresse dieses Zeigers zuzugreifen und dort dann auf den Record...das klappt natürlich nicht. Du solltest auf den INHALT des Zeigers zugreifen:
Delphi-Quellcode:
Hast du ValidateNode hinzugefügt?
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var Data: PVSTData; begin Data := VirtualStringTree1.GetNodeData(Node); CellText := Data^.sTitle; end; Grüße Headbucket |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Liste der Anhänge anzeigen (Anzahl: 1)
Ich baue euch mal eine Demo.
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Lass mal das FreeNode Event komplett weg. Nimm es aus dem Objektinspektor einfach mal raus. Spielt jetzt erstmal keine Rolle ob ein Memory Leak ensteht oder nicht. Wenn dann keine AV mehr kommt, dann kann ich es mir nur noch so erklären, dass es an dem Finalize() liegt. Obwohl das eigentlich kein Problem machen sollte.
Das Ding ist nur, dass beim Klick auf den Button noch kein FreeNode ausgeführt wird, deshalb dürfte der Fehler auch da nicht drin liegen. Welche VST Version verwendest du denn? Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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 by Thomas Breitkreuz