我写了程序用来避免子窗体的重复打开,打开某一个窗体是没有问题的。但是当同时打开了2个窗体,再打开那个不在激活状态下的窗体时,原本打开的窗体不会被激活而是重新打开2个相同的子窗体,这是怎么回事啊?!
代码是这样的
Procedure TF_MPSSAEass.OpenMDIWin(Sender:TFormclass); //避免子窗体重复打开
var
i:integer;
Frm:TForm;
begin
if F_MPSSAEass.MDIChildCount=0 then //先打开一个子窗体
begin
Frm:=Tform(Sender.NewInstance);
Frm:=Frm.Create(self);
Frm.Show;
exit;
end;
for i:=0 to F_MPSSAEass.MDIChildCount-1 do //当已有子窗体打开时判断是否处于最小话或不可见状态
begin
if F_MPSSAEass.MDIChildren[i].ClassType=Sender then
begin
Frm:=F_MPSSAEass.MDIChildren[i];
if Frm.WindowState=wsMinimized then
showwindow(Frm.Handle,sw_shownormal)
else
showwindow(Frm.Handle,sw_showna);
if (not Frm.Visible ) then
Frm.Visible :=True;
Frm.BringToFront;
Frm.SetFocus;
Frm.WindowState:=wsMaximized;
exit;
end;
Frm:=Tform(Sender.NewInstance); //如果上面两种状态都不是则创建新窗体
Frm:=Frm.Create(self);
Frm.Show;
end;
end;
代码是这样的
Procedure TF_MPSSAEass.OpenMDIWin(Sender:TFormclass); //避免子窗体重复打开
var
i:integer;
Frm:TForm;
begin
if F_MPSSAEass.MDIChildCount=0 then //先打开一个子窗体
begin
Frm:=Tform(Sender.NewInstance);
Frm:=Frm.Create(self);
Frm.Show;
exit;
end;
for i:=0 to F_MPSSAEass.MDIChildCount-1 do //当已有子窗体打开时判断是否处于最小话或不可见状态
begin
if F_MPSSAEass.MDIChildren[i].ClassType=Sender then
begin
Frm:=F_MPSSAEass.MDIChildren[i];
if Frm.WindowState=wsMinimized then
showwindow(Frm.Handle,sw_shownormal)
else
showwindow(Frm.Handle,sw_showna);
if (not Frm.Visible ) then
Frm.Visible :=True;
Frm.BringToFront;
Frm.SetFocus;
Frm.WindowState:=wsMaximized;
exit;
end;
Frm:=Tform(Sender.NewInstance); //如果上面两种状态都不是则创建新窗体
Frm:=Frm.Create(self);
Frm.Show;
end;
end;
解决方案 »
- 在事务中,不能存在多个使用此游标类型的记录集
- 求SQL,急!
- 求救:我知道一个网页的url,如何在delphi中启动浏览器并打开这个网面?
- 哪位高手帮我把这段代码做注释,能不能改为遇到回车换行就结束的拷贝。
- “贺岁华东行”--与技术总监和Borland产品专家面对面2004元旦期间课程简介
- ■■Delphi高手请进。一定有收获。赠送经典程序代码■■
- 能否不建立索引将两个表(主从表)用报表显示出来。加急 在线等待
- 如何在DLL中建立数据库连接???
- 界面显示的问题
- 请问哪里有ACROBAT READER 的中文字体包下载?
- 软件加后门
- 在Form上放一个PageControl 后,Form的 OnKeyDown 失效
Frm:=Tform(Sender.NewInstance); //如果上面两种状态都不是则创建新窗体
Frm:=Frm.Create(self);
Frm.Show;
begin
application.CreateForm(Tfrm1,frm1);
frm1.Show;
end; if application.FindComponent('frm2')=nil then
begin
application.CreateForm(Tfrm2,frm2);
frm2.Show;
end;这样就行了,共勉
Procedure TF_MPSSAEass.OpenMDIWin(Sender:TFormclass);
var
Frm:TForm;
begin
if application.FindComponent('Frm')=nil then
begin
application.CreateForm(TFrm,Frm); //这里报错
Frm.Show;
end;
end;
dwDesiredAccess:DWORD;
bInheritHandle:Boolean;
lpName:PChar
):THandle;代碼形式如下:var
Form1: TForm1;
MutexHandle:Integer;procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'RunOnceMutex') <> 0 then
begin
Showmessage('this is open');
exit;
end;
MutexHandle:=CreateMutex(nil,true,'RunOnceMutex'); application.CreateForm(Tform2,form2);
form2.Show; ReleaseMutex(MutexHandle);
end;
ZAppName : array[0..127] of char;
Hold : string;
Found : HWND;
procedure TfmMain.FormCreate(Sender: TObject);
begin
//////////////////////////////检查是否已执行程序//////////////////////////////
Hold := Application.Title;
Application.Title := 'OnlyOne' + IntToStr(HInstance);
StrPCopy(ZAppName, Hold);
Found := FindWindow(nil, ZAppName);
Application.Title := Hold;
if Found <> 0 then
begin
ShowWindow(Found, SW_RESTORE);
Application.Terminate;
end;
//////////////////////////////检查是否已执行程序//////////////////////////////
end;
if not assigned(frm1) then
frm1 := Tfrm1.create(nil);
frm1.show;
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms[i].ClassType=FormClass then
begin
Child:=TForm(Screen.Forms[i]);
if Child.WindowState=wsMinimized then
ShowWindow(Child.handle,SW_SHOWNORMAL)
else
ShowWindow(Child.handle,SW_SHOWNA);
if (not Child.Visible) then Child.Visible:=True;
Child.BringToFront;
Child.Setfocus;
TForm(fm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
TForm(fm):=Child;
Child.Create(AOwner);
end;
有时会有充满的问题。
用于主窗体打开MDI子窗体。
form1:= Tform1.create(nil);
begin
//
end;
frm1 := Tfrm1.create
else
frm1.bringtofront;
//show的过程包括create和onshow两个事件,bringtofront只会把窗体制前。