Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
18. Nov 2010
Zugriffe auf Felder und virtuelle/dynamische Methoden werden über einen Offset zu Self ausgeführt.
Ist nun Self = nil oder ein ungültiger Wert, dann geht das natürlich schief.
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
18. Nov 2010
Du könntest ja einfach in alle Methoden dieses Einfügen.
Assert(Assigned(Self) and (TObject(Self) is TKlassentyp));.
Aber stimmt schon, sowas könnte Emba eigentlich auch intern via Compilerschalter reinbauen.
PS: Es wäre auch schonmal schön, wenn z.B. diese Überlauf- und Bereichsprüfung standardmäßig aktiviert wäre.
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
18. Nov 2010
@Uwe: Es wird da nichts implizit umgewandelt.
Es bleibt ein Aufruf einer stinknormalen Methode,
nur daß "Self" eben nil ist (da hier praktischer Weise dieses von der Elternklasse so initialisiert wurde) und wenn man intern nun nichts nutzt, welches das Objekt benötigen würde, dann fällt es nicht auf.
PS: Wäre das FTest eine lokale Variable gewesen, dann hätte Self auf sonstwas stehen können...
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
18. Nov 2010
Ja OK, von seiten Delphis ist es "absicht", aber von seinen des Programmierers und in Anbetracht, daß er keine Ahnung hatte, was er macht, war es eher Zufall, daß er z.B. kein Feld verwendet hatte. :angle:
Forum: Object-Pascal / Delphi-Language
Delphi
by himitsu,
18. Nov 2010
Es wird auch der Speicher für die Klasse erstellt, worin die Felder liegen.
PS: Das Ganze ist ein klassisches Beispiel, für eine Klassenmethode, welche man ohne Instanz nutzen kann.
TDummyClass = class
public
class procedure Test(var paStrString: String);
end;
TDummyClass.Test(xxx);