同一mdi子窗体没关闭,多次打开,每次窗体的名称不同

时间:2022-03-08 23:07:45
同一mdi子窗体没关闭,多次打开,每次窗体的名称不同
如第一次打开为Form1,没有关闭再打开,名称就变成Form1_1了,各位编程时怎样动态获取form的名称?
不能限制每个窗体只能打开一次。也不能在打开前关闭打开过的窗体

9 个解决方案

#1


我已前也碰到,这样太可以解决
procedure TFrm_OtherInList.FormDestroy(Sender: TObject);
begin
Frm_OtherInList:=nil;
end;

退出时释放窗体就可以

#2


正常打开 得激活上次已经打开的 不能再重复打开吧
激活上次打开代码如下:
function TfrmMain.MDIExist(frmName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to MDIChildCount - 1 do
  begin
    if MDIChildren[i].Name = frmName then
    begin
      Result := True;
      MDIChildren[i].BringToFront;
      Break;
    end
  end;
end;
如果lz意思是要打开复制一个的话 那就按照ls意思 差不多了。

#3


打开前,先判断此窗体是否已经打开了

像楼上的就行了

#4


我也问个问题mdi最小化了就隐藏了怎么办呀

#5


引用 2 楼  的回复:
正常打开 得激活上次已经打开的 不能再重复打开吧
激活上次打开代码如下:
function TfrmMain.MDIExist(frmName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to MDIChildCount - 1 do
  begin
  if MDIChil……






 if  not MDIExist('frm_SellPreList') then
begin
application.CreateForm(Tfrm_SellPreList,frm_SellPreList);
frm_SellPreList.Show;
end

这个对吗,好像不对

#6


看来是没办法了吗?我是想打开了,不能关闭,然后再打开同一个啊,就是可以打开两个或者多个同样form的,怎样获取form名称

#7


procedure RunDc(App: TApplication);
begin
  if not Assigned(frmPatDc) then
  begin
    Application := App;
    frmPatDc := TfrmPatDc.Create(app.MainForm);
    frmPatDc.frmHandle :=frmPatDc.Handle;
    frmPatDc.Show;
  end
  else
  begin
    ShowWindow(frmPatDc.frmHandle, SW_SHOWDEFAULT);
    frmPatDc.BringToFront;
  end;
end;

#8


主窗:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  Tmain = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    qu_formindex: integer;
  end;

var
  main: Tmain;   //主窗

implementation  

{$R *.dfm}
uses unit2;//Form2的单元
var Frm:array[0..9]of TForm1;//定义10个(当然可以根据需要定义更多)TForm1
    FormIndex:integer;

procedure Tmain.Button1Click(Sender: TObject);
begin
  if FormIndex >9 then begin
    showmessage('定义的10个窗体已经建立,不能再建立了。');
    exit;
  end;
  Frm[FormIndex]:=TForm1.Create(self);//这样建立的TForm1,可以通过变量Frm[FormIndex]来访问
  Frm[FormIndex].FormIndex:=FormIndex;//每个 TForm1 实例的索引
  Frm[FormIndex].Caption:='第 '+inttostr(FormIndex)+' 个窗体';//给新窗体赋值窗眉文本
  Frm[FormIndex].Show;//显示刚建立的窗体
  inc(FormIndex);
end;

procedure Tmain.FormCreate(Sender: TObject);
begin
  Timer1.Enabled:=false;
  Timer1.Interval:=100;
end;

procedure Tmain.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=false;
  FreeAndNil(Frm[qu_formindex]);//释放刚刚关闭的动态窗体
end;

procedure Tmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i:integer;
begin
  for i:= 0 to 9 do
    if Frm[i]<>nil then FreeAndNil(Frm[i]);//主窗关闭前释放未释放的动态窗
end;

procedure Tmain.Button2Click(Sender: TObject);
begin
  if Frm[3]<>nil then begin
    Frm[3].Show;//如果窗体 Frm[3] 已经存在,让它显示
    Frm[3].SetFocus;//将焦点放在 Frm[3]
  end;
end;

end.

子窗:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    FormIndex: integer;//每个 TForm1 实例的索引
  end;

var
  Form1: TForm1; //子窗

implementation 

{$R *.dfm}
uses unit1; // main 窗所在单元

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  main.qu_formindex:=FormIndex;//将自己的索引值传回主窗
  main.Timer1.Enabled:=true;//打开主窗的定时器(让定时器来释放本窗体)
end;

end.

#9


主窗单元中:

......
implementation  

{$R *.dfm}
uses unit2;//Form1的单元 (此处原来的注释误为 Form2 了)

......

#1


我已前也碰到,这样太可以解决
procedure TFrm_OtherInList.FormDestroy(Sender: TObject);
begin
Frm_OtherInList:=nil;
end;

退出时释放窗体就可以

#2


正常打开 得激活上次已经打开的 不能再重复打开吧
激活上次打开代码如下:
function TfrmMain.MDIExist(frmName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to MDIChildCount - 1 do
  begin
    if MDIChildren[i].Name = frmName then
    begin
      Result := True;
      MDIChildren[i].BringToFront;
      Break;
    end
  end;
end;
如果lz意思是要打开复制一个的话 那就按照ls意思 差不多了。

#3


打开前,先判断此窗体是否已经打开了

像楼上的就行了

#4


我也问个问题mdi最小化了就隐藏了怎么办呀

#5


引用 2 楼  的回复:
正常打开 得激活上次已经打开的 不能再重复打开吧
激活上次打开代码如下:
function TfrmMain.MDIExist(frmName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to MDIChildCount - 1 do
  begin
  if MDIChil……






 if  not MDIExist('frm_SellPreList') then
begin
application.CreateForm(Tfrm_SellPreList,frm_SellPreList);
frm_SellPreList.Show;
end

这个对吗,好像不对

#6


看来是没办法了吗?我是想打开了,不能关闭,然后再打开同一个啊,就是可以打开两个或者多个同样form的,怎样获取form名称

#7


procedure RunDc(App: TApplication);
begin
  if not Assigned(frmPatDc) then
  begin
    Application := App;
    frmPatDc := TfrmPatDc.Create(app.MainForm);
    frmPatDc.frmHandle :=frmPatDc.Handle;
    frmPatDc.Show;
  end
  else
  begin
    ShowWindow(frmPatDc.frmHandle, SW_SHOWDEFAULT);
    frmPatDc.BringToFront;
  end;
end;

#8


主窗:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  Tmain = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    qu_formindex: integer;
  end;

var
  main: Tmain;   //主窗

implementation  

{$R *.dfm}
uses unit2;//Form2的单元
var Frm:array[0..9]of TForm1;//定义10个(当然可以根据需要定义更多)TForm1
    FormIndex:integer;

procedure Tmain.Button1Click(Sender: TObject);
begin
  if FormIndex >9 then begin
    showmessage('定义的10个窗体已经建立,不能再建立了。');
    exit;
  end;
  Frm[FormIndex]:=TForm1.Create(self);//这样建立的TForm1,可以通过变量Frm[FormIndex]来访问
  Frm[FormIndex].FormIndex:=FormIndex;//每个 TForm1 实例的索引
  Frm[FormIndex].Caption:='第 '+inttostr(FormIndex)+' 个窗体';//给新窗体赋值窗眉文本
  Frm[FormIndex].Show;//显示刚建立的窗体
  inc(FormIndex);
end;

procedure Tmain.FormCreate(Sender: TObject);
begin
  Timer1.Enabled:=false;
  Timer1.Interval:=100;
end;

procedure Tmain.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=false;
  FreeAndNil(Frm[qu_formindex]);//释放刚刚关闭的动态窗体
end;

procedure Tmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i:integer;
begin
  for i:= 0 to 9 do
    if Frm[i]<>nil then FreeAndNil(Frm[i]);//主窗关闭前释放未释放的动态窗
end;

procedure Tmain.Button2Click(Sender: TObject);
begin
  if Frm[3]<>nil then begin
    Frm[3].Show;//如果窗体 Frm[3] 已经存在,让它显示
    Frm[3].SetFocus;//将焦点放在 Frm[3]
  end;
end;

end.

子窗:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    FormIndex: integer;//每个 TForm1 实例的索引
  end;

var
  Form1: TForm1; //子窗

implementation 

{$R *.dfm}
uses unit1; // main 窗所在单元

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  main.qu_formindex:=FormIndex;//将自己的索引值传回主窗
  main.Timer1.Enabled:=true;//打开主窗的定时器(让定时器来释放本窗体)
end;

end.

#9


主窗单元中:

......
implementation  

{$R *.dfm}
uses unit2;//Form1的单元 (此处原来的注释误为 Form2 了)

......