进度窗口上放了1个Label,1个进度条,在Form1的Create事件中有时间稍长的查询语句,此时想显示信息窗口,但信息窗的边框、Label,进度条等都显示不出来,只显示此窗口的轮廓出来。
例如:
procedure TForm1.FormCreate(Sender: TObject);
begin
 if frmWait=nil then frmWait:=TfrmWait.Create(Application);
 frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
  adoDataset1.commandtext:='select * ...';
  adodataset1.open;
 Screen.Cursor:=crDefault;
 frmWait.Visible:=False;
end;运行时frmWait中的所有控件包括边框根本不能完整显示。请问有什么好方法?

解决方案 »

  1.   

    在一个窗体创建的时候再创建另一个窗体,很可能两个窗体都显示一个模糊的轮廓,程序根本来不及刷新,你的方法不可行,当然你可这样试试,不一定能行。
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     if frmWait=nil then frmWait:=TfrmWait.Create(Application);
     frmWait.show; //显示进度信息
    frmWait.Update;//强制显示 Screen.Cursor:=crHourGlass;
      adoDataset1.commandtext:='select * ...';
      adodataset1.open;
     Screen.Cursor:=crDefault;
     frmWait.Visible:=False;
    end;
      

  2.   

    应该是frmWait的编程有问题,应该在frmWait里增加TTimer1(Enabled:=False)
    procedure TFrmWait.Timer1Timer(Sender: TObject);
    begin
      Screen.Cursor:=crHourGlass;
      adoDataset1.commandtext:='select * ...';
      adodataset1.open;
      Screen.Cursor:=crDefault;  Timer1.Enabled:=False;
    end;在frmWait的FromShow事件里增加
    procedure TFrmWait.FormShow(Sender: TObject);
    begin
      Timer1.Enabled:=True;
    end;
      

  3.   

    : human_2(风一帆) 没说完整
    在操作费时的地方加入Application.ProcessMessages,例如:  while I < 64000 do
      begin
        Randomize;
        while J < 64000 do
        begin
          Y := Random(J);
          Inc(J);
          Application.ProcessMessages;
        end;
        X := Random(I);
        Inc(I);
      end;
      

  4.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     if frmWait=nil then frmWait:=TfrmWait.Create(Application);
     frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
      adoDataset1.commandtext:='select * ...';
      adodataset1.open;
     Application.ProcessMessages
     //加上这句看看,我想可能不会有效果
     Screen.Cursor:=crDefault;
     frmWait.Visible:=False;
    end;
     我感觉就你这个思路而言,可能就会出问题了吧,当你adodataset1.open时候
    程序并不继续执行你下面的代码了,而是等程序返回了再继续执行
    而且你可以分多次打开数据库记录,非要一次性打开的吗?试用有谁能够一次性看的了这么多的记录,就算是你要处理记录的话(如进行计算)也可以分多次打开的吧,这样有助于提高效率
      

  5.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     if frmWait=nil then frmWait:=TfrmWait.Create(Application);
     frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
      adoDataset1.commandtext:='select * ...';
      adodataset1.open;
     Application.ProcessMessages
     //加上这句看看,我想可能不会有效果
     Screen.Cursor:=crDefault;
     frmWait.Visible:=False;
    end;
     我感觉就你这个思路而言,可能就会出问题了吧,当你adodataset1.open时候
    程序并不继续执行你下面的代码了,而是等程序返回了再继续执行
    而且你可以分多次打开数据库记录,非要一次性打开的吗?试用有谁能够一次性看的了这么多的记录,就算是你要处理记录的话(如进行计算)也可以分多次打开的吧,这样有助于提高效率
      

  6.   

    首先谢谢各位的参与。
     if frmWait=nil then frmWait:=TfrmWait.Create(Application);
     frmWait.show; //显示进度信息
    //经过测试,加上以下任一句都可及时显示出表单 
     Application.ProcessMessages;
     frmWait.Update;
    情况是这样:建立Form1时,得打开十来个数据表(IP连到远程SQL服务器上的数据库),网络不理想时速度比较慢。 每执行一个dataset.open时,无法更新进度条,只好在dataset的beforeopen或afteropen事件中来刷新一下。  效果不是太好,但目前找不到更好的办法。
      

  7.   

    信息窗口refresh一下就可以显示完整了.
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     if frmWait=nil then frmWait:=TfrmWait.Create(Application);
     frmWait.show; //显示进度信息
     frmwait.refresh;
      ...................
    end;
      

  8.   

    大家说的方法是对的,单纯做个进度条,我想楼主不应当有什么问题。可有时(如做毫CPU比较大),进度条是走动不了的,即使是用现成进行控制。如果实在不行,就考虑做个假的吧。http://expert.csdn.net/Expert/topic/1905/1905529.xml?temp=.0965082讨论了很久,没办法,不知你的具体情况是否也如此。
      

  9.   

    每隔一段时间就刷新一下介面,用
    Application.ProcessMessages
    这样才不会给人一种死机的感觉。
      

  10.   

    frmWait.show; //显示进度信息
    frmWait.Refresh;