いつもお世話になっております。
ソロです。
ある処理を他のモジュールに投げて、戻り値が返ってくる間に
プログレスバーを表示させたいと思っています。
でも、ループ処理をさせないとプログレスバーは
機能しないようで。。
何か良い案はありませんでしょうか。
よろしくお願いいたします。
//プログレスバー表示元
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;
こんにちは。
私の場合は下記のようにしています。
外部ユニットの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, ・・・・・);
>hatenaさん
いつもありがとうございます。
ちょっと質問なんですが、
>OutputData.OutputData(ProgressBar1, ・・・・・);
のところで、”実パラメーターが多すぎます”
というエラーが出るんです。
//呼び出し側
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
初心者質問で申し訳ないです。(^^;)
外部ユニットの方の procedure の宣言で、パラメータ(引数)を、
定義していますか。
procedure OutputData(ProgressBar: TProgressBar;・・・・・);
未定義の識別子”TProgressBar”となってしまいます。
ProgressBar := TProgressBar.Create(self);
のような記述が足りないのでしょうか。
type
TOutputData = class(TObject)
private
{ Private 宣言 }
public
{ Public 宣言 }
//データの取り込み
function OutputData (ProgressBar: TProgressBar; ・・・・) : Boolean;
う〜ん、私の質問はいつも何か大切なことが分かってない気がします。。
Uses節に、TProgressBarを定義しているUnit名を追加してください。
ちょっと今出先なので調べられないんですが、
ヘルプでTProgressBarを参照すると載っています。
何度もありがとうございます。
早速やってみます。
今から外に行くので
結果は明日報告します。<(_ _)>
クラスのメソッドなんですね。
なら、イベントを作ってしまえば、外部への依存がなくなるので
よりベターですね。
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;
>hatenaさん
できましたー。 (T_T)
ありがとうございました。<(_ _)>
こういうのお客さんが喜んでくれるんですよ。(^^)
おっと、解決ずみでした。
ツイート | ![]() |