AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Was ist der Unterschied @Obj und Pointer( Obj )
Thema durchsuchen
Ansicht
Themen-Optionen

Was ist der Unterschied @Obj und Pointer( Obj )

Ein Thema von Kedariodakon · begonnen am 4. Mär 2005 · letzter Beitrag vom 4. Mär 2005
Antwort Antwort
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#1

Was ist der Unterschied @Obj und Pointer( Obj )

  Alt 4. Mär 2005, 12:15
scheinbar gibt es einen Unterschied von @Obj und Pointer( Obj ) richtig?
Aber was unterscheidet sie genau?
Was machen Sie?

Ich erstelle mal ein Objekt:
Delphi-Quellcode:
Var Obj1, Obj2: TObject;
    ptr: Pointer;
  Obj1 := TObject.Create; Versuch eins es freizugeben:
Delphi-Quellcode:
  //   Fehler
  ptr := @Obj1;
  Obj2 := TObject( ptr );
  FreeAndNil( Obj2 );
Hier gibts ein Fehler...

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

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

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



Bye

Edit Ende...
Christian
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 4. Mär 2005, 12:38
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.)
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 4. Mär 2005, 12:48
Und mit was sollte ich nun arbeiten?
lieber mit dem Normalen Pointer oder mit dem dereferenzierten *?* Pointer?

Bye
Christian
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#4

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

  Alt 4. Mär 2005, 12:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 4. Mär 2005, 13:11
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

Bye
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 4. Mär 2005, 13:22
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?


Bye
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 4. Mär 2005, 13:25
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...
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 4. Mär 2005, 13:36
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...

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?



Die Erklärung zum Fehler hat oben aber gepasst oder?
Oder liegt da noch nen anderer Fehler vor?


Bye
Christian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 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