双击EXE文件运行大概需要10秒(此时跳出空白窗口呈无响应状),如何在这10秒内显示进度条???
我的程序共3个form,Form1是登陆窗口,Form2和3工作窗口(包括6个adoquery)。
我双击EXE文件运行大概需要10秒(此时跳出空白窗口呈无响应状),如何在这10秒内显示进度条???
下面的代码不行,打开程序白色,并无响应状态,10s才打开,如何修改成10s显示进度条:
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
  ProgressBar1.Visible:= True;
  ProgressBar1.min:= 0; progressBar1.Max:= 100;  //此处的N为总长
  ProgressBar1.Value:= 0;    //初始化开始位置
  for i:=0 to 100 do
  begin
    ProgressBar1.Value:=i + 1; Application.ProcessMessages;
  end;
  ProgressBar1.Visible:= False;  with Form1.ADOQuery1 do
  begin
    close;
    sql.clear;
    sql.Add('select * from users');
    open;
    while not Eof do
    begin
      ComboEdit1.Items.Add(Fieldbyname('name').AsString);
      next;
    end;
  end;
end;

解决方案 »

  1.   

    试下这样:procedure TForm1.FormCreate(Sender: TObject);
    var
    i:integer;
    begin
      ProgressBar1.Visible:= True;
      ProgressBar1.Value:= 0;    //初始化开始位置
      ProgressBar1.min:= 0;
      //progressBar1.Max:= 100;  //此处的N为总长
      with Form1.ADOQuery1 do
      begin
        close;
        sql.clear;
        sql.Add('select * from users');
        open;
        progressBar1.Max:= RecordCount;  //此处的N为总长
        while not Eof do
        begin
          ProgressBar1.Value:=ProgressBar1.Value + 1;
          Application.ProcessMessages;
          ComboEdit1.Items.Add(Fieldbyname('name').AsString);
          next;
        end;
      end;
      ProgressBar1.Visible:= False;
    end;
      

  2.   

    新建一个Thread,假设命名为TThread1,在Unit2.在unit2的uses加上Form1的单元,假设为Unit1.给TThread1加上一个私有变量:Form: TForm1;
    先重载构造函数:constructor TThread1.Create(F: TForm1);
    begin
      inherited Create(True);
      Form := F;
    end;
    给TThread1加上一个私有过程DoInit():procedure TThread1.DoInit():
    begin
     with Form.ADOQuery1 do
      begin
        close;
        sql.clear;
        sql.Add('select * from users');
        open;
        while not Eof do
        begin
          Form.ComboEdit1.Items.Add(Fieldbyname('name').AsString);
          next;
        end;
      end;  
    end;在TThread1的Execute写上:procedure TThread1.Execute;
    begin
      Synchronize(DoInit);
    end;Unit1的implementation加上uses Unit2;
    TForm1.FormCreate修改如下:procedure TForm1.FormCreate(Sender: TObject);
    var
    i:integer;
    thread: TThread1;
    begin
      ProgressBar1.Visible:= True;
      ProgressBar1.min:= 0; progressBar1.Max:= 100;  //此处的N为总长
      ProgressBar1.Value:= 0;    //初始化开始位置
      Thread := TThread1.Create(self);
      Thread.Resume;
      while not Thread.Terminated do
      begin
        ProgressBar1.Value:=i + 1;
      end;
      ProgressBar1.Visible:= False;
      thread.Free;
    end;可根据实情修改ProgressBar1.Max
      

  3.   

    谢谢楼上!但我的FROM1其中查询不花时间,就是Form2里许多数据库查询花时间,如果没有Form2,那速度很快。所以,楼上是否考虑From2的查询,Form2有6个adoquery(1-6),6个Datasource(-6)。
    能否解决?
      

  4.   

    没看见你调用Form2的代码,贴出来看看吧。或者你可以参考我上面线程的做法,道理一样的
      

  5.   

    Form2的主要查询内容如下:procedure TForm2.CheckBox1Change(Sender: TObject);
    var
    i:integer;
    sqlstr:string;
    king:string;
    Lables : TLabel;
    Edits  : TEdit;
    j:integer;
    begin
    if CheckBox1.isChecked  then
     begin
      with Form2.ADOQuery7 do
      begin
        close;
        sql.Clear;
        sql.Add('select cc from tops where c=:uuu');
        Parameters.ParamByName('uuu').Value:=Edit1.Text;
        Open;
        if recordCount <1 then
        begin
          Showmessage('not exit!');
          Exit;
        end;ADOQuery2.Close; 
    ADOQuery2.SQL.Text := 'Select * from tops where cc = '''+trim(edit1.text)+''''; 
    ADOQuery2.Open;
        Label11.Text:= ADOQuery2.fieldbyname('as').asstring;  
    ...
    ADOQuery3.Close;
    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('select * from matrix1 where cc = '''+trim(edit1.text)+''''); 
    adoquery3.open;
    king:='';
    for j :=0 to ADOQuery3.FieldCount - 1 do
    if ADOQuery3.Fields[j].Value='Y'  then
    king:=king+','+ADOQuery3.Fields[j].FieldName;
    king:='select vv'+king+' from rules  where vv='''+ADOQuery3.fieldbyname('cc').AsString+'''';
    ADOQuery5.Close;
    ADOQuery5.SQL.Clear;
    adoquery5.sql.add(king);
    adoquery5.open;ADOQuery3.Close;
    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('select * from matrix where vv = '''+trim(edit1.text)+''''); 
    adoquery3.open;
    sqlstr:='';
    for i :=0 to ADOQuery3.FieldCount - 1 do
    if ADOQuery3.Fields[i].Value='Y'  then sqlstr:=sqlstr+','+ADOQuery3.Fields[i].FieldName;
    sqlstr:='select date'+sqlstr+' from checks  where vv='''+ADOQuery3.fieldbyname('cc').AsString+'''';
    ADOQuery6.Close;
    ADOQuery6.SQL.Clear;
    adoquery6.sql.add(sqlstr);
    adoquery6.open;ADOQuery4.Close;
    ADOQuery4.SQL.Clear;
    ADOQuery4.SQL.Add('select * from cate');
    adoquery4.open;
    while not ADOQuery4.Eof do
     begin
      if ADOQuery4.Fields[1].Value=''+trim(edit1.text)+'' then
      begin
      ComboBox2.Visible:=true;
      ComboBox2.Position.X :=1111;
      ComboBox2.Position.Y :=198;
      Label30.Visible :=true; Label30.Text :='zyce'; Label30.Position.X :=1038; Label30.Position.Y :=198;
      end;
      end;
    end;
    end;
      

  6.   

    主要是登陆界面From1很快出来,然后用户名和密码输入,判断正确点击确定后,出现加载进度条,最好了!
      

  7.   

    就用上面线程的方法,把耗时间的放进DoInit中
      

  8.   

    办法楼上都说了,但10s确实太不可思议了,类似select * from users 的语句最好不用 *,取需要的字段即可,建立合理的索引可以提高效率