如第一次打开为Form1,没有关闭再打开,名称就变成Form1_1了,各位编程时怎样动态获取form的名称?
不能限制每个窗体只能打开一次。也不能在打开前关闭打开过的窗体
9 个解决方案
#1
我已前也碰到,这样太可以解决
procedure TFrm_OtherInList.FormDestroy(Sender: TObject);
begin
Frm_OtherInList:=nil;
end;
退出时释放窗体就可以
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意思 差不多了。
激活上次打开代码如下:
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
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;
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;
退出时释放窗体就可以
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意思 差不多了。
激活上次打开代码如下:
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
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;
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 了)
......