用delphi和oracle开发一个小系统,因为一个表中的数据较多(几万条),想在查询的时候自动生成一个窗口提示正在准备数据,但是用下面的代码生成一个窗口后,label中的文字却要等到adoquery执行完select后才显示出来,在执行select过程中生成的窗口里面什么也没有,都是空的。请问怎么办?谢谢?
procedure TForm1.Button1Click(Sender: TObject);
var
formtemp:TForm;
Msg:TLabel;
begin
  formtemp:=Tform.Create(nil);
  formtemp.Width:=340;
  formtemp.Height:=70;
  formtemp.Position:=poMainFormCenter;  Msg:=TLabel.Create(formtemp);
  Msg.Parent:=formtemp;
  Msg.Caption:='正在准备数据...';
  formtemp.Show;  with ADOQuery1 do
  begin
  Close;
  SQL.Clear;
  SQL.Add('select * from sys.T_JOB_UNIT');
  Prepared;
  Open;
  end;
end;

解决方案 »

  1.   

    在 formtemp.Show;这句后面加上一句 formtemp.update;
      

  2.   

    在 formtemp.Show;这句后面加上一句Application.ProcessMessages;
      

  3.   

    谢谢楼上各位高手,问题解决了。还有个小问题请教一下,我想让这个动态生成的窗口显示在最前面,且显示这个窗口时其他窗口接受不了输入,就用了formtemp.ShowModal来显示,但这样虽然能实现这个目的,但是显示了这个窗口后,后面的语句好像就执行不到了,怎么办解决啊?马上送上分。
      

  4.   

    ShowModal肯定是不能用的,因为它在窗口关闭后才会继续向下执行;
    Application.ProcessMessage最好也不要用,因为它会在操作过程中不恰当地给用户操作的机会;procedure TForm1.Button1Click(Sender: TObject);
    var
      formtemp:TForm;
      Msg:TLabel;
      ProgressBar: TProgressBar;
    begin
      formtemp:=Tform.Create(nil);
      formtemp.Width:=340;
      formtemp.Height:=70;
      formtemp.Position:=poMainFormCenter;
      formtemp.FormStyle := fsStayOnTop;  ProgressBar := TProgressBar.Create(FormTemp);
      ProgressBar.Parent := FormTemp;
      ....  Msg:=TLabel.Create(formtemp);
      Msg.Parent:=formtemp;
      Msg.Caption:='正在准备数据...';  formtemp.Show;  with ADOQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select * from sys.T_JOB_UNIT');
        Prepared;
        Open;    ProgressBar.Min := 1;
        ProgressBar.Max := RecordCount;    while not Eof do
        begin
          ....
          ProgressBar.StepIt;
          ProgressBar.Refresh;
          Next;
        end;
      end;  formtemp.Free;
    end;