双击EXE文件运行大概需要10秒(此时跳出空白窗口呈无响应状),如何在这10秒内显示进度条???

wallyhost0 2013-08-09 12:51:12
双击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;
...全文
297 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CZP98168 2013-08-10
  • 打赏
  • 举报
回复
引用 4 楼 HSFZXJY 的回复:
新建一个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
学习了!
lyhoo163 2013-08-10
  • 打赏
  • 举报
回复
在读取数据同时,启动一线程,在线程中显示进度。当读取完数据,关闭线程。具体代码自己搞定。
固执的大叔 2013-08-10
  • 打赏
  • 举报
回复
学习了!!!
fox600123 2013-08-09
  • 打赏
  • 举报
回复
办法楼上都说了,但10s确实太不可思议了,类似select * from users 的语句最好不用 *,取需要的字段即可,建立合理的索引可以提高效率
鐵蛋 2013-08-09
  • 打赏
  • 举报
回复
治标不治本,我搞不懂为什么你初始化怎么会有那么长时间,10s!这个体验太糟糕了,尽量在3到4秒之内才行
hsfzxjy 2013-08-09
  • 打赏
  • 举报
回复
就用上面线程的方法,把耗时间的放进DoInit中
wallyhost0 2013-08-09
  • 打赏
  • 举报
回复
主要是登陆界面From1很快出来,然后用户名和密码输入,判断正确点击确定后,出现加载进度条,最好了!
wallyhost0 2013-08-09
  • 打赏
  • 举报
回复
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;
hsfzxjy 2013-08-09
  • 打赏
  • 举报
回复
没看见你调用Form2的代码,贴出来看看吧。或者你可以参考我上面线程的做法,道理一样的
wallyhost0 2013-08-09
  • 打赏
  • 举报
回复
谢谢楼上!但我的FROM1其中查询不花时间,就是Form2里许多数据库查询花时间,如果没有Form2,那速度很快。所以,楼上是否考虑From2的查询,Form2有6个adoquery(1-6),6个Datasource(-6)。 能否解决?
haitao 2013-08-09
  • 打赏
  • 举报
回复
如果初始化的工作是这么有规律的循环, 3 楼 的做法是最好的
hsfzxjy 2013-08-09
  • 打赏
  • 举报
回复
新建一个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
feiba7288 2013-08-09
  • 打赏
  • 举报
回复
试下这样: 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;
wallyhost0 2013-08-09
  • 打赏
  • 举报
回复
请问楼上具体如何做,有点菜不好意思!
hsfzxjy 2013-08-09
  • 打赏
  • 举报
回复
你这就变成了同步操作:先滚完进度条才加载数据库。 正确做法是:把数据库操作放入线程中,并在进度条开始前启动线程

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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