procedure TForm1.Button1Click(Sender: TObject);
begin
PL.search(Test);
end;
procedure TForm1.Test(a: Byte);
begin
ProgressBar1.Position := a;
end;
時間のかかる処理をしているときに今どのくらい進んだか
知るために指定した手続きを実行したいのですがどうすればいいかわかりません。
処理内容に寄りますが、
1.長い処理の中で、定期的に呼び出す
2.Application.ProcessMessagesでメッセージ処理させることで、指定した手続きを呼び出す
3.別スレッドにして、どのくらい進んだかを表示する
のどれかになります。
簡単なのは1ですが、処理内容によっては上手く表示できないかもしれません。
2も、1と同じようなものです。メッセージを飛ばして処理させるところが違います。
3は、どんな実装にも依存しないコードがかけますが、結構面倒です。
では1と2をお願いします。
Application.ProcessMessagesがどんなものかはわかったのですが
どのように使用していいかわかりません。
こんにちは。
> では1と2をお願いします。
はぁー、これは具体的にコードを書けるのは、質問者本人だけでしょう。
分からないから質問する、というのはいいのですが、ご自分では、どん
な努力をしているのでしょうか?
質問する
↓
いくつか一般的な答えが示される。
↓
では、その中のいくつかをお願いします。(回答にお礼もせずに!)
という流れを見て、どう感じますか。
Application.ProcessMessagesをどのように使用していいかわからないとのことですが、どんなものかがわかっておられるなら、これを呼び出すだけです。
使用方法と言われましても、引数もなしですから。
具体的なコードは、ちょっとさんの言うように、自力でがんばってください。
PL.searchの引数が、procedure(a: Byte) of object;のようなので、この引数をプロシージャとして呼び出した後でApplication.ProcessMessagesを呼び出すだけです。
効果は、これを呼び出すのと呼び出さないのとで比べてみてください。
PL.Searchの引数の型を何にしていいかわからず
引数に手続きを指定できないのかなぁ、と思い勢いで質問してしまいました。
にしのさんの回答が回答とはわからず発言してしまいました。失礼しました。
けっきょく僕が知りたかったものは手続き型でした(たぶん)
TProcedure = procedure(Value: Byte) of object;
procedure TForm1.Button1Click(Sender: TObject);
begin
Test(UpProgressBar1);
end;
procedure TForm1.Test(a: TProcedure);
var i: Integer;
begin
for i := 0 to 100 do
begin
a(i);
sleep(100);
end;
end;
procedure TForm1.UpProgressBar1(Value: Byte);
begin
with ProgressBar1 do
begin
Position := Value;
if ProgressBar1.Position = 100 then
ProgressBar1.Position := 0;
end;
説明が下手ですみませんでした。
ツイート | ![]() |