Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Pointer beim VirtualStringTree (https://www.delphipraxis.net/144292-problem-mit-pointer-beim-virtualstringtree.html)

Jens Hartmann 4. Dez 2009 10:37


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:
-Kunde
  -Zentrale
    -Port
    -IP
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.

Hier mal der Code...

Delphi-Quellcode:
  //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;
:gruebel:

Danke schon mal

und Gruß

Jens

sirius 4. Dez 2009 10:41

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.

himitsu 4. Dez 2009 10:48

Re: Problem mit Pointer beim VirtualStringTree
 
laß mal das ^ weg
Delphi-Quellcode:
DataSys := TOSYSTEM(VSTSystem.GetNodeData(Node));
du hat ja die Instanz gespeichert und nicht einen Zeiger auf die Instanz, also brauchst/darfst du auch nicht dereferenzieren :zwinker:


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.

Jens Hartmann 4. Dez 2009 10:51

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

himitsu 4. Dez 2009 10:57

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:
pNode := VSTSystem.AddChild(nil, DataSys);
pNode := VSTSystem.AddChild(pNode);
pNode := VSTSystem.AddChild(pNode);
VSTSystem.AddChild(pNode);
und wenn du jetzt auf das Objekt zugreifen willst, dann prüfst du dort.

- 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)

Jens Hartmann 4. Dez 2009 11:01

Re: Problem mit Pointer beim VirtualStringTree
 
Ja, das hatte ich so auch schon mal versucht...
Delphi-Quellcode:
  pNode := VSTSystem.AddChild(nil,DataSys);
  pNode := VSTSystem.AddChild(pNode);
  pNode := VSTSystem.AddChild(pNode);
  VSTSystem.AddChild(pNode);
allerdings, stimmt dan irgendwo was bei meiner GetText Anweisung nicht.

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;

himitsu 4. Dez 2009 11:19

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;

Jens Hartmann 4. Dez 2009 11:44

Re: Problem mit Pointer beim VirtualStringTree
 
Der Ansatz könnte stimmen. jedoch kennt Delphi

Delphi-Quellcode:
  while TOSYSTEM(VSTSystem.GetNodeData(Node)^) = nil do
    pNode := pNode.ParentNode;
ParentNode nicht.

himitsu 4. Dez 2009 12:01

Re: Problem mit Pointer beim VirtualStringTree
 
Zitat:

Zitat von Jens Hartmann
jedoch kennt Delphi ParentNode nicht.

ich hab jetzt leider nicht den Aufbau des VST im Kopf ... aber irgendwie muß es ja möglich sein, den Parent eines Nodes abzufragen :stupid:

Jens Hartmann 4. Dez 2009 12:07

Re: Problem mit Pointer beim VirtualStringTree
 
Ja, die wird es geben. Ich denke auch das es so funktonieren müsste

Delphi-Quellcode:
    pNode := pNode.Parent;
Allerdings, kommt es dann immer genau an der Stelle zu einem Zugriffsfehler, wenn ich den Knoten über Mausklick Erweitern will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz