在MDI FORM中,如何只开一个窗口??(60分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
同一个MDI CHILD窗口可以开多个,
但我只想开一个,如果再开只把原来已经开的窗体显示出来
 
Just like this :
var prewindow:hwnd;
begin
prewindow:=findwindow('tform1','form1');
if prewindow<>0 then
setforegroundwindow(prewindow);
end
 
怎么我的
prewindow:=findwindow('tform1','form1');
始终返回0?
 
procedure TForm1.menu1Click(Sender: TObject);
var
childform:TForm2;
begin
if mdichildcount=1 then
previous
else
begin
ChildForm:=TForm2.Create(Application);
childform.show;
end;

end;
 
既然你只想开一个窗口,那么,在主窗口中
设定一个变量:
public:
MDIForm:TMDIChild;
procedure TForm1.menu1Click(Sender: TObject);
begin
if mdichildcount=1 then
MDIForm.Show;
else
begin
MDIForm:=TMDIChild.Create(Self);
MDIform.show;
end;
end;

 
>>怎么我的prewindow:=findwindow('tform1','form1');始终返回0?
你保证你的MDI CHILD窗口是form1吗?
一般Form1是主窗口,上面只是举例,你要根据实际情况输入正确的参数.
 
Charles: 我确实输入正确的参数,奇怪!!??
不过我想了一个苯办法,基本达到了我的目的
var
i,bz : Integer
begin
Bz := 0;
For i := 0 To MDIChildrenCount-1do
if MDIChildren.name='myformname' then
begin
MDIChildren.BringToFront;
Bz := 1;

Exit;
end;
end;
if bz = 0 then

Application.CreateForm(TMyform,Myform);
end;



 
呵呵,既然只有一个自窗口,又何必管他名字是否是'myformname'?
直接用MDIChildrenCount判断有没有子窗口,有的话就BringToFront,
没有就创建一个不就可以了?
 
if form1.MDIChildCount>0 then
form1.MDIChildren[0].show
else
Application.CreateForm(TMyform,Myform);
 
The <strong>FindWindow</strong> function retrieves the handle to the top-level window
whose class name and window name match the specified strings. <strong>This
functiondo
es not search child windows.</strong>
The <strong>FindWindowEx</strong> function retrieves the handle to a window whose
class name and window name match the specified strings. <strong>The function
searches child windows</strong>, begin
ning with the one following the given
child window.
 
dj:能否就FindwindowEx的用法给个中文祥释,然后这分就是你的了
 
一个MDICHild窗口而已,有必要动用FindWindow,FindWindowEx吗?
是否有MDIChild窗口,直接用MDIChildCount就可以了。当然,想要
另外多了解一些除外了,呵呵。
 
怎么可能只有一个FORM了,全部大约30几个FORM
 
>>同一个MDI CHILD窗口可以开多个,
>>但我只想开一个,如果再开只把原来已经开的窗体显示出来
你不是说只想开一个吗?如果我不是理解错的话,那就是说你的
MDIForm有很多种了,每一种只想开一个?
那就用下面的方法:
procedure TMainForm.NewMyFormClick(Sender:TObject);
var
i : Integer
begin
For i := 0 To MDIChildCount-1do
if MDIChildren is TMyForm then

begin
MDIChildren.BringToFront;
Exit;
end;

Application.CreateForm(TMyform,Myform);
end;

用MDIChildren.Name不是很好,因为你在设计的时候
很可能会改变它。
 
DreamTiger:
>用MDIChildren.Name不是很好,因为你在设计的时候
>很可能会改变它。
我觉得Name一般不会在运行时刻改变,如果在设计时改变,者FORM的类名也
会随之改变。我认为最好还是用findwindow这类函数
 
我的理解:
FindWindow一般用于在整个Window中搜索给定标题名的窗口,这样,如果你有两个
相同的实例(称为1和2)在运行,现在,2想打开一个子窗口(名为Child),那么,
用FindWindow就可能搜索到1,再用FindWindowEx搜索子窗口,而1已经打开一个
名为Child的子窗口,2就不会再打开这种Child子窗口了。这显然不是你所希望的。
当然,你如果保证你的程序只能运行一个实例,这也可行。我只是想,这本是你程
序内部可以解决的问题,何必到整个Window中去寻找解决方法。至于用Name还是用
is来判断,道理是一样的,无所谓了。只是我觉得用is比用name稳当一些,而且你可以控制可以打开几个同种类型的子窗口(当然,这不是必要的,只是举个例子)。
 
呵呵,DreamTiger
奇怪用NAME其中一个MDIFORM会出问题,换用IS后正常
同意你的说法
 
后退
顶部