Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was ist der Unterschied @Obj und Pointer( Obj ) (https://www.delphipraxis.net/41502-ist-der-unterschied-%40obj-und-pointer-obj.html)

Kedariodakon 4. Mär 2005 11:15


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:
  Obj1 := TObject.Create;
Versuch eins es freizugeben: :roll:
Delphi-Quellcode:
  //   Fehler
  ptr := @Obj1;
  Obj2 := TObject( ptr );
  FreeAndNil( Obj2 );
Hier gibts ein Fehler... :gruebel:

Versuch zwei es freizugeben: :roll:
Delphi-Quellcode:
  //   kein Fehler
  ptr := Pointer( Obj1 );
  Obj2 := TObject( ptr );
  FreeAndNil( Obj2 );
Geht :cyclops:

Versuch drei freizugeben: :roll:
Delphi-Quellcode:
  //   kein Fehler
  ptr := @Obj1;
  Obj2 := TObject( ptr^ );
  FreeAndNil( Obj2 );
Geht :angel2:

Ist sozusagen Pointer( x ) = ( @x )^ ????



Bye

Edit Ende...

dizzy 4. Mär 2005 11:38

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.)

Kedariodakon 4. Mär 2005 11:48

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

Oxmyx 4. Mär 2005 11:49

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

Kedariodakon 4. Mär 2005 12:11

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:
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;
Nicht wenn ich sie mit @xyz hinzufüge, aber

Delphi-Quellcode:
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;
Wenn ich sie mit Pointer( xyz ) hinzufüg...

aber warum das auf einmal?
WEnn ich das ohne Liste durspiel geht beides :gruebel:

Bye

Kedariodakon 4. Mär 2005 12:22

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

Treffnix 4. Mär 2005 12:25

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...

Kedariodakon 4. Mär 2005 12:36

Re: Was ist der Unterschied @Obj und Pointer( Obj )
 
Zitat:

Zitat von Treffnix
du brauchst die Objekte nicht erst zum Pointer machen, wenn du sie hinzufügst. Das sind sie schon.

Mist, da hast du ja Recht... :cyclops:

Zitat:

Zitat von Treffnix
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...

Naja, aber warum leicht, wenns auch schwer geht? :duck:



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 14:46 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