奇怪的窗体(老在主窗体建立之前建立并show)(100分)

  • 主题发起人 主题发起人 xinjia
  • 开始时间 开始时间
X

xinjia

Unregistered / Unconfirmed
GUEST, unregistred user!
一个项目,有一个主窗体mainform
主窗体上有menu,每个menuitem的click事件都是show.otherform SDI结构
program maind;
可是运行时老是先建立按钮show的窗体rklr窗体并show
以后才建立主窗体mainform并show;不知何故
uses
Forms,
mainp in 'mainp.pas' {mainform},
rklrp in 'rklrp.pas' {rklr},
qyjlp in 'qyjlp.pas' {qyjl},
zxjlp in 'zxjlp.pas' {zxjl},

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(Trklr, rklr);
Application.CreateForm(Tqyjl, qyjl);
Application.CreateForm(Tzxjl, zxjl);
Application.CreateForm(Tswzx, swzx);
Application.Run;
end.

 
在工程项目中的Form选项页中把你的子窗体去掉就行了。
 
问题不在是否AUTO CREATE上,就算不是动态生成FORM,正常情况下也应该首先SHOW主FORM
应该是两种可能:
1、看看你的OPTIONS中主FORM选项是否改变过。
2、看看你的主FORM的ONCREATE、ONSHOW中有没有不正确的代码。
 
>>一个项目,有一个主窗体mainform
>>主窗体上有menu,每个menuitem的click事件都是show.otherform SDI结构
>>program maind;
>>可是运行时老是先建立按钮show的窗体rklr窗体并show
>>以后才建立主窗体mainform并show;不知何故

这段话不大明白,可以说得清楚一些吗?
 
第一个建立(Application.CreateForm)起来的窗体应该是主窗体。
你的主FORM的ONCREATE、ONSHOW、OnActive中有没有不正确的代码
 
最笨的方法:
将先出现的窗体的visible=False,主窗体onShow事件中令子窗体visible=True;一切Ok
 
主form的oncreat,onshow,onactiv均没有事件。
在次之前之后建立的窗体都不会在主窗体显示之前显示
option中主form的选项该过但主窗体未动,
我现在只有吧项目文件里的
Application.CreateForm(Trklr, rklr);
去掉在botton的onclick事件写上
Application.CreateForm(Trklr, rklr);
rklr.show;
问题算是另找门路解决了,但是为什么出现那样一直迷惑不解,因此想与大家讨论。

to ddev:

我建立一个application,第一个窗体自然是本项目的主窗体,
窗体上的button调用几个窗体。正常情况下运行本项目应该显示主窗体。
点击button显示被调用的窗体(button.onclick事件:show.窗体)

现在程序启动过程中未等主窗体显示,有一个被调用的窗体就显示了,然后才显示主窗体
启动完成后焦点在主窗体,但可以看到被主窗体掩盖一部分的 被调用窗体。我并没有show它

 
>>option中主form的选项该过但主窗体未动??
什么意思,主FORM选项改成别的窗口了?
你要真的做项目,最好把不必要的窗口全部改成AVAILABLE,虽然代码多点,但占内存少
的多,一大堆窗口长驻内存,你也不怕死机。
 
我觉得你的这种情况和程序启动时出现溅落窗口的情况差不多。
只不过溅落窗口的出现是故意为之,而你的这种情况是自动出现的!
你可以检查一下代码,有没有这种情况!?
 
我写的代码是简化的,
我的系统中使用了闪现窗体,我认为与此无关,闪现窗体运行中主窗体建立之前一掠面过
是正常的。明明是先creat的mainform,运行时确先creat其它窗体。


{$R *.RES}

begin
Application.Initialize;
splashform:=Tsplashform.create(Application);
splashform.Show;
Application.Title := 'pcsxt';
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(Trklr, rklr);
Application.CreateForm(Tqyjl, qyjl);
Application.CreateForm(Tzxjl, zxjl);
Application.CreateForm(Tswzx, swzx);
splashform.Hide;
splashform.Free;
Application.Run;
end.

 
Application.Initialize;
Application.CreateForm(Tmainform, mainform);
//Application.CreateForm(Trklr, rklr);
//Application.CreateForm(Tqyjl, qyjl);
//Application.CreateForm(Tzxjl, zxjl);
//Application.CreateForm(Tswzx, swzx);

在MainForm创建后的几行代码就已经表示在创建主窗体的
同时,就创建了各个子窗体(子窗体被创建后,能自动Show,
而无须你手工去发 MDIChild.Show 命令,这是 Delphi 的默认操作)。
所以你根本无须去强制点击相关的命令控制。你可以看看
自动创建窗体部分的相关文档说明。如果你是想通过命令来
Show一个子窗体,那么你的代码肯定是错的 ----------
就是那几行注释掉的代码。
 
改为:
uses
Forms,
mainp in 'mainp.pas' {mainform},
rklrp in 'rklrp.pas' {rklr},
qyjlp in 'qyjlp.pas' {qyjl},
zxjlp in 'zxjlp.pas' {zxjl},

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(Tmainform, mainform);
// 实在没有必要在这里创建窗体,所以注释掉
// Application.CreateForm(Trklr, rklr);
// Application.CreateForm(Tqyjl, qyjl);
// Application.CreateForm(Tzxjl, zxjl);
// Application.CreateForm(Tswzx, swzx);
Application.Run;
end.

这样就不会有问题了,要不,把原代码发过来,我帮你改(三天内,后边要出差)
 
谢谢各位的指点,我把创建窗体减少为少数几个常用的,其它不常用的使用时再建
我窗体在主窗体建立之前自动创建并show的原因是
只要把创建一个新窗体时的缺省值visible误修改为true;
这样只要创建它就显示,改为false后,就没有问题了,使用时再show就可以了
 
后退
顶部