![]() |
TreeView gibt über Data nicht die richtigen Daten zurück
Hallo,
Also ich habe eine Treeview, die ich aus einer Datenbank mit Werten füttere. in der .Data Property speichere ich die ID des Datensatzes und eine Variable Typ.
Code:
TDatensatz = record
ID: string; Typ: integer; end; Dazu hab ich eine globale Variable
Code:
Datensatz: ^TDatensatz;
Das füllen der Treeview ist auch noch kein Problem.
Code:
procedure TForm1.wsgQuery1AfterScroll(DataSet: TDataSet);
var node2, node3: TTreenode; begin treeview1.Items.Clear; treeview1.Items.BeginUpdate; while not wsgquery2.Eof do begin node2 := treeview1.Items.Addchild(nil, wsgQuery2.fieldByName('Bezeichnung').asstring); node2.ImageIndex := 2; node2.SelectedIndex := 0; node2.Selected := true; New(Datensatz); Datensatz^.Typ := 2; Datensatz^.ID := wsgQuery2.FieldByName('ID_Gewerk').AsString; Node2.Data := Datensatz; while not wsgquery3.Eof do begin node3 := treeview1.Items.Addchild(node2, wsgQuery3.fieldByName('Anfragedatum').asstring); node3.ImageIndex := 3; node3.SelectedIndex := 0; node3.Selected := true; New(Datensatz); Datensatz^.Typ := 3; Datensatz^.ID := wsgQuery3.FieldByName('ID_Anfrage').AsString; Node3.Data := Datensatz; wsgQuery3.next end; wsgQuery2.next; end; treeview1.Items.EndUpdate; treeview1.FullExpand; end; Die Probleme bekomme ich, wenn ich die Daten des gerade gewählten abfragen will. Mit der folgenden Variante bekomme ich zwar ergebnisse, aber es sind nicht die richtigen. Der Typ wird nicht korrekt ausgegeben. Ich habe das gefühl, dass die Daten vom letzten bearbeiteten Knoten stammen. aber nicht vom aktuell gewählten.
Code:
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean); begin if assigned(Datensatz) then begin showmessage('JETZT!!! Changing'); showmessage(inttostr(Datensatz^.Typ)); if Datensatz^.Typ = 2 then begin showmessage(Datensatz^.ID); end; end else begin showmessage('Noch nicht ...'); end; end; Und wenn ich es so Versuche, bekomme ich eine Zugriffsverletzung
Code:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin if assigned(Datensatz) then begin showmessage('JETZT!!! Change'); showmessage(inttostr(TDatensatz(treeview1.selected.Data^).Typ)); if Datensatz^.Typ = 2 then begin showmessage(Datensatz^.ID); end; end else begin showmessage('Noch nicht ...'); end; end; Mein Ziel ist eigentlich beim anklicken eines Knotens auf den dazugehörigen Datensatz zu springen. Das sollte dann auch kein Problem sein, wenn mir die Treeview die richtigen Daten bereit stellt. Bitte helft mir. Danke |
Re: TreeView gibt über Data nicht die richtigen Daten zurück
NodeChanging wird vor dem Knotenwechsel aufgerufen (wie in der Hilfe angegeben). Der erste Code bezieht sich dabei überhaupt nicht auf den Node der dann gewählt wird, sondern nur auf die globale Variable Datensatz (warum die auch immer global ist?? Die Daten hängen am Knoten, da braucht man nichts globales -> sofort als lokale Variable anlegen!). Bei dem zweiten Versuch vorher einfach mal abfragen, ob Node und Data überhaupt ungleich Nil ist, und somit überhaupt Werte enthalten können. Node kann auch Nil sein, wenn ein aktueller Knoten deselektiert wird und genauso gut kann ein Knoten (z.B. Root-Knoten?) ausgewählt werden, welcher überhaupt keine Daten von dem Query enthält und somit auch ein leeres Data besitzt.
Auch empfehle ich, lieber so auf Data zu zu greifen:
Delphi-Quellcode:
Vor allem erstmal die globale Variable entfernen! Die birgt viel mehr Fehlerquellen und Unsicherheiten als Vorteile (wie man vllt. gerade sieht)
PDatensatz = ^TDatensatz;
TDatensatz = record ID: string; Typ: integer; end; ... ShowMessage(PDatensatz(Node.Data)^.ID); |
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Hi,
du kannst dafür keine globale Variable nehmen, dann ist doch klar, dass immer das, was zuletzt eingetragen wurde, ausgelesen werden kann. Du musst erstmal eine lokale Variable vom Typ PDatensatz einführen. Im Code schreibste dann folgendes:
Delphi-Quellcode:
Am besten hängst du diese dann mit AddChildObject an die einzelnen Nodes ran.
New(myPDatensatzVariable);
myPDatensatzVariable^.Irgendwas := BlabBla; |
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Danke euch für die schnelle Antwort. werde es gleich ausprobieren
|
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Aslo, ich glaube, ich habe es hin bekommen.
Habe
Delphi-Quellcode:
in der Funktion deklariert, in der die Daten der einzelnen Knoten erstellt werden. --> lokal!
Datensatz: ^TDatensatz;
Delphi-Quellcode:
Und ich habe die Procedure Treeview1Change folgendermaßen geändert:
procedure TForm1.wsgQuery1AfterScroll(DataSet: TDataSet);
var node2, node3: TTreenode; Datensatz: ^TDatensatz;
Delphi-Quellcode:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin if node <> nil then begin if node.data <> nil then begin showmessage('JETZT!!! Change'); showmessage(inttostr(TDatensatz(node.Data^).Typ)); if TDatensatz(node.Data^).Typ = 2 then begin showmessage(TDatensatz(node.Data^).ID); end; end else begin showmessage('Knoten enthält keine Daten'); end; end else begin showmessage('Kein Knoten gewählt'); end; end; @Muetze1: Das einzige wo ich noch nicht so mit komme ist die Sache mit den Pointern. Zum einen warum ich die lokale Variable eigentlich so richtig brauche. Die ist nach dem Ende der Procedure weg und die Daten sind noch da. Die hängen am Knoten, das ist klar, aber was macht dann die Variable Datensatz? Zum anderen hab ich die Bedeutung dieses ^-Zeichens noch nicht ganz verstanden. Und auf was sie sich bezieht. Du meintest ja, dass ich auf die Daten so zugreifen soll.
Delphi-Quellcode:
Da meckerte Delphi, dass es eine ungültige Typumwandlung sei. Deshalb habe ich einfach dieses Zeichen in die Klammern rein genommen, dann hat es funktioniert. Ich weiß aber nicht warum. Hab ich da noch irgendwo n Fehler in ner Deklaration?
showmessage(TDatensatz(node.Data)^.ID);
|
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Zitat:
Zitat:
wird beim Zugriff der Typ Pointer auf den Pointer-Typ PDatensatz umgewandelt und schon weiss der Compiler auch wie die Daten dort aussehen und das es dort auch ID und Typ gibt.
Zitat:
Zitat:
|
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Ah, so langsam komme ich dahinter.
korrigiere mich, wenn ich falsch liege. Also: Die Variable PDatensatz ist ein Pointer auf TDatensatz, meinen record, und wird direkt nach dem Wort "type" deklariert.
Delphi-Quellcode:
Und dann funktioniert das auch so, wie du das beschrieben hast. Ich hatte die Variable
type
PDatensatz = ^TDatensatz; TDatensatz = record ID: string; Typ: integer; end; TForm1 = class(TForm) ...
Delphi-Quellcode:
innerhalb einer procedure deklariert. Dann hat es nicht funktioniert.
Datensatz: ^TDatensatz
Kann bei der Methode, wie ich sie verwendet habe irgendwas schief laufen oder könnte man das genau so gut so machen? Reicht eigentlich die Kontrolle
Delphi-Quellcode:
um zu überprüfen, ob ich auf data zugreifen kann, oder muß ich noch nachschauen, ob wirklich daten an der Adresse liegen?
if node.Data <> nil then
|
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Zitat:
Zitat:
Zitat:
Hinweis: Um ein Speicherleck zu vermeiden, musst du beim Löschen der Knoten vorher noch den mit New() alloziierten Speicher mit Dispose() wieder frei zu geben. Die TTreeNodes machen dies nicht, da sie nicht wissen was du dort zuweist. Du könntest die Eigenschaft auch für irgendwelche andere Dinge missbrauchen. |
Re: TreeView gibt über Data nicht die richtigen Daten zurück
Danke, ihr habt mir wirklich gut weiter geholfen. Die Treeview steht soweit.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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