Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Treeview und datapointer... (https://www.delphipraxis.net/12637-treeview-und-datapointer.html)

barnti 1. Dez 2003 15:36


Treeview und datapointer...
 
Hallo,

ich möchte Informationen in einen Treeview überführen. Dazu mache ich folgendes:

Delphi-Quellcode:
...
 LastInserted.Data:= ParamArray[i].FieldByName(ParamArray[i].FieldList[0].FieldName);
...
LastInserted ist vom Typ TTreeNode, Im ParamArray werden 3 Querys übergeben, um diese im Treeview darzustellen.
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

barnti 3. Dez 2003 08:06

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:
...                          // 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?????
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?

Kann jemand helfen. Meine Pointer-Kenntnisse sind etwas eingestaubt!

Danke,

Barnti

oki 3. Dez 2003 08:19

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:
   MeinetTypPointerVariable := TypPointer(TreeView.Data);
Danach zur Sicherheit auf nil prüfen und du kannst mit deiner Variablen wie gewohnt weiterarbeiten. Das gilt so auch für Objekte!

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

barnti 3. Dez 2003 08:35

Re: Treeview und datapointer...
 
Hallo Oki,

ich habe mal nach Deinem Beispiel gearbeitet:

Delphi-Quellcode:
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...
Ansonsten habe ich Deine Anweisungen eingehalten. Der Pointer kann nicht nil sein, da ich diesen ja vorher zuweise.

Was mache ich jetzt noch falsch?

Gruß,

Barnti

oki 3. Dez 2003 10:16

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

MyRealName 3. Dez 2003 12:42

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

barnti 3. Dez 2003 13:25

Re: Treeview und datapointer...
 
Hallo,

ich habe es mit dem Beispiel von Oki hinbekommen. Danke, Oki!

Zitat:


Ist mir auch mit Schrecken aufgefallen, daß Bezug auf die ParamListe eines Queries genommen wird, daß klicks später vielleicht schon zerstört wird...

Das verstehe ich nicht. Ich speichere in Data den Verweis auf den aktuellen Datensatz...
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

MyRealName 3. Dez 2003 13:43

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

oki 3. Dez 2003 13:52

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

MyRealName 3. Dez 2003 14:09

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.
Seite 1 von 2  1 2      

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