so nun fasse ich zusammen...
Aufgabenstellung:
Aus Unit_x wird zu Laufzeit eine Form_Y aus Unit_y erzeugt. Form_Y wird nicht automatisch erzeugt. Aus unit_x kann auf die Form_Y über eine private Variable zugegriffen werden. Die Form_Y kann durch den Schließen-Button nach Bedarf beendet werden, dabei wird die Variable in Unit_x auf Nil gestzt. Unit_y kennt nicht Unit_x. Es können mehrere Instanzen von Form_y aus anderen Units erzeugt werden.
Meine Lösung:
Delphi-Quellcode:
unit Unit1;
interface
uses
Unit2,
...
type
TForm1 =
class(TForm)
btnCreate: TButton;
btnTest: TButton;
procedure FormDestroy(Sender: TObject);
procedure btnShowTestFormClick(Sender: TObject);
procedure btntestClick(Sender: TObject);
private
{ Private-Deklarationen }
TestForm:TForm2;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
TestForm.free;
end;
procedure TForm1.btnShowTestFormClick(Sender: TObject);
begin
TestForm.DoShow(@TestForm);
end;
procedure TForm1.btnTestClick(Sender: TObject);
begin
if Assigned(TestForm)
then
ShowMessage('
TestForm existiert')
else
ShowMessage('
TestForm nicht existent')
end;
Delphi-Quellcode:
unit Unit2;
type
TForm2 =
class(TForm)
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
PCallVarAdr:^TForm;
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent;
const SelfVarAdr:Pointer);
overload;
procedure DoShow(
const SelfVarAdr:Pointer);
end;
implementation
{$R *.dfm}
constructor TForm2.Create(AOwner: TComponent;
const SelfVarAdr:Pointer);
begin
inherited Create(AOwner);
PCallVarAdr := SelfVarAdr;
Show;
end;
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
if Assigned(PCallVarAdr)
and Assigned(PCallVarAdr^)
and (PCallVarAdr^=Self)
then
begin
PCallVarAdr^:=nil;
end;
end;
procedure TForm2.DoShow(
const SelfVarAdr:Pointer);
begin
if Assigned(TForm(SelfVarAdr^))
then
begin
BringToFront;
end
else
begin
TForm2.Create(
nil,SelfVarAdr);
end;
end;