我设计了一个进度条,用计时器控制,当一个进程在执行时,进度条同步显示它的进度,如何实现?
多谢各位大虾!!!!!!!!!

解决方案 »

  1.   

    在Thread的Execute() 中加入
      Synchronize(ShowProgress);procedure ShowProgress();
    begin
       //此处插入进度条位置更新
    end;
      

  2.   

    有,但是不是很好的当一个进程每次执行一步时,就使“进度”增加,然后调用“进度”.Update()更新视图(窗体)
      这样会影响进程的执行速度。
    还是用Thread的好。
      

  3.   

    你也可以用时钟来控制Update()更新视图(窗体)
      

  4.   

    楼上说的都可以最好好还是用wengj() 说的!
      

  5.   

    wengi,线程我不会用,能否详细说明?
    不胜感谢!!!!!
      

  6.   

    在子线程中可以向主线程连续的发送消息,当主线程中接收到该消息后就相应,刷新进度条。例如:
    主线程:
    const
      WM_ProgressChange = WM_User + 100;
    TForm1 = class(TForm)
    private
      procedure WMProgressChange(var Message: TMessage); 
      message WM_ProgressChange;
    procedure TForm.WMProgressChange(var Message: TMessage);
    begin
      if Message.msg = WM_ProgressChange 
      begin
        // 刷新进度条
      end;
    end;
    end;
    子线程:
    procedure TThread1.Execute;
    var
      i: Integer;
    begin
      for i := 1 to 100 do
        SendMessage(Form1.handle, WM_ProgressChange, 0, 0);
    end;
    大概就是这样了,一段时间没有写过pascal代码了,没有调试过,基本思想是这样的。
      

  7.   

    unit ThreadTest;interfaceuses
      Classes, ComCtrls;type
      TTestThread = class(TThread)
      private
        FPosition: Integer;
        Fpb: TProgressBar;
        FMax :Integer;
        procedure DoShowProgress;
      public
        constructor CreateIt(pb: TProgressBar; Min: Integer; Max: Integer);
        procedure Execute(); override;
      end;implementation{ TTestThread }constructor THintThread.CreateIt(pb: TProgressBar; Min, Max: Integer);
    begin
      Inherited Create(False);
      if (not Assigned(Fpb)) or (Max<Min) then
        raise Exception.Create('参数有误。');
      FreeOnTerminate :=True;
      Fpb :=pb;
      Fpb.Min :=Min;
      Fpb.Max :=Max;
      FMax := Max;
      Fpb.Position := Min;
    end;procedure THintThread.DoShowProgress;
    begin
      Fpb.Position :=FPosition;
    end;procedure THintThread.Execute;
    var
      Index:Integer;
    begin
      inherited;
      Index:=0;
      while True do
      begin
        if Terminated then//这个判断非常重要!!!!!
          Break;
        //想做的事情在此写(下)
        //此处不要写Application.HandleMessage 危险!!!!    //每Index=10000时Position+1;
        Inc(Index);
        if Index=10000 then
        begin
          Index:=0;
          FPosition :=FPosition+1;
          if FPosition=FMax then
            Break
          else
            Synchronize(DoShowProgress);
        end;
        //想做的事情在此写(上)
      end;
    end;end.
    使用:
      ...
      TTestThread.CreateIt(pb,0,10);
      ...
      

  8.   

    如还有其他的问题,请发邮件到 [email protected]