![]() |
Treeview und datapointer...
Hallo,
ich möchte Informationen in einen Treeview überführen. Dazu mache ich folgendes:
Delphi-Quellcode:
LastInserted ist vom Typ TTreeNode, Im ParamArray werden 3 Querys übergeben, um diese im Treeview darzustellen.
...
LastInserted.Data:= ParamArray[i].FieldByName(ParamArray[i].FieldList[0].FieldName); ... Den Datapointer lasse ich auf ein Feld des Datasets der Query zeigen. Meine Frage: Wie kann ich die gespeicherte Information wieder auslesen? Kann ich das überhaupt? Oder muss ich den Pointer auf etwas anderes zeigen lassen. Ich möchte ja eigentlich der Wert des Feldes haben! Danke & Gruß, Barnti |
Re: Treeview und datapointer...
Hmm,
ich versuche das noch mal zu verdeutlichen: Ich möchte die Informationen meiner Query in eine Treeview überführen. Dazu möchte ich in jedem Knoten das aktuelle Record speichern. In Etwa so:
Delphi-Quellcode:
Die zweite Frage ist wie kann ich die Informationen wieder auslesen, wenn ich z.B. den Inhalt des pointers (Record der Query) an einer bestimmten Stelle, sprich ein Feld, auslesen möchte?
... // einfügen eines neuen Knotens mit der Betitelung
// der ID des akt. records LastInserted:= Treeview.Items.AddChild(node,Query.FieldByName('ID')); LastInserted.Data:= Query.? // wie bekomme ich hier einen Zeiger auf das aktuelle // Record gespeichert????? Kann jemand helfen. Meine Pointer-Kenntnisse sind etwas eingestaubt! Danke, Barnti |
Re: Treeview und datapointer...
Hi,
grundsätzlich ist die Eigenschaft Data des TTreeNode vom neutralen Typ Pointer. Alles was du mit einem typisierten Pointer vorrätig hast kannst du jetzt dort hinterlegen. Willst du den Pointer auf deine Daten zurückhaben, so mache einfach folgendes:
Delphi-Quellcode:
Danach zur Sicherheit auf nil prüfen und du kannst mit deiner Variablen wie gewohnt weiterarbeiten. Das gilt so auch für Objekte!
MeinetTypPointerVariable := TypPointer(TreeView.Data);
Hier auch mal ein Bsp.: var MObject : TObject; begin MyObject := TObject.Create; MyTreeNode.Data := Pointer(MyObject); .... MyObject := TObject(MyTreeNode.Data); // und dann weiter auf Members von MyObject wie gewohnt zugreifen MyObject.Free; end; [delphi] Gruß oki |
Re: Treeview und datapointer...
Hallo Oki,
ich habe mal nach Deinem Beispiel gearbeitet:
Delphi-Quellcode:
Ansonsten habe ich Deine Anweisungen eingehalten. Der Pointer kann nicht nil sein, da ich diesen ja vorher zuweise.
var LastInserted: TTreenode;
... LastInserted.Data:= Pointer(ParamArray[i].DataSource.DataSet.Fields); Fields:= TFields(Lastinserted.Data^); [edit] Ok, hier nur TFields (Lastinserted.Data). Aber warum? Muss ich nicht auf den Inhalt zugreifen? [/edit] ShowMessage(Fields.DataSet.FieldByName('ID').AsString); // An dieser Stelle // steigt Delphi mit // einer Schutzverletzung aus... Was mache ich jetzt noch falsch? Gruß, Barnti |
Re: Treeview und datapointer...
Hi,
mir fehlt offensichtlich noch ein Stück vom Anfang Deiner Anwendung. Aber grundsätzlich mal folgendes. Wenn du eine aktuelle Querry im Data halten willst, dann mußt du natürlich auch sicherstellen, dass die Instanz auf die dein Pointer zeigt noch vorhanden ist. Desweiteren fällt mir auf, dass du hier nicht den Zeiger zuweist, sondern den Inhalt( durch die dereferenzierung ^). Ich denke, die korrekte Zeile muß so lauten:
Delphi-Quellcode:
Fields:= TFields(Lastinserted.Data);
Gruß oki |
Re: Treeview und datapointer...
Ist mir auch mit Schrecken aufgefallen, daß Bezug auf die ParamListe eines Queries genommen wird, daß klicks später vielleicht schon zerstört wird... :wall:
Wenn Du unbedingt ein paar Daten speichern mußt, mach Dir ein record : RMyData = packed record ID : integer; // Bla end; PMyData = ^RMyData; function NewData: PMyData; begin New(Result); end; Dann knall Dir das in den TreeView : ... LastInserted.Data := NewData; ... und nun bearbeiten : ... PMyData(LastInserted.Data)^.ID := Fields[0].AsInteger; // weißt schon ;-) ... LG, MyRealName |
Re: Treeview und datapointer...
Hallo,
ich habe es mit dem Beispiel von Oki hinbekommen. Danke, Oki! Zitat:
Die Prozedur dient lediglich dem Darstellen einer oder mehrerer Querys als Treeview. Mit einem Klick kann man dann auf den Inhalt des Trees(data) zugreifen... Besteht da ein Problem, welches ich nicht sehe? Gruß & Danke, Barnti |
Re: Treeview und datapointer...
Wenn Du ein Query benutzt, um immer wieder neue Daten zu in die Datenbank zu setzen, dann werden die Field- und Param-Listen des Query-Objekts immer wieder zerstört bei jeder neuen Query und damit die Pointer, die Du speicherst, ungültig. Zum anderen ist es eine sehr ineffiziente Methode, Objekte zu halten, nur wegen ein paar Variablen. Das ist die pure Verschwendung. Aber was sag ich, das ist ja heutzutage unter windows normal... Wenn ich da an die guten alten DOS-Zeiten denk, wo man mit Assembler um jedes Byte gefeilscht hat :coder:
MRN |
Re: Treeview und datapointer...
Hi,
Natürlich hat myrealname recht mit dem thema Speicher. Das ist ein thema dessen sich barnti als nächstes annehmen sollte. Also eine Möglichkeit finden, mit der nur das im Tree gehalten wird was nötig ist. Trees sind halt auch mal schnell mit vielen Nodes gefüllt und wenn dann an jedem Node ein Speicherjumbo hängt gehen die Ressourcen schneller den Bach runter als man gucken kann. Grundsätzlich wollte ich aber erst mal das Thema zur Lösung bringen. (Erster Schritt vor zweitem). Gruß oki |
Re: Treeview und datapointer...
Tree's sind schnell gefüllt mit Nodes ? :gruebel:
Womit programmierst Du ? Delphi wohl eher ned *haha*... Also die Wrapper-Klasse von Delphi suckt in der Beziehung total. Erstell mal auf die "Schnelle" 10000 nodes *muhahahaha* Am besten kann man sehen, wie langsam sowas ist, wenn man mal 10.000 TLabels erzeugt. Einmal einfach nur so und einmal mit Parent... MRN |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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