窗口不能正常显示

fengxue291080 2007-01-18 02:44:07
在project里面用下面这句话隐藏窗体
Application.ShowMainForm:=False;

但是show的时候不能正常我用的是
ShowWindow(WinHandle, SW_RESTORE);
SetForeGroundWindow(WinHandle);

可以显示窗体,但是窗体上的什么也没有,Label控件可以正常显示,但是botton,edit,panel等都显示不出来

不知道是什么原因,请大虾指教,有用分大派送!

其实我用hide还是可以正常工作的,这里我主要想清楚Application.ShowMainForm:=False;不能正常地原因!
...全文
348 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengxue291080 2007-01-20
  • 打赏
  • 举报
回复
顶一下,看看还有没有其他高手来拿分
fengxue291080 2007-01-19
  • 打赏
  • 举报
回复
do2008:

感谢你的回复,果然是专业人士,我的那两句写在和你差不多的地方,我再看看通过的你分析我能够搞定,以后还多多指教!
fengxue291080 2007-01-19
  • 打赏
  • 举报
回复
看来是要改这个函数了
procedure TWinControl.UpdateShowing;这个函数
woshihaoge 2007-01-18
  • 打赏
  • 举报
回复
分析的好透彻阿
do2008 2007-01-18
  • 打赏
  • 举报
回复

翻翻VCL: $(DELPHI)\source\vcl\Forms.pas,即可看出大概原因
1.创建一个TForm时,在TForm的构造函数,设置Visible := false
参见:constructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer);


2.这句代码Application.ShowMainForm := false;//
影响到TApplication.Run函数

Forms.pas的 TApplication.Run函数中有

...
if FShowMainForm then //因ShowMainForm := false;
if FMainForm.FWindowState = wsMinimized then
Minimize
else
FMainForm.Visible := True;//所以,FMainForm.Visible 不能设置为true
...

3.到了这里,原因就很明显,就是当主窗口Form的visible为false的原因,

当其为false时,会影响就其函数函数的消息处理,及窗口状态更新等,

如$(DELPHI)\souce\vcl\controls.pas中的
procedure TWinControl.UpdateShowing;这个函数

var
ShowControl: Boolean;
I: Integer;
begin
ShowControl := (FVisible or (csDesigning in ComponentState) and
not (csNoDesignVisible in ControlStyle)) and
not (csReadingState in ControlState);

if ShowControl then// 不再更新Form上的那些子控件,如Btn,edit
begin
if FHandle = 0 then CreateHandle;
if FWinControls <> nil then
for I := 0 to FWinControls.Count - 1 do
TWinControl(FWinControls[I]).UpdateShowing;
end;

因TButton,TEdit都是从TWinControl这个VCL类继承的,所以有影响,
而TLabel是从TGraphicControl这个VCL类继承的,因而没有影响
do2008 2007-01-18
  • 打赏
  • 举报
回复
>>ShowWindow(WinHandle, SW_RESTORE);
>>SetForeGroundWindow(WinHandle);

不知道你这两句代码是写在哪里,下面是我写的测试
program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
bo:Boolean;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);

bo := application.MainForm.Visible;
if (bo) then
Application.MessageBox('visible is true','test');

application.ShowMainForm := false;

bo := application.MainForm.Visible;
if (bo) then
Application.MessageBox('visible is true','test') ;

//加上下面这两句,确实情况如LZ所讲,Label控件可以正常显示,
//但是botton,edit,panel等都显示不出来
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
SetForeGroundWindow(Application.MainForm.Handle);

//加上下面这一句,即可正常显示
//Form1.Show;

bo := application.MainForm.Visible;
if (bo) then
Application.MessageBox('visible is true','test') ;

Application.Run;

end.
Delphi1985 2007-01-18
  • 打赏
  • 举报
回复
学习

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧