AGB  ·  Datenschutz  ·  Impressum  







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

Record-Variable in Klasseninstanz setzen

Ein Thema von Perlsau · begonnen am 9. Dez 2012 · letzter Beitrag vom 10. Dez 2012
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.846 Beiträge
 
Delphi 12 Athens
 
#1

AW: Record-Variable in Klasseninstanz setzen

  Alt 9. Dez 2012, 22:36
Außerdem würden, wenn deine Vermutung zuträfe, auch die anderen Proceduren wie z.B. Set_StatusBar, die ja funktionieren, eine Zugriffsverletzung auslösen.
Nicht zwingend! Solange diese Methoden keine Felder der Instanz ansprechen, funktionieren die auch wenn die Instanz nicht initialisiert ist. (Wobei man sich dann aber fragen muss, warum sie nicht als Klassenmethoden realisiert sind bzw. überhaupt zu der Klasse gehören.)
Set_StatusBar gehört zur Klasse TMain_Zugriff, wie du im ersten Code-Fenster meines ersten Postings leicht feststellen kannst ...
Ich hatte nichts anderes behauptet. Es ist nur so, daß eine (nicht virtuelle) Methode einer Klasse nur dann eine initialisierte Instanz der Klasse benötigt, wenn sie auch auf Felder der Instanz zugreift. Würde die Methode z.B. lediglich ein MessageBeep aufrufen, dann funktioniert das auch wenn kein Create aufgerufen wurde. Die Tatsache, daß der Aufruf einer Methode einer Instanz funktioniert, heißt nicht zwingend, daß die Instanz initialisiert ist. Das kann man erst wissen, wenn man die Implementation der Methode kennt.

Übrigens: ein recht bekanntes Beispiel ist die Methode Free, die man auch aufrufen kann, wenn die entsprechende Instanzvariable nil ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Record-Variable in Klasseninstanz setzen

  Alt 9. Dez 2012, 23:34
Zum Testen:
Delphi-Quellcode:
type
  TFoo = class
  private
    FData : string;
    function GetData : string;
  public
    property Data : string read GetData;
  end;

function TFoo.GetData : string;
begin
  if Self = nil then
    Result := 'keine Instanz vorhanden'
  else
    Result := FData;
end;

procedure Test;
var
  LFoo : TFoo;
begin
  ShowMessage( LFoo.Data );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.846 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record-Variable in Klasseninstanz setzen

  Alt 10. Dez 2012, 08:47
Zum Testen:
Delphi-Quellcode:
type
  TFoo = class
  private
    FData : string;
    function GetData : string;
  public
    property Data : string read GetData;
  end;

function TFoo.GetData : string;
begin
  if Self = nil then
    Result := 'keine Instanz vorhanden'
  else
    Result := FData;
end;

procedure Test;
var
  LFoo : TFoo;
begin
  ShowMessage( LFoo.Data );
end;
Das war aber auch ein bisschen Glück! Bei lokalen Variablen innerhalb Prozeduren und Funktionen kann man nicht sicher sein, daß eine Klasseninstanz immer nil ist. Deswegen wird der Aufruf von Test auch bei einigen zu einer Schutzverletzung führen.

Hier mal ein bisschen mehr zum Spielen:

Delphi-Quellcode:
type
  TFoo = class
  private class var
    FCount: Integer;
  private
    FData : string;
    class constructor Create;
    function GetData : string;
  public
    constructor Create;
    property Data : string read GetData;
  end;

constructor TFoo.Create;
begin
  inherited;
  Inc(FCount);
  FData := 'Instanz: ' + IntToStr(FCount);
end;

class constructor TFoo.Create;
begin
  FCount := 0;
end;

function TFoo.GetData : string;
begin
  if Self = nil then
    Result := 'keine Instanz vorhanden'
  else
    Result := FData;
end;

procedure Test(init, nilit: Boolean);
var
  LFoo : TFoo;
begin
  if init then
    LFoo := TFoo.Create
  else if nilit then
    LFoo := nil;
  ShowMessage( LFoo.Data );
end;

begin
  Test(false, true);
  Test(true, false);
  Test(false, false);
end.
Der Class-Constructor könnte zur Zeit noch entfallen, da der Compiler auch Klassen-Variablen initialisiert, aber das muss ja nicht immer so bleiben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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:51 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