Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Object Property Zugriff ohne Create (https://www.delphipraxis.net/161949-object-property-zugriff-ohne-create.html)

virus82 29. Jul 2011 10:18

Object Property Zugriff ohne Create
 
Hallo,

kann mir jemand erklären warum folgender Code in Delphi funktioniert?

Code:
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, SysUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMyObject = class(TObject)
    ID: Integer;
  end;

var
  Form1: TForm1;
  //MyObject: TMyObject; //<-- kann ich auch nicht Global benutzen

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  MyObject: TMyObject;
begin
  MyObject.ID := 112;
  Form1.Caption := IntToStr(MyObject.ID);
  MyObject.ID := 0; //<-- wenn diese Zeile rausgelassen wird kommt eine Zugriffsverletzung
end;

end.
Ich benutze es nicht, mich würde aber interessieren warum es zulässig ist auf eine Property eines Objects zuzugreifen, ohne dieses vorher erzeugen zu müssen.

Gruß, Marco.

SebE 29. Jul 2011 10:23

AW: Object Property Zugriff ohne Create
 
Versuche mal das:

Delphi-Quellcode:
TMyObject = class(TObject)
     class ID: Integer; // in C würdest du "static" verwenden
   end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
 var
   MyObject: TMyObject;
 begin
   MyObject.ID := 112;
   Form1.Caption := IntToStr(MyObject.ID);
   MyObject.ID := 0; //<-- wenn diese Zeile rausgelassen wird kommt eine Zugriffsverletzung
 end
Ich glaube du greifst hiermit auf eine "beliebige" Speicherstelle zu (sollte unbedingt vermieden werden!)

himitsu 29. Jul 2011 10:24

AW: Object Property Zugriff ohne Create
 
Es ist nicht zulässig (es geht halt einfach, wobei Delphi doch eigentlich eine Warnung werfen sollte, vonwegen nicht initialisierte Variable).

Da es eine lokale Variable ist, wird diese nicht automatisch initialisiert, ihr Inhalt (der Objektzeiger) steht also zufällig auf irgendeinem Wert und zeigt sonstwo hin.

Wenn du dort nun irgendeine Methode ausführst oder auf ein Propery zugreifst, greifst du also auf irgendeinen Speicherbereich zu.

Existiert an dieser Stelle nichts, bzw. der Speicherbereich ist schreibgeschützt und man versucht zu schreiben, dann gibt es eine Zugriffsverletzung.
Ansonsten würdest du, bei einem Schreibzugriff, irgendwas überschreiben und wenn es dann knallt, hast'e halt Pech gehabt.


Delphi-Quellcode:
type
  TMyObject = class(TObject)
    class var ID: Integer;
  end;

TMyObject.ID := 123;
Ohne Instanz nimmt man für sowas auch kleine Variable, sondern den Typen.

Und hier ist es was anderes, denn diese Variable ist nicht an eine Objekt-Instanz gebunden, sondern global an die Klasse.
Der Klassentyp und alle Objekte haben so den gleichen Wert.

Bernhard Geyer 29. Jul 2011 10:25

AW: Object Property Zugriff ohne Create
 
Zitat:

Zitat von virus82 (Beitrag 1114076)
Ich benutze es nicht, mich würde aber interessieren warum es zulässig ist auf eine Property eines Objects zuzugreifen, ohne dieses vorher erzeugen zu müssen.

Es ist nicht zulässig. Die Runtime erkennt halt nicht das du auf ein nicht erzeugtes Objekt zugreifst. Und solange nicht Windows interventiert weil die Adressen in keinem Zugewiesenen Speicherbereich liegen zerschiest du dir u.U. halt die Delphi-Internen Basisstrukturen.

ensaron 29. Jul 2011 10:32

AW: Object Property Zugriff ohne Create
 
Beim Kompilieren sollte eigentlich ne Meldung der Art "Warnung: Objekt MyObject ist möglicherweise nicht initialisiert worden." kommen.

Stevie 29. Jul 2011 10:34

AW: Object Property Zugriff ohne Create
 
In dem Fall schreit das doch geradezu nach einem Record Typen.

virus82 29. Jul 2011 10:41

AW: Object Property Zugriff ohne Create
 
Ok die Meldung beim Compilieren kommt auch. Mich verwundert es auch nur das ich daruf zugreifen konnte.

Und Danke an alle hier.
Es hat nur meine Annahme bestätigt das man es so unter keinen Umständen machen sollte.

defede 29. Jul 2011 10:42

AW: Object Property Zugriff ohne Create
 
Hallo, da möchte ich gern was Fragen.
Bedeutet: "Es ist nicht zulässig." das es grundlegend Falsch ist?
Es interessiert mich weil solange man die Variablen wieder zurücksetzt
das Objekt ja danach Initialsiert(und wieder Freigegeben) werden kann.

Stevie 29. Jul 2011 10:59

AW: Object Property Zugriff ohne Create
 
Zitat:

Zitat von defede (Beitrag 1114086)
Hallo, da möchte ich gern was Fragen.
Bedeutet: "Es ist nicht zulässig." das es grundlegend Falsch ist?

Ja, denn du greifst auf fremden Speicher zu. Das "zurücksetzen" auf 0 hilft in diesem konkreten Fall, heißt aber nicht, dass es in einem anderen Fall richtig ist, denn dort kannst du unter Umständen Daten überschrieben haben.

virus82 29. Jul 2011 11:21

AW: Object Property Zugriff ohne Create
 
Ich sehe das jetzt als beantwortet an. Vielen Dank an alle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 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