MDI子窗体显示非常慢,求助(在线等待)(100分)

  • 主题发起人 主题发起人 ityaa
  • 开始时间 开始时间
I

ityaa

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]最近刚学到MDI窗体,在练习过程中,遇到如下问题:
假设form1是MDI主窗体,form2,form3是子窗体,在主窗体的一个按钮事件中调用子窗体并显示:如下代码
form3:=tform3.create(self);
form3.show;
但在运行时发现,form3总是先显示一个小窗口,然后才最大化(在设计阶段已经将窗体设置为运行时最大化),即速度很慢。怎样才能点一下按钮,窗体马上就显示出来呢?
解决后马上给分。
 
设计期把子窗体放大,这样效果会好一点。
 
是不是你运行时把窗口都创建了
 
我的例子程序有两个子窗体,form2,form3,程序自动创建的是form2.
 
type
TFrmBaseMDIChild = class(TForm)
public
constructor Create(AOwner: TComponent);reintroduce;override;
end;

constructor TFrmBaseMDIChild.Create(AOwner: TComponent);
begin
//MDIMainForm为MDI主窗体,如果不想引用,可以用全局变量保存
LockWindowUpdate(MDIMainForm.Handle);
try
inherited;
finally
LockWindowUpdate(0);
end;
end;
 
在MDI中Child窗体的大小状态是由MDI Main Client的状态决定的
我尝试了各种属性的设置,没找到解决办法,不过我这里这个最大化的速度挺快的
刷得一下就过去了.
最屎的办法?(没尝试,随想)
在激活之前设置预设大小和位置使最大化之前之后的ClientRect基本重合,然后
再显示(比如创建时不指定MDIChild的属性 Visible = False,调整大小后再设置)
 
谢谢大家,问题还是没有解决,我看到有的程序显示几个子窗体和显示一个窗体上的几个panel组件一样快,我的练习例子中有两个子窗体,在主窗体上有两个按钮,按一个按钮时将一个窗体关闭,另一个显示。我参考的程序是magictweak,大家看一下,有什么好办法。分不够可以再加。
to ysai:
您的方法具体应该怎么用,能详细说明吗?谢谢
 
我想我的方法已经够详细了
下面是MDI子窗体的基类(看名字就应该知道)
type
TFrmBaseMDIChild = class(TForm)
public
//覆盖Create方法
constructor Create(AOwner: TComponent);reintroduce;override;
end;

constructor TFrmBaseMDIChild.Create(AOwner: TComponent);
begin
//MDIMainForm为 [MDI主窗体] ,如果不想引用,可以用全局变量保存
LockWindowUpdate(MDIMainForm.Handle); //锁定MDI主窗口,禁止刷新
try
inherited; //子窗体的动画会在inherited时发生
finally
LockWindowUpdate(0); //解锁
end;
end;

然后你的所有MDI子窗体从此基类继承就不会有闪动了
 
to ysai:
谢谢您的帮助。不过我还是不太明白(确实是刚学DELPHI不久),你说的继承在代码中具体怎么写,比如:
type
TFrmBaseMDIChild = class(TForm)
public
//覆盖Create方法
constructor Create(AOwner: TComponent);reintroduce;override;
end;
上面这一段应该写在哪里,是在MDI主窗体中还是在每个子窗体中?
声明了TFrmbaseMDIChild后,在具体显示子窗体中应该怎么用啊?
是否应该将:
form3:=tform3.create(self);
form3.show
改成用TFrmBaseMDIChild 来表示或者是将原子窗体中单元的每个TYPE后面的都改一下?
我看了您的帮助后确实不会用,再次感谢!
 
楼主既然是初学DELPHI,建议先不要着急动手写自己的代码,如果你想学好的话!

如果愿意听的话,我就来唠叨几句:
首先,放下手中的代码,把书(如果没有,去买一本,如果有多本,选择一本,不要太深)
从头到尾看一遍,看不懂没关系,但要用心,要有个形象的认识.
然后开始真正的学习,照着书上的一章章来,一个个例子来,熟悉她,多花点时间.
搞不懂的可以跳过,也许哪天回过头来看看就明白了,用不着在一个地方卡死.

好了,一本书看完你就可以写自己的代码了,书上的东东不可能都记住,不懂再翻.
写了一段时间代码后你就可以放开书了,因为书上的东东(仅指带你入门的书)你已经
学得差不多了,可以选择一本更高深的书,如<DELPHI5开发人员指南>,还有在线帮助,
上论坛,这样就很少有问题能难倒你了.

废话了这么多,切入正题
1.新建一Form,命名为FrmBaseMDIChild,设置相关属性(如FormStyle=fsMDIChild),
并在public部分加上这行
constructor Create(AOwner: TComponent);reintroduce;override;

2.然后按Ctrl+Shift+C,DELPHI将自动为你建立以下代码:
constructor TFrmBaseMDIChild.Create(AOwner: TComponent);
begin
inherited;

end;

3.把上面的代码改为
constructor TFrmBaseMDIChild.Create(AOwner: TComponent);
begin
//MDIMainForm为 [MDI主窗体] ,如果不想引用,可以用全局变量保存
LockWindowUpdate(MDIMainForm.Handle); //锁定MDI主窗口,禁止刷新
try
inherited; //子窗体的动画会在inherited时发生
finally
LockWindowUpdate(0); //解锁
end;
end;
保存

4.点菜单File->New->Other,翻到以你的工程名命名的页(如Project1),选择
刚才命名的Form(FrmBaseMDIChild),下面三个单选按钮分别代表复制,继承,引用.
在这里只能继承,确定后就新建了TFrmBaseMDIChild的一个子类,这就是可视化继承的
一个用法,然后在新建的窗体中做你想做的事,而TFrmBaseMDIChild只做为基类,不应该
有实例.

如果你不想再设计一次,也可以,把第4步改为
4.打开你已经设计好的单元,在interface的uses下面加上TFrmBaseMDIChild所在的单元,
如BaseMDIChildFrm,然后把(假设你的窗体名称为Form1)
TForm1 = class(TForm)
改为
TForm1 = class(TFrmBaseMDIChild)
保存,查看窗体(F12),右击窗体弹出菜单,选择View as Text(或快捷键Alt+F12),查看
.dfm文件,把第一句的
Object Form1 : TForm1
改为
inherited Form1 : TForm1
再按Alt+F12,保存,这样就把你的窗体改成了TFrmBaseMDIChild的子类

好了,运行试试看,有没有达到效果
 
谢谢大家,但还有一些问题,可能是我的机器太差了。
 
后退
顶部