メッセージダイアロクを表示したまま処理を続けるには?


質問○  2004-06-23 19:44:46  No: 9596

begin



MessageDlg('キャンセル',mtConfirmation,[mbCancel],0);



end;

ご指導よろしくおねがいします。
処理中にメッセージダイアログのボタンを押すと
その処理を中止するというようなことをしたいのですが、
このような感じで処理の途中でメッセージダイアログを表示すると
メッセージダイアログが表示された時点で処理が止まり、
メッセージダイアログのボタンを押さない限り、次にすすみません。
なにかいい方法ございましたら、教えてください。よろしくおねがいします。


jok  2004-06-23 21:15:57  No: 9597

新規で Form1 に Label1 と Button1 を置いて以下のようにして試してください。

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    StartFlag:Boolean;
  public
    procedure WMApp(var Msg:TMessage);message WM_APP;
    procedure CancelClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMApp(var Msg: TMessage);
var
  i:integer;
begin
  for i := 0 to  Screen.ActiveForm.ControlCount-1 do
    if Screen.ActiveForm.Controls[i] is TButton then
      TButton(Screen.ActiveForm.Controls[i]).OnClick := CancelClick;
  i := 0;
  while StartFlag do begin
    Label1.Caption := IntToStr(i);
    Inc(i);
    Application.ProcessMessages;
    Sleep(1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle,WM_APP,0,0);
  StartFlag := true;
  MessageDlg('キャンセル',mtConfirmation,[mbCancel],0);
end;

procedure TForm1.CancelClick(Sender: TObject);
begin
  StartFlag := false;
end;


さわ  2004-06-23 23:14:48  No: 9598

基本的にディスパッチは嫌われます。
DelphiにはTThreadがあるのでこれを使うのが吉。。
処理通知のダイアログを自作して。
プログレスバーつけたり?FlashWindowとかで反転させて
遊ぶのも吉。。


jok  2004-06-24 00:26:42  No: 9599

> 基本的にディスパッチは嫌われます。

ディスパッチってなんでしょうか。主語がありませんが誰が嫌うんでしょうか。

> DelphiにはTThreadがあるのでこれを使うのが吉。。

そうですね。これが正統だと思います。

> 処理通知のダイアログを自作して。
> プログレスバーつけたり?FlashWindowとかで反転させて

GUI 部分はメインレッドに属すると思うんですが、これは  Synchronize  で
呼び出すことになって、やはりモーダルループで処理されることにはかわりは
ありませんね。


jok  2004-06-24 00:28:52  No: 9600

モーダルダイアログを表示しているときのメッセージループであるモーダルループ
ではほとんどユーザの応答待ちにしか使われませんので、まぁ、平行して処理する
のもありかな、とも思いますけど。


にしの  2004-06-24 01:21:18  No: 9601

ディスパッチ
http://e-words.jp/w/E38387E382A3E382B9E38391E38383E38381.html

基本的に、「Windowsはディスパッチ処理されています」。
これをしなきゃ、フォームの生成にさえ失敗します。

procedure TForm1.Dispatch(var Message);
begin
//ディスパッチでなにもしない
end;

を埋めると解ります。


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

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






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