指定した手続きを実行するには?

解決


さかさ  2003-08-05 00:25:40  No: 4297

procedure TForm1.Button1Click(Sender: TObject);
begin
  PL.search(Test);
end;

procedure TForm1.Test(a: Byte);
begin
  ProgressBar1.Position := a;
end;

時間のかかる処理をしているときに今どのくらい進んだか
知るために指定した手続きを実行したいのですがどうすればいいかわかりません。


にしの  2003-08-05 05:04:57  No: 4298

処理内容に寄りますが、
1.長い処理の中で、定期的に呼び出す
2.Application.ProcessMessagesでメッセージ処理させることで、指定した手続きを呼び出す
3.別スレッドにして、どのくらい進んだかを表示する

のどれかになります。
簡単なのは1ですが、処理内容によっては上手く表示できないかもしれません。
2も、1と同じようなものです。メッセージを飛ばして処理させるところが違います。
3は、どんな実装にも依存しないコードがかけますが、結構面倒です。


さかさ  2003-08-05 07:08:33  No: 4299

では1と2をお願いします。
Application.ProcessMessagesがどんなものかはわかったのですが
どのように使用していいかわかりません。


ちょっと  2003-08-05 11:25:19  No: 4300

こんにちは。

> では1と2をお願いします。

はぁー、これは具体的にコードを書けるのは、質問者本人だけでしょう。
分からないから質問する、というのはいいのですが、ご自分では、どん
な努力をしているのでしょうか?

質問する
   ↓
いくつか一般的な答えが示される。
   ↓
では、その中のいくつかをお願いします。(回答にお礼もせずに!)

という流れを見て、どう感じますか。


にしの  2003-08-05 17:35:43  No: 4301

Application.ProcessMessagesをどのように使用していいかわからないとのことですが、どんなものかがわかっておられるなら、これを呼び出すだけです。
使用方法と言われましても、引数もなしですから。

具体的なコードは、ちょっとさんの言うように、自力でがんばってください。
PL.searchの引数が、procedure(a: Byte) of object;のようなので、この引数をプロシージャとして呼び出した後でApplication.ProcessMessagesを呼び出すだけです。
効果は、これを呼び出すのと呼び出さないのとで比べてみてください。


さかさ  2003-08-05 19:02:36  No: 4302

PL.Searchの引数の型を何にしていいかわからず
引数に手続きを指定できないのかなぁ、と思い勢いで質問してしまいました。
にしのさんの回答が回答とはわからず発言してしまいました。失礼しました。


さかさ  2003-08-06 03:57:52  No: 4303

けっきょく僕が知りたかったものは手続き型でした(たぶん)

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;

説明が下手ですみませんでした。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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