小弟初学delphi,想知道象realpaly 安装时的那种进度条是怎么实现的,
就是delphi自带的那个ProgressBar1

解决方案 »

  1.   

    http://www.cncto.org/Article/Article.Asp?id=78
    http://www.delphijs.net/Article_Show.asp?ArticleID=1257
      

  2.   

    http://www.delphijs.net/Article_Show.asp?ArticleID=1257
    这个连接打不开,有谁能否给我些例子?
      

  3.   

    http://www.2ccc.com/article.asp?articleid=41
      

  4.   

    比如我在读取数据的时候,要等待一段时间,用户可能以为是死机了,
    因此我想做一条进度条,realone类似的,要怎么根据读取数据的时间刚好等于进度条走完的时间一致?help
      

  5.   

    很简单啊,把我以前写的代码贴点出来给你
    frmProgress.lblTitle.Caption:='正在进行数据完整性检测,请稍候';
    frmProgress.Gauge.Progress:=0;
    application.ProcessMessages;
    for i:=0 to templist.Count-1 do
      begin
       strsql:='select * from KJJHSB where KJJHSBID='+templist.Strings[i]+'';
       if checkintodocdata(strsql).IsEmpty then
       begin
        frm_main.qry_main.Locate('KJJHSBID',templist.Strings[i],[loCaseInsensitive]);
        tempstr:=frm_main.qry_main.fieldbyname('XMMC').AsString;
        tempstrnum:=inttostr(frm_main.qry_main.RecNo);
        messagebox(GetActiveWindow,pchar('项目"'+tempstr+'"'#13+'位于项目序号第 '+tempstrnum+' 号'
        +'导出数据检测不完整,请保证信息全部填写并保存'),strwyd,mb_iconinformation+mb_ok);
        qrytmp.Close;
        qrytmp.Free;
        exit;
       end;
       qrytmp.Close;
       qrytmp.SQL.Text:=strsql;
       qrytmp.Open;
       comename:=qrytmp.fieldbyname('RWSWJM').AsString;
        if (comename<>'') and (fileexists(extractFilePath(frm_main.DataSource)+comename)) then  addname:=extractFilePath(frm_main.DataSource)+comename
        else
          begin
            messagebox(GetActiveWindow,pchar('项目”'+qrytmp.fieldbyname('xmmc').asstring+
            '“没有任务书,无法导出'),strwyd,mb_iconstop+mb_ok);
            strsql:='update KJJHSB set RWSWJM='''+''+''' where KJJHSBID='+templist.Strings[i]+'';
            frm_main.adocon.Execute(strsql);
            frm_main.qry_main.Requery;
            qrytmp.Close;
            qrytmp.Free;
            zip.Free;
            exit;
          end;
       zip.FilesList.Add(addname);
       frmProgress.Gauge.Progress:=round(i*100/templist.Count);
      end;
    frmProgress.Gauge.Progress:=100;应该没有问题吧
      

  6.   

    procedure TfmProgress.Timer1Timer(Sender: TObject);
    var
      fmP_archives:TfmP_archives;
      //time1,time2:integer;
    begin
      progressbar1.Position:=progressbar1.Position+9;  if progressbar1.Position=99 then
      begin
        //time1:=strtoint(formatdatetime('ss',now));
        //showmessage(inttostr(time1));
        dm1.ADOQuery4.Close;
        dm1.ADOQuery4.SQL.Clear;
        dm1.ADOQuery4.SQL.Add('select depart,cardID,name1,sex,dimissionTime,dimissionReason,born,bloodtype,xl,specialty,folk,');
        dm1.ADOQuery4.SQL.Add('nativePlace,IsMember,HK_kind,avoirdupois,health,marriaged,stature,IDcardNum,GY,YY,Engli,othe,telNum');
        dm1.ADOQuery4.SQL.Add('Email,homeAddress,duty,technicalPost,hireKind,basicMonthlyPay,introducer,joinJobTime,enterFacTime');
        dm1.ADOQuery4.SQL.Add('insurancelD,Tbdate,pactID,pactInureTime,pactStopTime,isDimission,memo1,resume1');
        dm1.ADOQuery4.SQL.Add('from P_archives where isDimission=''否''');
        dm1.ADOQuery4.Open;    //time2:=strtoint(formatdatetime('ss',now));
        //showmessage(inttostr(time2));
        //time1:=time2-time1;
        //fmProgress.progressbar1.Max:=time1;
      end;  if progressbar1.Position=progressbar1.Max then
      begin
        Timer1.Enabled:=false;
        fmProgress.Close;
        form1.skindata1.Active:=true;
        fmP_archives := TfmP_archives.Create(self);
        try
          fmP_archives.ShowModal;
        finally
          fmP_archives.Free;
          form1.bornAwoke(sender);
          form1.enterFactoryAwoke(Sender);
        end;
        
      end;
    end;
      

  7.   


    以下是我以前的例子
    try
      FMsgFRM:=TFMsgFRM.Create(self);
      FMsgFRM.showModal;
      application.ProgressMessage;
      //这里是我操作的语句;
    finally
      FMsgFRM.free;
    end;
    这样是没有显示进度条的。
    现在我就是不明白要怎么显示进度条;以及要使数据处理的时间和进度条一致
    感谢和等待ing……
      

  8.   

    例如要处理一个数据表
    table1procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    begin
      Table1.open;
      ProgressBar1.Min := 0;
      ProgressBar1.Max := table1.RecordCount;  I := 1;
      while not table1.Eof do
      begin
        ProgressBar1.Position := i;
        ProgressBar1.Update;
        inc(i);    table1.Next;
      end;  ProgressBar1.Position := 0;
    end;
      

  9.   

    Table1本身绑定表的数据量就很庞大了(比如字段里面有好多存贮图片的)等你open的时候就要经过好久了
      

  10.   

    我想问一下。。
      就是在启动软件的时候怎么知道加载所有form的时间呀。。怎么让这个进度条跟加载同步呢。。
      

  11.   

    我想问一下。。
      就是在启动软件的时候怎么知道加载所有form的时间呀。。怎么让这个进度条跟加载同步呢。。
    ---------------------------------------------------------------------你用ProgressBar1 有个MAX MIN 来控制进度。在D 的项目文件里,
    在Application.run之前结束掉你的ProgressBar1的进度显示,也就是100%OVer掉!就可以了!我领你入门。下面怎么写已经很简单了!!!呵呵 !看不明白给我消息。
      

  12.   

    Form的初始创建是在Project中,显示源码方法:
    view-〉project manager, 右击project1->view source, 即可看到应用初始化创建Form的语句。
    进度条窗口如果用showModal显示为模式Form,showModal的下一条语句要等到这个模式化Form关闭后执行,所以你看不到后面的语句对进度条的操作。
    如果你用一个模式化Form显示进度条,那么对进度条的操作语句,也应在这个模式化Form之中定义。
    至于如何使进度条与操作进度同步,恐怕是个复杂的问题,尤其对数据库的操作,可能数据库操作必须要工作于异步模式,你的程序才能获得控制权,对进度进行更新。
    以上不知对否,请各位大侠指正!