begin
・
・
・
MessageDlg('キャンセル',mtConfirmation,[mbCancel],0);
・
・
・
end;
ご指導よろしくおねがいします。
処理中にメッセージダイアログのボタンを押すと
その処理を中止するというようなことをしたいのですが、
このような感じで処理の途中でメッセージダイアログを表示すると
メッセージダイアログが表示された時点で処理が止まり、
メッセージダイアログのボタンを押さない限り、次にすすみません。
なにかいい方法ございましたら、教えてください。よろしくおねがいします。
新規で 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;
基本的にディスパッチは嫌われます。
DelphiにはTThreadがあるのでこれを使うのが吉。。
処理通知のダイアログを自作して。
プログレスバーつけたり?FlashWindowとかで反転させて
遊ぶのも吉。。
> 基本的にディスパッチは嫌われます。
ディスパッチってなんでしょうか。主語がありませんが誰が嫌うんでしょうか。
> DelphiにはTThreadがあるのでこれを使うのが吉。。
そうですね。これが正統だと思います。
> 処理通知のダイアログを自作して。
> プログレスバーつけたり?FlashWindowとかで反転させて
GUI 部分はメインレッドに属すると思うんですが、これは Synchronize で
呼び出すことになって、やはりモーダルループで処理されることにはかわりは
ありませんね。
モーダルダイアログを表示しているときのメッセージループであるモーダルループ
ではほとんどユーザの応答待ちにしか使われませんので、まぁ、平行して処理する
のもありかな、とも思いますけど。
ディスパッチ
http://e-words.jp/w/E38387E382A3E382B9E38391E38383E38381.html
基本的に、「Windowsはディスパッチ処理されています」。
これをしなきゃ、フォームの生成にさえ失敗します。
procedure TForm1.Dispatch(var Message);
begin
//ディスパッチでなにもしない
end;
を埋めると解ります。
ツイート | ![]() |