Zitat von
the_real_didi:
Die Variable PDatensatz ist ein Pointer auf TDatensatz, meinen record, und wird direkt nach dem Wort "type" deklariert.
Delphi-Quellcode:
type
PDatensatz = ^TDatensatz;
TDatensatz = record
ID: string;
Typ: integer;
end;
TForm1 = class(TForm)
...
Ja, richtig. Mit Type werden Typendeklarationen eingeleitet. Mit PDatensatz und TDatensatz deklarierst du einen neuen Datentyp. Und PDatensatz ist ein Typ in Form eines Zeigers auf TDatensatz, richtig.
Zitat von
the_real_didi:
Und dann funktioniert das auch so, wie du das beschrieben hast. Ich hatte die Variable Datensatz: ^TDatensatz
innerhalb einer procedure deklariert. Dann hat es nicht funktioniert.
Kann bei der Methode, wie ich sie verwendet habe irgendwas schief laufen oder könnte man das genau so gut so machen?
Damit ersparst du dir nur die Typendeklaration. Du deklarierst den Typen hier direkt bei der Variablendeklaration. Einziger Unterschied: du gibst dem neuen Kind (Typ) keinen Namen. Da ist aber eine Deklaration eines Typs besser geeignet, weil Delphi an unterschiedlichen Stellen deklarierte Typen als unterschiedliche Typen unterscheidet - auch wenn Ihre Deklarationen gleich aussehen. Daher wäre die Verwendung von PDatensatz innerhalb aller Routinen besser geeignet als ^TDatensatz.
Zitat von
the_real_didi:
Reicht eigentlich die Kontrolle
if node.Data <> nil then
um zu überprüfen, ob ich auf data zugreifen kann, oder muß ich noch nachschauen, ob wirklich daten an der Adresse liegen?
Naja, grundlegend schon, aber wenn das Wort "aber" nicht wäre. Grundlegend ist die Eigenschaft Data von TTreeNode Nil, d.h. im Normalfall klappt dies. Wenn du nun aber einem Knoten die Data Eigenschaft wieder entfernst, sprich du gibst den Speicher wieder mit Dispose() frei, dann müsstest du darauf achten, danach die Data Eigenschaft wieder auf Nil zu setzen, da dies nicht automatisch geschieht und weil sonst deine Abfragen fehlschlagen würden. Ob es ein gültiger Speicherbereich ist, auf den Data zeigt, kannst du so nicht nachprüfen, daher ist der Programmierer verpflichtet für richtige Werte zu sorgen.
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.