Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Record-Variable in Klasseninstanz setzen

  Alt 10. Dez 2012, 09: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