Einzelnen Beitrag anzeigen

monty.ms

Registriert seit: 19. Nov 2004
76 Beiträge
 
#1

Klassen und Pointer - Fehlerursache?

  Alt 30. Mai 2008, 23:10
Hallo, ich hab wieder mal ein Problem

Erstmal folgender Beispielcode:

Delphi-Quellcode:
type
  TKlasseB = class
  public
    vOwner: Pointer;
    vText: String;
    function Init( Owner: Pointer ): Boolean;
    function Test( Text: String ): Boolean;
  end;

type
  TKlasseC = class
  public
    vOwner: Pointer;
    function Init( Owner: Pointer ): Boolean;
    function Test( Text: String ): Boolean;
  end;

type
  TKlasseA = class
  public
    vOwner: Pointer;
    KlasseB: TKlasseB;
    KlasseC: TKlasseC;
    function Init( Owner: Pointer ): Boolean;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    KlasseA: TKlasseA;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TKlasseA.Init( Owner: Pointer ): Boolean;
begin
vOwner := Owner;
KlasseB := TKlasseB.Create;
KlasseC := TKlasseC.Create;

KlasseB.Init( @self );
KlasseC.Init( @self );

Result := True;
end;

function TKlasseB.Init( Owner: Pointer ): Boolean;
begin
vOwner := Owner;

Result := True;
end;

function TKlasseB.Test( Text: String ): Boolean;
begin
vText := Text;

Result := True;
end;

function TKlasseC.Init( Owner: Pointer ): Boolean;
begin
vOwner := Owner;

Result := True;
end;

function TKlasseC.Test( Text: String ): Boolean;
begin
TKlasseA( vOwner^ ).KlasseB.vText := Text;

Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
KlasseA := TKlasseA.Create;
KlasseA.Init( @self );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
KlasseA.KlasseC.Test('Hallo');
end;

end.
Der Sinn ist, dass ich drei Klassen habe (A, B und C). Form1 erstellt ein Objekt von Klasse A. Und dieses erstellt ein Objekt von Klasse B und C. - Nun ruft Objekt C über sein Elternobjekt (Objekt A) die Funktion des Objekts B auf. Das Init() dient nur dazu, dem Objekt, den Pointer seines übergeordneten Objektes zu geben.

Das Problem: Ich krieg beim Klick auf Button2 einen Fehler (Access Violation). Scheinbar kann die Variable vText nicht beschrieben werden. Woran liegt das? Hab ich was mit den Pointer falsch gemacht? Ich hab folgendes noch getestet gehabt:

Delphi-Quellcode:
function TKlasseA.Init(): Boolean;
begin
If @self = @Form1.KlasseA Then ShowMessage('Ja');
end;
Und scheinbar sind die Pointer nicht gleich. Aber 'self' ist das Objekt von dem die Funktion gerade gestartet ist und @self ist dann die Adresse auf dieses Objekt. Naja, und @Form1.KlassA müsste ja dann das selbe sein. Oder lassen sich Pointer gar nicht vergleichen? Und irgendwie hab ich das Gefühl ich greif beim Ändern der Variable, auf ein anderes (offensichtlich nicht erstelltes) Objekt der Klasse zu. Aber eigentlich müsste es ja das selbe sein. Ich bin verwirrt

Hoffe mir kann jemand helfen. Danke schonmal.
  Mit Zitat antworten Zitat