![]() |
Problem mit Pointer beim VirtualStringTree
Hallo zusammen,
ich habe ein Problem mit einem VST. Ich möchte Daten aus einer Datenbank in folgendem Aufbau anzeigen.
Code:
Jetzt habe ich das über folgende Weg versucht, bekomme allerdings eine Fehlermeldung beim beenden von meinem Programm, das der Zeiger ungültig ist. Der Fehler muss irgendwo bei FreeNode auftreten.
-Kunde
-Zentrale -Port -IP Hier mal der Code...
Delphi-Quellcode:
:gruebel:
//Einfügen der Daten
DM_PS.ConPSConfig.Connect; DM_PS.Qry_VSTSystemCreate.Open; DataSys := TOSYSTEM.Create; VSTSystem.BeginUpdate; with DataSys do begin DataSys.Objekt := DM_PS.Qry_VSTSystemCreate.FieldByName('KUNDE').AsString; case DM_PS.Qry_VSTSystemCreate.FieldByName('ZENTRALENTYP').AsInteger of 0: DataSys.Zentrale := 'NOVAR HB/MB 24'; 1: DataSys.Zentrale := 'NOVAR HB/MB 48'; 2: DataSys.Zentrale := 'NOVAR MB100'; 3: DataSys.Zentrale := 'NOVAR MB256'; 4: DataSys.Zentrale := 'BOSCH UEZ2000'; 5: DataSys.Zentrale := 'NOVAR BMC 1024'; 6: DataSys.Zentrale := 'ESSER IQ8 Control'; 7: DataSys.Zentrale := 'SONSTIGE'; end; DataSys.COM := 'COM 1, 9600,8,1'; DataSys.IP := '192.168.100.101'; end; pNode := VSTSystem.AddChild(nil,DataSys); pNode := VSTSystem.AddChild(pNode,DataSys); pNode := VSTSystem.AddChild(pNode,DataSys); VSTSystem.AddChild(pNode,DataSys); VSTSystem.EndUpdate; VSTSystem.Refresh; //FreeNode var DataSys : TOSYSTEM; begin DataSys := TOSYSTEM(VSTSystem.GetNodeData(Node)^); DataSys.Free; Danke schon mal und Gruß Jens |
Re: Problem mit Pointer beim VirtualStringTree
Naja, du weist 4mal dem VST dasselbe Objekt zu. dadurch (wenn es initialisiert ist) wird es auch viermal gelöscht, was quasi dreimal zu viel ist.
|
Re: Problem mit Pointer beim VirtualStringTree
laß mal das ^ weg
Delphi-Quellcode:
du hat ja die Instanz gespeichert und nicht einen Zeiger auf die Instanz, also brauchst/darfst du auch nicht dereferenzieren :zwinker:
DataSys := TOSYSTEM(VSTSystem.GetNodeData(Node));
Und dann natürlich das von sirius schon Gesagte. PS: wozu das With, wenn du dann eh die Variable wieder verwendest?
Delphi-Quellcode:
with DataSys do
begin DataSys. |
Re: Problem mit Pointer beim VirtualStringTree
Ja das habe ich mir auch schon gedacht, allerdings weiß ich nicht so recht, wie ich den Aufbau des VST hinbekomme.
Code:
-Level1
-Level2 -Level3 -Level3 |
Re: Problem mit Pointer beim VirtualStringTree
Edit mißt, daß dereferenzieren war hier ja nötig :wall:
also nur sirius's vorschlag. Entweder du gibts beim Fregeiben nur das Objekt vom Elternnode (Level1) frei und nicht bei den SubNodes, dann wird es auch nur einmal Freigegeben oder du gibst nur dem Elternnode das Objekt
Delphi-Quellcode:
und wenn du jetzt auf das Objekt zugreifen willst, dann prüfst du dort.
pNode := VSTSystem.AddChild(nil, DataSys);
pNode := VSTSystem.AddChild(pNode); pNode := VSTSystem.AddChild(pNode); VSTSystem.AddChild(pNode); - ist TOSYSTEM(VSTSystem.GetNodeData(Node)^) = nil dann nimm das vom ParentNode (ist es da auch auch NIL geht es so weiter, bis das Objekt gefunden wurde) |
Re: Problem mit Pointer beim VirtualStringTree
Ja, das hatte ich so auch schon mal versucht...
Delphi-Quellcode:
allerdings, stimmt dan irgendwo was bei meiner GetText Anweisung nicht.
pNode := VSTSystem.AddChild(nil,DataSys);
pNode := VSTSystem.AddChild(pNode); pNode := VSTSystem.AddChild(pNode); VSTSystem.AddChild(pNode);
Delphi-Quellcode:
var
DataSys : TOSYSTEM; // ein Zeiger auf die Datenstruktur begin DataSys := TOSYSTEM(VSTSystem.GetNodeData(Node)^); case VSTSystem.GetNodeLevel(Node) of 0: case Column of 0: Celltext := DataSys.Objekt; end; 1: case Column of 0: Celltext := DataSys.Zentrale; end; 2: case Column of 0: Celltext := DataSys.IP; end; 3: case Column of 0: Celltext := DataSys.COM; end; end; end; |
Re: Problem mit Pointer beim VirtualStringTree
müßte dann wohl irgendwie so aussehn ... in diesem Fall müßtest du ja erstmal den Node suchen.
Delphi-Quellcode:
var
Node: PVirtualNode; Level: Integer; DataSys : TOSYSTEM; // ein Zeiger auf die Datenstruktur begin Level := VSTSystem.GetNodeLevel(Node); while TOSYSTEM(VSTSystem.GetNodeData(Node)^) = nil do Node := Node.ParentNode; DataSys := TOSYSTEM(VSTSystem.GetNodeData(Node)^); case Level of 0: case Column of 0: Celltext := DataSys.Objekt; end; 1: case Column of 0: Celltext := DataSys.Zentrale; end; 2: case Column of 0: Celltext := DataSys.IP; end; 3: case Column of 0: Celltext := DataSys.COM; end; end; end; |
Re: Problem mit Pointer beim VirtualStringTree
Der Ansatz könnte stimmen. jedoch kennt Delphi
Delphi-Quellcode:
ParentNode nicht.
while TOSYSTEM(VSTSystem.GetNodeData(Node)^) = nil do
pNode := pNode.ParentNode; |
Re: Problem mit Pointer beim VirtualStringTree
Zitat:
|
Re: Problem mit Pointer beim VirtualStringTree
Ja, die wird es geben. Ich denke auch das es so funktonieren müsste
Delphi-Quellcode:
Allerdings, kommt es dann immer genau an der Stelle zu einem Zugriffsfehler, wenn ich den Knoten über Mausklick Erweitern will.
pNode := pNode.Parent;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 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