我正在开发一个MDI风格的软件,其中有一部分MDI子窗口(由于程序的需要,只能做成MDI子窗口)需要隐藏起来执行任务,在需要的时候才显示出来。为了达到此目的,我覆盖了Create构造函数。如下
TMdiChildForm.Create(AOwner:TComponent);
begin
Inherited;
ShowWindow(Handle, SW_Hide);
end;当时出现了一个问题,当我同时打开十多个MDI子窗口时,这些窗口全部会在界面上一闪而过,造成界面很难看。如何解决这个问题?
TMdiChildForm.Create(AOwner:TComponent);
begin
Inherited;
ShowWindow(Handle, SW_Hide);
end;当时出现了一个问题,当我同时打开十多个MDI子窗口时,这些窗口全部会在界面上一闪而过,造成界面很难看。如何解决这个问题?
解决方案 »
- 大家一起来讨论网络教学delphi的收费问题
- 昨晚搞很久。关于动态生成控件的问题。。其中有问题?
- 如何读取资源中的exe文件,并显示在自己的窗体上?
- 怎么固定工具面板位置,比如object treeview,object inspector的位置我拖到一个位置,下次打开delphi时候还是这个位置
- 请问怎样在打印报表时统计一列数据的总和并显示出来?
- 简单的insert问题
- ADOQuery的问题
- 请教,视图和临时表用的时候有什么区别?
- 请教一个设计思路问题,是否会造成系统的滥用。请大家多提意见。
- 用Delphi怎么作文件分割器,它的核心算法是什么?
- 一个delphi调用matlab的问题,1000分,绝不食言!!!)
- 经举报发现 tgmgj SQL5560 间存在严重的倒分现象,现作出处理如下:
先创建后隐藏再显示是可以提高显示的速度但效果并无使用Frame控件替代MDI窗体效果好,可以试验一下
我的Email:[email protected]可以探讨探讨
LockWindowUpdate(主窗体.Handle);
//显示子窗体
LockWindowUpdate(0);—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
不过在窗体元素多的话也不太理想,这本身是delphi Mdi的问题。
怎么还是一样的?
if Form1 =nil then
Form1 :=TForm1.Create(self);
Form1.show;
LockWindowUpdate(0);
var
ChildFrm: TChildFrm;
begin
LockWindowUpdate(Handle);
try
ChildFrm := TChildFrm.Create(Self);
//做你的事情。如执行函数,显示向导等...
finally
LockWindowUpdate(0);
end;
end;
var
ChildFrm: TChildFrm;
begin
LockWindowUpdate(Handle);
try
ChildFrm := TChildFrm.Create(Self);
//可能使这里要执行的内容太多了,并且每个ChildForm要初始化的内容也多
//总之,还是闪烁,我想这不是根本的解决方法,
finally
LockWindowUpdate(0);
end;
end;
try
CloseLayout; cdsTemp:=TClientDataset.Create(nil);
try
cdsTemp.SetProvider(dmDatabase.dspWorkSpace); //打开窗口
sSql:='select layoutdetail.moduleid as moduleid,modulelist.formclass as formclass,'+
'layoutdetail.modulename as modulename from layoutdetail,modulelist where '+
'layoutdetail.modulename=modulelist.modulename';
cdsTemp.CommandText:=sSql;
cdsTemp.Open;
for iCount:=1 to cdsTemp.RecordCount do
begin
cdsTemp.RecNo:=iCount; sModuleID:=cdsTemp.FieldByName('moduleid').AsString;
sModuleName:=cdsTemp.FieldByName('modulename').AsString;
sFormClass:=cdsTemp.FieldByName('formclass').AsString; pClass:=TMDIChildClass(GetClass(sFormClass));
if pClass=nil then Continue;
pClass.Create(Self,sModuleName+'/'+sModuleID);//这里创建MDIChild窗口
end; //建立页面
cdsTemp.Close;
cdsTemp.SetProvider(dmDatabase.dspWorkSpace);
sSql:='select * from layoutpage';
cdsTemp.CommandText:=sSql;
cdsTemp.Open;
for iCount:=1 to cdsTemp.RecordCount do
begin
cdsTemp.RecNo:=iCount; TabSheet:=TTabSheet.Create(pgcPage);
TabSheet.Caption:=cdsTemp.FieldByName('pagename').AsString;
TabSheet.Hint:=cdsTemp.FieldByName('pageid').AsString;
TabSheet.PageControl:=pgcPage;
end;
finally
cdsTemp.Free;
end; sCurrentPage:=ReadWorkSpaceParameter('CurrentPage');
if sCurrentPage='' then exit;
TabSheet:=nil;
for iCount:=0 to pgcPage.PageCount-1 do
begin
if pgcPage.Pages[iCount].Hint=sCurrentPage then
begin
TabSheet:=pgcPage.Pages[iCount];
Break;
end;
end;
if Assigned(TabSheet) then pgcPage.ActivePage:=TabSheet;
finally
LockWindowUpdate(0);
FIgnoreChildChange:=bOldFlag;
end;
pClass:=TMDIChildClass(GetClass(sFormClass));
if pClass=nil then Continue;
pClass.Create(Self,sModuleName+'/'+sModuleID);//这里创建MDIChild窗口其中
TMDIChildType = Class(TForm);//定义了一个所有MDIChild的祖先窗口,我要打开的窗口皆是他的子孙类,我重新定义了他的构造函数,如下:
Constructor Create(AOwner:TComponent;sParam:string='');reintroduce;virtual;TMDIChildClass = Class of TMDIChildType
Constructor Create(AOnwer:TComponent);
begin
Inherited;
Perform(WM_SETREDRAW, 0, 0);//
......
end;那么,在需要显示的时候用如下方法:
ShowWindow(Child.Handle, SW_Show);