//在form2中单击按钮,显示一个窗口f1,代码如下:
form2.button1click(sender:object)
var f1:Tform1;
begin
if f1=已经存在 //如何在这里判断这个f1窗口已经被创建过了?
//注意这里f1是一个局部变量。
f1.BringToFront;
else
begin
f1:=Tform1.create(self);
f1.show;
end;
end;
敬请帮助,不胜感激。
form2.button1click(sender:object)
var f1:Tform1;
begin
if f1=已经存在 //如何在这里判断这个f1窗口已经被创建过了?
//注意这里f1是一个局部变量。
f1.BringToFront;
else
begin
f1:=Tform1.create(self);
f1.show;
end;
end;
敬请帮助,不胜感激。
var f1:Tform1;
begin
if f1<>nil then
//局部变量在栈上分配空间,但栈管理仅仅是移动栈顶指针,栈上随机存放着此前用过的乱七八糟的数据
// 一量f1被分配在内容不为0的四个字节上,那么这个判断将成立,但f1指向的位置一定不是一个TForm1的实例
//将报内存错误
// 只有在巧合的情况下,f1占据的四字节栈空间全部是0,则 f1=nil,才转去执行下面的Create语句
// Assigned(Pointer)与 Pointer=nil是同样的效果。
f1.BringToFront
else
begin
f1:=Tform1.create(self);
f1.show;
end;
end; 再假设一下楼主的最终需求:----如果楼主只是想“通过F1创建一个TForm1的实例,如果此实例已创建,就显示出来;如果未创建或已释放,那就重新创建并显示”:那么就可以用kaikai_kk的写法了,但要求是全局变量。var
F: TForm1;{全局变量}procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(F) then F := TForm1.Create(Self);
F.Show;
end;有一个前提条件,就是:在释放F对象后,要做到立即把F变量赋值为空指针:F := nil;这样,当F.Hide后,F隐藏,此时再点击Button将重新显示F;当FreeAndNil(F)后,就重新构造并显示。------如果楼主是想动态创建多个TForm1的实例,那么,有几种方案:
一种是通过array of TForm1进行管理(或TList)
二种是用with开域语句进行构造,同时一定要给窗体起一个名字,然后,可以通过这个名字,用FindComponent进行查找
这种方法也有一个前提,那就是Create(AOwner)时,一定要指定AOwner为同一个对象,例如Self
说了这么多,没有实际去改楼主的代码,汗自己一个。不写了。
var f1:Tform1;
在你新建一个form的时候,对应的unit里已经自动给你声明了一个这个窗体变量,而它是全局的,你完全可以使用这个变量就可以了,但在具体判断的时候你虽然可以使用if Assigned(frm1) then这样的方法来判断,但你要做到必要的初始化,及在关闭form的时候做好free及指为nil(或者用freeandnil)
form2.button1click(sender:object)
var
f1:Tform1;
begin
if f1 <>nil then //或if assigned(f1) then
begin
f1.BringToFront;
end
else
begin
f1:=Tform1.create(self);
f1.show;
end;
end;
public h:hwnd
buttonclick(sender :Tobject)
var f1:Tform1;
begin
//判断
if (hwnd<>0) then SetForegroundWindow(hwnd)
else
begin f1:=Tform2.create (self);hwnd:=f1.handle;end;
end;
然后在form2中释放:form1.h:=0;
不知道使用句柄是否有隐患?
谢谢诸位,倾力相助。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
I : integer;
begin
for I := 1 to 5 do
if Self.FindComponent('MyFrm'+InttoStr(I)) = nil then
with TForm1.Create(Self) do begin
Name := 'MyFrm' + InttoStr(I);
Top := 30;
Left := 50*I;
Caption := Name + '创建于' + Formatdatetime('hh:nn:ss.zzz', Now);
Button1.Enabled := False;
Show;
end
else
TForm1(Self.FindComponent('MyFrm'+InttoStr(I))).Show;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Self.Hide;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Width := 200;
Button1.Caption := 'All Create or Show';
Button2.Caption := 'Hide Self';
end;end.