在一些事务控制中会出现进度条的使用,所我们需要一个统一的进度条管理机制
比如:
1、可以满足普通进度条的功能(不要以为是很简单的问题,因为控件的使用不会出现在程序中,更多可能是使用一些函数)
2、进度取消的功能(取消按钮可以让当前的执行过程终止掉)所以本人在应用的过程中定义了一个类来使用进度条
问题就出现在上面的2个需求上。
可以使用一个开发的函数来进行进度的记录
如 process(....)各位有什么好的想法和经验拿出来吧,进度条使用时是否需要线程管理...

解决方案 »

  1.   

    做个多线程就可以了,在多线程中打开你的进度条就可以了还有一种办法只听说过,是用个什么API函数,什么什么的,不需要多线程,但是没多线程的效果好
      

  2.   

    楼上说的是IE5里面的IProgressDialog组件?
      

  3.   

    关键是取消的操作,在线程中的OnTerminate事件??
    线程内部需要管理操作的事件???有没有相关的代码可以看呀,多谢各位了
      

  4.   

    >>>>1、可以满足普通进度条的功能(不要以为是很简单的问题,因为控件的使用不会出现在程序中,更多可能是使用一些函数)
    因为控件的使用不会出现在程序中----這是什麼意思?>>>2、进度取消的功能(取消按钮可以让当前的执行过程终止掉)
    問題二用TThread對象完全可以實現.完全理解你的需求後我可以幫你試一試.或寫個測試單元
      

  5.   

    JonnySun(智者寡言) 第一个和第二个是捆绑应用的
      

  6.   

    引用:[还有一种办法只听说过,是用个什么API函数,什么什么的,不需要多线程,但是没多线程的效果好
    ]在循环体内用
    PeekMessage和PostMessage,同样能实现随时取消,而且能免去线程管理的复杂不过这样会影响一些些循环速度,你如果不是对速度的要求很高,也可这样处理
      

  7.   

    to ss__328(潇潇) 我要求速度极高的,因为是分布式的系统,而且是广域网
      

  8.   


    >>沒時間了, 下班了. 剛才寫了個簡單的演示. 代碼如下.unit uProgressBarManager;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ComCtrls;type  TPBManagerThreadBase = class(TThread)
      private
        FEdit: TEdit;
        FProgressBar: TProgressBar;
      public
        procedure Execute; override;
        property Editor: TEdit read FEdit write FEdit;
        property ProgressBar: TProgressBar read FProgressBar write FProgressBar;
      end;  {=========================================================}
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;
        BitBtn1: TBitBtn;
        Edit1: TEdit;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        fthread: TPBManagerThreadBase;
      public
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TPBManagerThreadBase }procedure TPBManagerThreadBase.Execute;
    var
      i: integer;
    begin
      inherited;
      self.FProgressBar.Min := 0;
      self.FProgressBar.Max := 10000;
      for i := 0 to 10000 do
      begin
        FEdit.Text := inttostr(i);
        FEdit.Update;
        self.FProgressBar.Position := i;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      fthread := TPBManagerThreadBase.Create(true);
      fthread.Editor := self.Edit1;
      fthread.ProgressBar := self.ProgressBar1;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      self.fthread.Suspend;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      self.fthread.Resume;
    end;end.
      

  9.   

    實際上用個簡單的線程完全可以解決問題, 你只要override .Execute方法.
    有點類似策略模式,其實可以說Execute方法是個模板方法!有興趣的朋友可以看看Classes單元內的源代碼
    當你要實現某個不同的功能是,繼承TPBManagerThreadBase類,override .Execute方法.在Execute方法內寫代碼實現你的功能.
     
    假設MyThread--->TPBManagerThreadBase(繼承);//實現copy記錄的進度
        MyThreadA--->TPBManagerThreadBase(繼承); //實現cycle讀取某個數據.fthread:= MyThread.create;
    fthread:= MyThreadA.create;
    ......
    這能實現N個不同的功能.寫的不夠詳細. 請包涵.
      

  10.   

    用最简单的办法,进度条每次加1,后面跟一条Application.ProcessMessages()语句,这样省得用多线程,在要求不高时适用。
      

  11.   

    例如:在任意地方加一个按钮,按钮相应中
    m_bStop := true;在循环中:
    ProgressBar.Position := ProgressBar.Position + 1;         
    Application.ProcessMessages();
    if m_bStop then
    begin
        break;
    end;
      

  12.   

    >>>> 那么如何随时取消进程内的事件?
    因為你的所有操作的代碼是寫在TThread.Execute方法內. 
    只要調用fthread.Suspend;方法就可以取消进程内的事件.>>>> 是否需要在线程内部在定义一个事件类型,以取消时使用???
    不明白你的意思, 你將上面的代碼去運行一次,體驗一下怎樣使用線程.也許你有了新的靈感!
    總之你的問題不難解決. 要看你領悟了多少!
      

  13.   

    其实就是外面有个事件,在执行过程中要用到进度条,现在要的是需要取消这个外面的事件,目前写的代码只能用于简单的进度条管理的例子,我非常感谢大家的支持
    只要調用fthread.Suspend;方法就可以取消进程内的事件.
    进程内的事件是在外面的某个事件,那一定要有事件参数传入了,否则怎么知道外面的事件被取消了呢
      

  14.   

    定义个过程参数中 var 一个进度条的类不就完了吗??
      

  15.   

    有道理 kejian(御剑飞仙) ,可以借鉴
      

  16.   

    kejian(御剑飞仙) 不可以统一