AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Pointer beim VirtualStringTree

Ein Thema von Jens Hartmann · begonnen am 4. Dez 2009 · letzter Beitrag vom 6. Dez 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 10:37
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;


Danke schon mal

und Gruß

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 10:41
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 10:48
laß mal das ^ weg
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


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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 10:51
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#5

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 10:57
Edit mißt, daß dereferenzieren war hier ja nötig
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 11:01
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;
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 11:19
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 11:44
Der Ansatz könnte stimmen. jedoch kennt Delphi

Delphi-Quellcode:
  while TOSYSTEM(VSTSystem.GetNodeData(Node)^) = nil do
    pNode := pNode.ParentNode;
ParentNode nicht.
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#9

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 12:01
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Problem mit Pointer beim VirtualStringTree

  Alt 4. Dez 2009, 12:07
Ja, die wird es geben. Ich denke auch das es so funktonieren müsste

    pNode := pNode.Parent; Allerdings, kommt es dann immer genau an der Stelle zu einem Zugriffsfehler, wenn ich den Knoten über Mausklick Erweitern will.
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 03:18 Uhr.
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