Vielleicht wie folgt:
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
SpinEdit1: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
FForms:TComponentList;
procedure DoClearReference(aFensterNr:Integer);
procedure AddForm(aForm:TMeinForm);
function ExistsForm(aFensterNr:Integer):boolean;
function GetForm(aFensterNr:Integer):TMeinForm;
procedure ClearForm(aFensterNr:Integer);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var MeinForm:TMeinForm;
begin
if ExistsForm(SpinEdit1.Value) then
GetForm(SpinEdit1.Value).BringToFront
else
begin
MeinForm:=TMeinform.Create(self);
MeinForm.ClearReference:=doClearReference;
MeinForm.Fensternr:=SpinEdit1.Value;
AddForm(MeinForm);
MeinForm.Show;
end;
end;
procedure TForm1.DoClearReference(aFensterNr:Integer);
begin
ClearForm(aFensterNr);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FForms.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FForms:=TComponentList.Create(false);
end;
procedure TForm1.AddForm(aForm: TMeinForm);
begin
FForms.Add(aForm);
end;
procedure TForm1.ClearForm(aFensterNr: Integer);
var i:integer;
begin
for i:=FForms.count-1 downto 0 do
if (FForms[i] as TMeinForm).Fensternr=aFensterNr then
FForms.Delete(i);
end;
function TForm1.ExistsForm(aFensterNr: Integer): boolean;
begin
result:=GetForm(aFensterNr)<>nil;
end;
function TForm1.GetForm(aFensterNr: Integer): TMeinForm;
var i:integer;
begin
result:=nil;
for i:=0 to FForms.Count-1 do
begin
result:=(FForms[i] as TMeinForm);
if result.Fensternr=aFensterNr then break;
result:=nil;
end;
end;
Delphi-Quellcode:
type
TMeinForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
Fensternr : Integer; //habe ich mal als Erkennung von gleichen Fenstern genommen
ClearReference:procedure(aFensterNr:Integer) of object;
end;
implementation
{$R *.dfm}
procedure TMeinForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if assigned(clearReference) then ClearReference(FensterNr);
end;
Ob man die Listenverwaltung nochmal einzeln kapselt wäre sicher angebracht. Ich wollte es jetzt nicht zu umständlich/speziell machen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.