AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object Property Zugriff ohne Create

Ein Thema von virus82 · begonnen am 29. Jul 2011 · letzter Beitrag vom 29. Jul 2011
Antwort Antwort
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 2009 Professional
 
#1

Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:18
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.
Marco
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#2

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:23
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!)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#3

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:24
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Jul 2011 um 11:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:25
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:32
Beim Kompilieren sollte eigentlich ne Meldung der Art "Warnung: Objekt MyObject ist möglicherweise nicht initialisiert worden." kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:34
In dem Fall schreit das doch geradezu nach einem Record Typen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:41
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.
Marco
  Mit Zitat antworten Zitat
Benutzerbild von defede
defede

Registriert seit: 10. Aug 2006
Ort: Stötten am Auerberg
72 Beiträge
 
Delphi 7 Professional
 
#8

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:42
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.
Invader Zim
Obey Zim
Fear Zim
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 10:59
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Object Property Zugriff ohne Create

  Alt 29. Jul 2011, 11:21
Ich sehe das jetzt als beantwortet an. Vielen Dank an alle.
Marco
  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 05:34 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