Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was ist Self/ warum greift Self zu (https://www.delphipraxis.net/97227-ist-self-warum-greift-self-zu.html)

Bomberbb 7. Aug 2007 11:04


Was ist Self/ warum greift Self zu
 
Moin,

ich befasse mich gerade mit oop in Delphi. Nun hab ich ein Problem mit Self. Ich dachte bis jetzt immer, dass Self der Objektvariablen entspricht, dem ist aber anscheinend nicht so.
Ein wenig Quelltext zur Verdeutlichung.
Delphi-Quellcode:
...
ActiveClass:=^TMeineKlasse

Procedure TMeineKlasse.SetActive;
Begin
  ActiveClass:=@Self;
End;

...

Meins:=TMeineKlasse.Create(Self);
Meins.SetActive;
if @Meins <> ActiveClass then
  showmessage('Unterschied');
Ich fasse das nun so auf, dass Self nicht wirklich auf den Speicherbereich des Objektes verweißt. Kann ich diese Referenz irgendwie bekommen???

Gruß

Bomber

[edit=SirThornberry]aussagekräftigeren Titel vergeben - Mfg, SirThornberry[/edit]

Apollonius 7. Aug 2007 11:08

Re: self
 
Self enthält den selben Inhalt wie die Instanzvariable. Wenn du also deine Zeigerspielchen weglässt und ActiveClass als TMeineKlasse deklarierst, solltest du ein anderes Ergebnis erhalten.

Übrigens: Wie sollten denn self und MeineKlasse - zwei verschiedene Variablen - den selben Speicherbereich teilen?

Nochwas: Klassen und Zeiger sind in der Regel nicht nötig, da Klassen implizit schon Zeiger sind.

Bernhard Geyer 7. Aug 2007 11:09

Re: self
 
Nicht zu viel C++-Verzeigerung (Das drüben bin ich).

Delphi-Quellcode:
ActiveClass: TMeineKlasse;

Procedure TMeineKlasse.SetActive;
Begin
  ActiveClass := Self;
End

Meins := TMeineKlasse.Create(Self);
Meins.SetActive;
if Meins <> ActiveClass then
  showmessage('Unterschied');

RavenIV 7. Aug 2007 11:11

Re: self
 
Ich weiss nicht, ob Dir das weiterhilft:
Self ist immer das Formular, in dem Du Dich gerade bewegst.

Apollonius 7. Aug 2007 11:14

Re: self
 
Falsch. Self ist die Objektinstanz mit der eine Methode aufgerufen wird. Das ist nur ein Formular, wenn du dich in einer Methode von TForm oder eines abgeleiteten TFormxxx bewegst.

Bomberbb 7. Aug 2007 11:25

Re: self
 
Nun ich dachte bis jetzt, Self würde direct auf die Objektvariable verweisen. Habe das inwischen auch ohne Zeiger gelöst. Wollte jetzt nur mal wissen wie sich das verhält.
Wenn Self eine zweite Variable mit dem selben Inhalt ist, wie die Objektvariable, dann ist mir alles klar.

Danke!!!

Bernhard Geyer 7. Aug 2007 12:27

Re: self
 
Zitat:

Zitat von Bomberbb
Nun ich dachte bis jetzt, Self würde direct auf die Objektvariable verweisen.

Du sagst es doch schon. Self ansich ist ja letztendlich schon ein (typisierter) Zeiger. Und nochmal einen Zeiger definieren der auf diesen Zeiger zeigt (sollte doch nicht Pointer übersetzen).

Bomberbb 19. Sep 2007 14:35

Re: self
 
Hab schon wieder ein ähnliches Problem. Gibt es generell irgendeine Möglichkeit einen Zeiger auf das Object zu bekommen?

SirThornberry 19. Sep 2007 14:49

Re: self
 
du musst sagen was du genau willst.
Die Klasse ist der Bauplan (zur Verdeutlichung der Bauplan eines hauses).
Mit Klasse.Create wird der Bauplan umgesetzt (das Haus gebaut).
Und eine Objectinstanz ist intern ein Pointer der auf den umgesetzten Bauplan zeigt (Als würde dir jemand sagen: Das Haus steht in der Badstraße 5)

Self bezieht sich also auf das Haus in dem du stehst und nicht auf irgend einen Wegweiser oder eine Wegbeschreibung.

Was meinst du jetzt also mit "Zeiger auf das Object"
Wenn das "Object" das Haus selbst ist wäre ein "Zeiger auf das Object" also der Wegweiser, also eine Objectinstanz.

Bomberbb 19. Sep 2007 15:05

Re: self
 
Ich brauche während der Klassenmethoden z.B.

TMeineClasse.create den pointer, der sich außerhalb der Klasse so ergeben würde.

Objekt := TMeineKlasse.Create(Form1);

pointer:=@Objekt;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 1 von 2  1 2      

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