プログレスバーを出したい

解決


ソロ  2002-09-25 20:23:38  No: 1580

いつもお世話になっております。
ソロです。

ある処理を他のモジュールに投げて、戻り値が返ってくる間に
プログレスバーを表示させたいと思っています。

でも、ループ処理をさせないとプログレスバーは
機能しないようで。。
何か良い案はありませんでしょうか。
よろしくお願いいたします。

//プログレスバー表示元
procedure TForm1.Button1Click(Sender: TObject);
var
  ・
  ・
begin
  ・
  ・
  ・
  //with ProgressBar1 do
  //  for i := 0 to 100 do begin

//外部ユニットへ処理を投げる
OutputData.OutputData(・・・・・);

  //  ProgressBar1.StepIt;
  //  Progressbar1.Update;

  //end;
  
end;


hatena  2002-09-25 20:53:44  No: 1581

こんにちは。
私の場合は下記のようにしています。

外部ユニットのOutputData.OutputDataに引数で、
ProgressBarを渡して、その中でプログレスバーの表示を
更新します。

OutputData(ProgressBar: TProgressBar;・・・・・);
begin

  with ProgressBar do
    for i := 0 to 100 do begin
  
//  処理  //

      ProgressBar.StepIt;
      Progressbar.Update;
    end;
end;

呼び出し側

OutputData.OutputData(ProgressBar1, ・・・・・);


ソロ  2002-09-25 22:44:34  No: 1582

>hatenaさん

いつもありがとうございます。
ちょっと質問なんですが、

>OutputData.OutputData(ProgressBar1, ・・・・・);

のところで、”実パラメーターが多すぎます”
というエラーが出るんです。

//呼び出し側
type
  TForm1 = class(TForm)
  ProgressBar1: TProgressBar;

初心者質問で申し訳ないです。(^^;)


hatena  2002-09-25 23:01:17  No: 1583

外部ユニットの方の procedure の宣言で、パラメータ(引数)を、
定義していますか。

procedure OutputData(ProgressBar: TProgressBar;・・・・・);


ソロ  2002-09-25 23:34:35  No: 1584

未定義の識別子”TProgressBar”となってしまいます。
ProgressBar := TProgressBar.Create(self);
のような記述が足りないのでしょうか。

type
  TOutputData = class(TObject)
private
  { Private 宣言 }
public
  { Public 宣言 }

  //データの取り込み
  function OutputData (ProgressBar: TProgressBar; ・・・・) : Boolean;

う〜ん、私の質問はいつも何か大切なことが分かってない気がします。。


hatena  2002-09-26 01:19:50  No: 1585

Uses節に、TProgressBarを定義しているUnit名を追加してください。

ちょっと今出先なので調べられないんですが、
ヘルプでTProgressBarを参照すると載っています。


ソロ  2002-09-26 01:52:51  No: 1586

何度もありがとうございます。

早速やってみます。
今から外に行くので
結果は明日報告します。<(_ _)>


hatena  2002-09-26 18:04:47  No: 1587

クラスのメソッドなんですね。
なら、イベントを作ってしまえば、外部への依存がなくなるので
よりベターですね。
Uses節に追加する必要もないし、表示先をProgressBar以外に変更する
こともできるようになります。

サンプル
type
  TOutputData = class(TObject)
  private
    { Private 宣言 }
    FCount: integer;    //処理回数
    FPosition: integer; //現在の処理位置
    FOnStep: TNotifyEvent;
    procedure Step; 
  public
    { Public 宣言 }
    function OutputData: Boolean;
    property Count: Integer read FCount write FCount;
    property Position: Integer read FPosition;
    property OnStep: TNotifyEvent read FOnStep write FOnStep;
  end;

implementation

{$R *.DFM}

procedure TOutputData.Step;
begin
  if Assigned(FOnStep) then FOnStep(Self);
end;

function TOutputData.OutputData: Boolean;
var
  i: integer;
begin
  Result := False;
  FPosition := 0;
  for i := 1 to FCount do
  begin

    Sleep(100); //処理

    FPosition := i;
    Step;
  end;
  Result := True;
end;

呼出側

type
  TForm1 = class(TForm)
  ・・・・・
  private
    { Private 宣言 }
    procedure OutPutDataStep(Sender: TObject);
  ・・・・・・

//onStep のイベントハンドラ Label1 と ProgressBar1 に経過表示
procedure TForm1.OutPutDataStep(Sender: TObject);
begin
  with TOutPutData(Sender) do 
    Label1.Caption := Format('%d/%d',[Position, Count]);
  Label1.Update;
  ProgressBar1.StepIt;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  OutPutData: TOutPutData;
begin
  OutPutData := TOutPutData.Create;
  try
    OutPutData.Count := 100;
    ProgressBar1.Max := OutPutData.Count;
    ProgressBar1.Min := 0;
    ProgressBar1.Step := 1;

    OutPutData.OnStep := OutPutDataStep;
    OutPutData.OutPutData;
  finally
    OutPutData.Free;
  end;
end;


ソロ  2002-09-26 18:36:47  No: 1588

>hatenaさん

できましたー。  (T_T)
ありがとうございました。<(_ _)>

こういうのお客さんが喜んでくれるんですよ。(^^)


ソロ  2002-09-26 18:37:11  No: 1589

おっと、解決ずみでした。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加