Delphi-PRAXiS

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 [Zeiger & Objekte] - Klasse kennt Treenode aber umgekehrt? (https://www.delphipraxis.net/109847-%5Bzeiger-objekte%5D-klasse-kennt-treenode-aber-umgekehrt.html)

xZise 8. Mär 2008 23:37


[Zeiger & Objekte] - Klasse kennt Treenode aber umgekehr
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DP,
ich programmiere gerade ein kleines Programm, und habe da folgendes Problem:
Ich benutzte eine TreeView um mir einen kleinen Baum von Ordnern und Dateien anzuzeigen.
Das alleine ist nicht das Problem, aber nun will ich Informationen zu den Ordnern/Dateien abspeichern.
Also habe ich mir schnell die Klassen "TDelphiFile" und "TDelphiDirectory" erstellt (zweiteres hat vom ersteren geerbt).
Ich speichere dann in der Eigenschaft "Data" des Nodes den Zeiger auf das jeweilige Objekt.
Außerdem speichere ich in meinen Objekt, zu welchen Node es gehört.
Nun kennt der TreeNode also das jeweilige Objekt, und das Objekt wiederrum den TreeNode.
Theoretisch jedenfalls.

In der Praxis bekomme ich nur schöne AVs.

Wie mache ich das nun:
Man gibt einen Pfad an, und dann kann man die Suche starten.
Ich erstelle darauf ein Node und speichere den Node in eine Variable.
Dann nimmt er sich das Rootobjekt (TDelphiDirectory), und setzt alles neu (Der Node wird gesetzt).
Und dann geht er alle Dateien/Ordner des Rootordners durch und erstellt, wenn er eine Datei/einen Ordner findet, ein neuen Node (und speichert es in der glechen Variable zwischen).
Und damit füge ich dem jeweiligen Root ein TDelphiFile/TDelphiDirectory hinzu, und setzte bei denen die Eigenschaften (unteranderem den Node).

Wenn ich nun damit fertig bin, müsste alles gehen, aber denkste:
Ich bekomme eine schicke AV!
Außer bei dem Objekt was ich Zuletzt erstellt habe.

Ich habe mal den Code angehangen.
Er ist noch nicht fertig, und es wird auch nicht weiterkommen, solange ich dieses Problem nicht hinkriege.

MfG
xZise

Namenloser 9. Mär 2008 00:18

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Also, das ist wirklich merkwürdig. Den Fehler kann ich auch nicht finden, aber ich hab heraus gefunden, dass alle TDelphiFile-Instanzen mit dem selben Node verknüpft sind, und alle TDelphiDirectory-Instanzen ebenfalls. (Die beiden Klassen sind aber mit unterschiedlichen Nodes verknüpft). Vielleicht bringt dich das ja weiter :gruebel:

alzaimar 9. Mär 2008 08:12

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Du verwendest @ObjectInstanz und das klappt nicht.

Weise der Eigenschaft 'TTreeNode.Data im Konstrutor der TDelphiFile / TDelphiDirectory-Klassen den Wert 'Self' (und nicht '@Self') zu. Beim Zugriff verwendest du dann 'TDelphiFile(Node.Data)'.

xZise 9. Mär 2008 10:03

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Okay... Danke :)

Mich verwirrt nur etwas was eine Instanz ist ;) Aber ohne dem @ geht das Wunderbar :)

MfG
xZise

Motzi 9. Mär 2008 10:36

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Zum Thema Pointer kann ich dir mein Tutorial auf www.manuel-poeter.de empfehlen. Wenn ich mich recht erinnere steht da auch drinnen, dass Objekte nur Zeiger sind die implizit dereferenziert werden, weshalb es auch nicht nötig ist @ zu verwenden.

Gruß, Motzi

alzaimar 9. Mär 2008 10:52

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Zitat:

Zitat von xZise
Mich verwirrt nur etwas was eine Instanz ist ;)

Eine Instanz ist ein Objekt einer Klasse. Du bist eine Instanz von TMensch (ich gehe mal davon aus, das du keine Instanz von TAlien bist :stupid: ).

Eine Objektvariable ist eben schon ein Zeiger auf diese Instanz. Das siehst Du am Besten, wenn Du dir die Größe der Variablen (SizeOf) ausgeben lässt.

Und nun zu deinem Fehler: Die Adresse von 'Self' ist irgen ein Speicherbereich, der beim Aufruf vom Konstruktor verwendet wird, vermutlich liegt der auf dem Stack und ist nach dem Aufruf des Konstruktors eben wieder ungültig.

xZise 9. Mär 2008 14:51

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Also es funktioniert jetzt ohne @ ;)

Aber irgendwie ist es so, dass wenn man ein Objekt übergibt, dass man nicht mit dem Original arbeitet sondern einer Kopie ...
Ich les mir mal das Tut durch!

MfG
xZise

Namenloser 9. Mär 2008 15:08

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Komisch, das mit dem @ hatte ich auch vermutet, weshalb ich es auch testweise in Pointer() umgeändert hatte. Hat aber trotzdem nicht funktioniert. Kann mir einer sagen warum? Behandelt Delphi den Typecast auf Pointer bei Objekten vielleicht anders?

alzaimar 9. Mär 2008 15:31

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
'SELF' liegt auf dem Stack (lokale Variable). Ein @Self liefert dann eben die Adresse vom Stack. Nur ist das später eben irgend etwas anderes. Wenn man kein @ verwendet, dann darf man auch kein '^' verwenden.

Namenloser 9. Mär 2008 16:55

Re: [Zeiger & Objekte] - Klasse kennt Treenode aber umge
 
Ah, du meinst hier?
Delphi-Quellcode:
bDeleteEntry.Caption := TDelphiFile(Node.Data^).Name;
Das hatte ich wohl nicht beachtet... :oops:
Zitat:

'SELF' liegt auf dem Stack (lokale Variable). Ein @Self liefert dann eben die Adresse vom Stack. Nur ist das später eben irgend etwas anderes.
Das ist mir schon klar :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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