![]() |
Object Property Zugriff ohne Create
Hallo,
kann mir jemand erklären warum folgender Code in Delphi funktioniert?
Code:
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.
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. Gruß, Marco. |
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:
Ich glaube du greifst hiermit auf eine "beliebige" Speicherstelle zu (sollte unbedingt vermieden werden!)
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 |
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:
Ohne Instanz nimmt man für sowas auch kleine Variable, sondern den Typen.
type
TMyObject = class(TObject) class var ID: Integer; end; TMyObject.ID := 123; 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. |
AW: Object Property Zugriff ohne Create
Zitat:
|
AW: Object Property Zugriff ohne Create
Beim Kompilieren sollte eigentlich ne Meldung der Art "Warnung: Objekt MyObject ist möglicherweise nicht initialisiert worden." kommen.
|
AW: Object Property Zugriff ohne Create
In dem Fall schreit das doch geradezu nach einem Record Typen.
|
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. |
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. |
AW: Object Property Zugriff ohne Create
Zitat:
|
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 09:28 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