Thema: Delphi TForm Freigeben

Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#30

Re: TForm Freigeben

  Alt 3. Sep 2008, 19:10
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.
  Mit Zitat antworten Zitat