如何激活某已打开的窗体成为当前窗体?急急(20分)

  • 主题发起人 主题发起人 carrie4002
  • 开始时间 开始时间
感觉“if assigned(form2) then
SetForegroundWindow(Form12.Handle)”里的判断
好象没起作用。
 
语句“h := FinsWindow(nil, '你的窗体');”,编译时
错误提示是:Undeclared identifier 'FinsWindow'。
>>

是findwindow
 
我的代码:
if assigned(form2) then
begin
SetForegroundWindow(FindWindow(nil,'form2'));
end
else
begin
pForm:= TForm2.Create(self);
pForm.Show;
end;
结果依然没变:调用form2后,再调用form3窗体,然后再调用
form2,依然是重开form2窗体,原来运行的form2窗体还在,没象
希望的那样被激活并在最前面,而是有2个form2窗体并存。
 
if assigned(form2) then
begin
form2.BringToFront
end
else
begin
Form2:= TForm2.Create(self); //===============
Form2.Show; //===============
end;
 
谢谢。
因为我定义过
var
pForm:TForm2;
其实你的代码和我的一样。运行结果也一样。都是错的。
 
if assigned(form2) then否   //此处判断 Form2
begin
form2.BringToFront
end
else
begin
Form2:= TForm2.Create(self); //===============
Form2.Show; //===============,我的代码跟你是不一样的

pForm //而你这边却是 pForm ,当然是永远都是创建窗口
end;
 
var
pForm:TForm2;
而且我估计你此处定义的肯定是局部变量
 
抱歉。怪我愚笨,但我真的不理解你的话。
你的Form2也是需要定义的吧,你怎样定义呢?
定义成Form2和定义成pForm有什么区别呢?
 
to onlyonekgx,:
是局部变量。
改成你的代码依然是同一窗体多次调用显示多个。
因为“Form:= TForm14.Create(self);”是在窗体
不存在时运行的语句,不存在就创建。
 
哎,怎么说你都不清楚

你在编程设计时,每新建一个窗体类(比如 TForm1),就有一个全局变量 Form1与之对应

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

所以你不需要另外定义局部变量你只需要

if Assigned(Form1) then //这里是判断这个全局变量,而不是象你那样判断局部变量
begin //象你那样判断局部变量(其实根本不用定义局部变量),那当然是永远为 nil
form1.BringToFront
end
else
begin
Form1:= TForm1.Create(self);
Form1.Show;
end

哈哈,不过这样写有一个问题就是,在你关闭了 Form1 后,你下次可能无法创建
你需要在 Form1 的close事件中写: Form1:=nil;
(注:这里用Form1举例,前面用的是Form2举例,道理一样)
 
To onlyonekgx:
谢谢。你说得有道理。
当去掉“var Form1: TForm1;”这里的定义时,代码能实现
多次调用只显示一个窗体的功能。你的思路是对的。
但关闭窗体时,错误提示为:Stack overflow.
下面是我的关闭退出代码。
一、我用按纽来实现退出:
FreeAndNil(Form2); //或者换成:Form2:=nil
close;
二、我在该窗体的close事件中:
Form2:=nil;
close;
是否是关闭时不合规范?
 
这个我解决过。
我是动态创建子窗体的.
在mainfm的
1、变量
implementation
var
f:Taddfolderfm;
d:Taddadiskfm;
2 消息
声明: procedure getmessage(var msg:Tmessage);message mymessage;
procedure Tmainfm.getmessage(var msg: Tmessage);
begin
if msg.WParam=1 then
d:=nil;
end;
3 创建窗体
if d<>nil then
begin
d.BringToFront;
exit;
end;
try
d:=Taddadiskfm.Create(application);
d.Show;
except
d.Free;
d:=nil;
end;
end;
4在自窗体关闭的时候发消息
可以是关闭按钮事件也可以是close事件中
sendmessage(mainfm.Handle,mymessage,1,0);
//lz看看
//其实中心思想就是利用消息告诉调用窗体的程序这个窗体是否存在
 
谢谢。
如果我的消息是:mymessage:='窗口关闭'
这条指令该如何写:sendmessage(mainfm.Handle,mymessage,1,0);???
 
另外,我现在的问题是:关闭窗体时怎样才能消除错误提示中的
“Stack overflow!”呢?
什么时候可能出现这种错误呢?
大虾们,诚请!!!
 
对于显示
if not assigned(form2) then
form2:=tform2.create(application);
form2.show;
对于关闭
在ONDESTROY中添加form2:=nil;
如果时mdi窗体在onclose中添加action:=cafree;
 
谢谢。
都试过了,关闭时依然是&quot;Stack overflow!&quot;
 
1
Stack overflow表示堆栈溢出,和窗体关闭没有必然联系,请检验你的程序。
是否资源释放,内存操作等等方面有不当之处。找到出错的代码
用try结构和getlasterror得到错误号然后到msdn上查 system error codes
2
如果希望给一个程序发送一串子符 用 WM_CHAR 消息发送。
你可以自己确定自定义消息中的WParam 是什么含义例如
msg.WParam=1 为关闭窗口
msg.WParam=33为隐藏窗口
 
谢谢。你这一说我觉得事情麻烦了。我不熟。
Form2:=nil能释放窗体内所有变量资源么?
我没有MSDN,只有Delphi自带的英文帮助。需要中文MSDN,
哪里能得到?多谢。 急
 
1 不能,form2:=nil只能将form2对象的指针为空;

2 msdn是微软的网站
http://msdn1.microsoft.com/en-us/default.aspx
它提供了SDK的说明,是在ms下编程最重要的技术支持网站
 
如果是自动创建的窗体,会自动维护的.
要显示,只需 formXXX.show
要关闭,直接点击 X 关闭.
无需其他任何语句的.

只有手工动态创建的窗体,才要自己维护创建和释放的代码.

估计楼主搞的是自动创建的窗体.其实是无需额外代码维护的.
多写了语句,反倒画蛇添足,出错了.
 

Similar threads

后退
顶部