![]() |
Was ist der Unterschied @Obj und Pointer( Obj )
scheinbar gibt es einen Unterschied von @Obj und Pointer( Obj ) richtig?
Aber was unterscheidet sie genau? Was machen Sie? Ich erstelle mal ein Objekt: :zwinker:
Delphi-Quellcode:
Var Obj1, Obj2: TObject;
ptr: Pointer;
Delphi-Quellcode:
Versuch eins es freizugeben: :roll:
Obj1 := TObject.Create;
Delphi-Quellcode:
Hier gibts ein Fehler... :gruebel:
// Fehler
ptr := @Obj1; Obj2 := TObject( ptr ); FreeAndNil( Obj2 ); Versuch zwei es freizugeben: :roll:
Delphi-Quellcode:
Geht :cyclops:
// kein Fehler
ptr := Pointer( Obj1 ); Obj2 := TObject( ptr ); FreeAndNil( Obj2 ); Versuch drei freizugeben: :roll:
Delphi-Quellcode:
Geht :angel2:
// kein Fehler
ptr := @Obj1; Obj2 := TObject( ptr^ ); FreeAndNil( Obj2 ); Ist sozusagen Pointer( x ) = ( @x )^ ???? Bye Edit Ende... |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Der @-Operator liefert dir die Speicherstelle an der der Pointer zum Objekt steht, während der Cast mit Pointer() diesen Wert (Pointer aufs Objekt aufm Heap) an sich meint.
Dass heisst dass du mit @ im Grunde "zwei Schritte vor deinem Objekt" stehst, und mit dem Cast nur einen. Pointer(x) = (@x)^ dürfte passen, ja. (Hoff mal das passt so weit, denke aber schon.) |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Und mit was sollte ich nun arbeiten?
lieber mit dem Normalen Pointer oder mit dem dereferenzierten *?* Pointer? Bye |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Um ein Objekt freizugeben, musst du es nicht erst durch einen Pointer referenzieren.
Sprich:
Delphi-Quellcode:
var
Obj: TObject; begin Obj := TObject.Create; // Objekt erzeugen Obj.Destroy; // ...und wieder zerstören Obj.Free; // ...das selbe, nur gibt's keinen Fehler, wenn das Objekt schon weg ist FreeAndNil(Obj); // ruft Free auf, und setzt die Objektvariable auf nil |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Nein muß ich nicht, aber wenn ich sie z.B. mit eim Items eines TTreeViews oder TStringList verbinde...
Und genau da liegt der Hacken! Im Event OnDestroy lösche ich die Items der Liste mit einer Procedure, wobei ich sie als TObject zerstör, da in der Liste verschiedene Objecte sind... Und da geht:
Delphi-Quellcode:
Nicht wenn ich sie mit @xyz hinzufüge, aber
Procedure TfrmMain.CleatTVL;
Var i: Integer; Obj: TObject; Begin // Elemente des tvRules löschen, falls vorhanden... For i := tvRules.Items.Count - 1 DownTo 0 Do Begin If Assigned( tvRules.Items[ i ].Data ) Then Begin Obj := TObject( tvRules.Items[ i ].Data^ ); FreeAndNil( Obj ); End; tvRules.Items[ i ].Delete; End; End;
Delphi-Quellcode:
Wenn ich sie mit Pointer( xyz ) hinzufüg...
Procedure TfrmMain.CleatTVL;
Var i: Integer; Obj: TObject; Begin // Elemente des tvRules löschen, falls vorhanden... For i := tvRules.Items.Count - 1 DownTo 0 Do Begin If Assigned( tvRules.Items[ i ].Data ) Then Begin Obj := TObject( tvRules.Items[ i ].Data ); FreeAndNil( Obj ); End; tvRules.Items[ i ].Delete; End; End; aber warum das auf einmal? WEnn ich das ohne Liste durspiel geht beides :gruebel: Bye |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Ich glaub ich hab meinen Feheler gefunden...
Beim hinzufügen, füge ich eine Variable eines Object xyz hinzu, welche ich vorher mit einem dynamisch ersteltem Object belegt hab, und da füg ich ja nun mit @xyz die Position von xyz zu aber nicht vom Object in ihm Richtig? :gruebel: Bye |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
du brauchst die Objekte nicht erst zum Pointer machen, wenn du sie hinzufügst. Das sind sie schon.
Du kannst sie einfach so einfügen:
Delphi-Quellcode:
//bsp TList
lst.Add( MyObject ); //bsp TStringlist lst.AddObject( 'Mein Objekt', MyObject ); //bsp listitem li.Data = MyObject //etc... |
Re: Was ist der Unterschied @Obj und Pointer( Obj )
Zitat:
Zitat:
Die Erklärung zum Fehler hat oben aber gepasst oder? Oder liegt da noch nen anderer Fehler vor? Bye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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