Hallo,
ich habe anscheinend ein "leichtes" Verständnisproblem, was die Verwendung von Klassen angeht: Ich habe 2 Klassen erstellt. Dabei benutzt Klasse1 die Klasse2, indem sie 2 Objekte der Klasse2 beim eigenen Create anlegt. Die Objekte der Klasse2 sollen ihrerseits auf Eigenschaften der Klasse1 zugreifen können, weshalb ein Pointer auf das Objekt der Klasse1 beim Create übergeben wird. Das ganze funktioniert leider nur, solange ich dabei mit nur einem Objekt arbeite.
Ich habe den Quelltext auf ein Minimum eingekürzt:
<PRE>
unit ClassTest;
interface
uses Dialogs;
type
{ Forward-Deklarationen }
TKlasse1 = class;
TPointerAufKlasse1 = ^TKlasse1;
{ TKlasse2 }
TKlasse2 = class
public
Owner : TPointerAufKlasse1;
procedure ShowOwnerText;
constructor Create(Klasse1: TPointerAufKlasse1);
end;
{ TKlasse1 benutzt TKlasse 2}
TKlasse1 = class
private
FText: String;
FSeite1: TKlasse2;
FSeite2: TKlasse2;
public
procedure ShowOwnerText;
constructor Create(Text: String);
destructor Destroy; override;
published
property Text : String read FText;
end;
implementation
(************************************************* **************************
* Implementierung für die Klasse TKlasse1 *
************************************************** *************************)
constructor TKlasse1.Create(Text: String);
begin
FText := Text;
FSeite1 := TKlasse2.Create(@Self);
FSeite2 := TKlasse2.Create(@Self);
end;
destructor TKlasse1.Destroy;
begin
if FSeite1 <> nil then FSeite1.Free;
if FSeite2 <> nil then FSeite2.Free;
inherited;
end;
procedure TKlasse1.ShowOwnerText;
begin
FSeite1.ShowOwnerText;
//FSeite2.ShowOwnerText; // <-- Beim Entfernen des Kommentars Laufzeitfehler
end;
(************************************************* **************************
* Implementierung für die Klasse TKlasse2 *
************************************************** *************************)
constructor TKlasse2.Create(Klasse1: TPointerAufKlasse1);
begin
Owner := Klasse1;
end;
procedure TKlasse2.ShowOwnerText;
begin
ShowMessage(Owner^.Text);
end;
end.
</PRE>
Der Aufruf würde dann so aussehen:
<PRE>
procedure TForm1.Button1Click(Sender: TObject);
var
MeineKlasse1 : TKlasse1;
begin
MeineKlasse1 := TKlasse1.Create('Test');
MeineKlasse1.ShowOwnerText;
MeineKlasse1.Free;
end;
</PRE>
Für eine Erklärung wäre ich sehr dankbar.
Andreas
ich habe anscheinend ein "leichtes" Verständnisproblem, was die Verwendung von Klassen angeht: Ich habe 2 Klassen erstellt. Dabei benutzt Klasse1 die Klasse2, indem sie 2 Objekte der Klasse2 beim eigenen Create anlegt. Die Objekte der Klasse2 sollen ihrerseits auf Eigenschaften der Klasse1 zugreifen können, weshalb ein Pointer auf das Objekt der Klasse1 beim Create übergeben wird. Das ganze funktioniert leider nur, solange ich dabei mit nur einem Objekt arbeite.
Ich habe den Quelltext auf ein Minimum eingekürzt:
<PRE>
unit ClassTest;
interface
uses Dialogs;
type
{ Forward-Deklarationen }
TKlasse1 = class;
TPointerAufKlasse1 = ^TKlasse1;
{ TKlasse2 }
TKlasse2 = class
public
Owner : TPointerAufKlasse1;
procedure ShowOwnerText;
constructor Create(Klasse1: TPointerAufKlasse1);
end;
{ TKlasse1 benutzt TKlasse 2}
TKlasse1 = class
private
FText: String;
FSeite1: TKlasse2;
FSeite2: TKlasse2;
public
procedure ShowOwnerText;
constructor Create(Text: String);
destructor Destroy; override;
published
property Text : String read FText;
end;
implementation
(************************************************* **************************
* Implementierung für die Klasse TKlasse1 *
************************************************** *************************)
constructor TKlasse1.Create(Text: String);
begin
FText := Text;
FSeite1 := TKlasse2.Create(@Self);
FSeite2 := TKlasse2.Create(@Self);
end;
destructor TKlasse1.Destroy;
begin
if FSeite1 <> nil then FSeite1.Free;
if FSeite2 <> nil then FSeite2.Free;
inherited;
end;
procedure TKlasse1.ShowOwnerText;
begin
FSeite1.ShowOwnerText;
//FSeite2.ShowOwnerText; // <-- Beim Entfernen des Kommentars Laufzeitfehler
end;
(************************************************* **************************
* Implementierung für die Klasse TKlasse2 *
************************************************** *************************)
constructor TKlasse2.Create(Klasse1: TPointerAufKlasse1);
begin
Owner := Klasse1;
end;
procedure TKlasse2.ShowOwnerText;
begin
ShowMessage(Owner^.Text);
end;
end.
</PRE>
Der Aufruf würde dann so aussehen:
<PRE>
procedure TForm1.Button1Click(Sender: TObject);
var
MeineKlasse1 : TKlasse1;
begin
MeineKlasse1 := TKlasse1.Create('Test');
MeineKlasse1.ShowOwnerText;
MeineKlasse1.Free;
end;
</PRE>
Für eine Erklärung wäre ich sehr dankbar.
Andreas
Comment