• ベストアンサー

キャンセルの方法

うらで何か動作しているとき、キャンセルボタンを押せるようにしたいのですが、 (例えば、Sleep()の間にキャンセルする) イネーブルにしていても、ボタンが黒く表示されるだけで、押せません。 押せるようにするにはどうしたらいいのでしょうか。 OnTimer()を使っているのですが、それが原因なのでしょうか。

noname#794
noname#794

質問者が選んだベストアンサー

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。itohhといいます。 裏で動いているのは、サーバ通信になる予定なのですね。 わたしの勘違いでした、モーダレス・ダイアログでは、ちょっと対応できない と思います。 なぜかというと、 モーダレス・ダイアログを使った場合、ダイアログボックスを呼び出す側で ループによって、ダイアログボックスでボタンが押されたかを監視するのと 裏の処理を行うのを交互に行います。 この場合、裏の処理は、ある程度、細切れに処理を行います。 (例えば、10個のファイルをコピーするとき、1個コピーするたびに ダイアログボックスのボタンが押下されたかをチェックします。) 今回の場合、サーバ通信は一定時間(Sleep関数のように)制御が 戻ってこないのですよね、同一スレッドでは、どうしてもサーバ通信を 呼び出したところで止まってしまいます。 (実際は、サーバ通信内で動いていますが) このままだと、ダイアログボックスのボタンが押下することは出来ません。 対策としては、 1.toysmithさんが回答しているように、別スレッドにする。 2.サーバ通信内でたまに制御を戻すようにする。 です。 別スレッドにするメリットですが、中止するためのダイアログボックスと 実際の処理(裏で動いている)を完全に分離できるため制御が シンプルになります。 対策2で行った場合、スレッドの制御はなくなりますが、 サーバ通信を一定間隔で呼び出し元に制御を戻さなくてはいけないため、 サーバ通信のロジックが難しくなります。 残念ながら、わたしの勘違いです、ごめんなさい。(モーダレス・ダイアログを使うこと) 王道は、対策1がベストだと思います。

noname#794
質問者

お礼

早速試してみたのですが、(モーダレスの場合) うまくいかなかったので、今、「別スレッドで立ち上げる」に挑戦中です。 回答ありがとうございました。

その他の回答 (3)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

「OnTimer()を使っている」というと… ・ダイアログでキャンセルボタン表示 ・OnTimer()で呼び出される関数で別の処理を行っている という状況でしょうか? この状況ならボタンは有効に動作するはずです(経験済み)。 より、実際的には 1.モーダルダイアログボックスでキャンセルボタンを表示 2.別スレッドで“裏”の処理を行う 3.キャンセルされたら“裏”処理のスレッド殺す という手順の方が確実に動作します。

noname#794
質問者

お礼

別スレッドで裏の処理を行うようにしました。 結構、難しいでしたが、なんとか動くようになりました。 ありがとうございました。

noname#794
質問者

補足

上記の通りです。 OnTimer()内で呼び出される関数が同クラス内にあっても、上記のように動くのでしょうか。 スレッドの使い方がわからないのと、時間がないことで、 スレッドを使わずに作りたいのですが、 補足などありましたらお願いします。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 ちょっと、状況があいまいなので。 1.裏で処理を行っている。(Sleep関数、なんのために??) 2.裏で行っている処理を途中で中断できるようにキャンセルボタン付きの   ダイアログボックスを表示している。 3.ダイアログボックスのキャンセルボタンが押下できない。 4.裏で処理といっても別プロセス、別スレッドではない。 5.ダイアログボックスを表示したあと、裏の処理が動き出す。   (OnInitDialog関数内で実行している) 6.MS VC++である。 状況は、これでよいでしょうか?違っていたら、補足願います。 とりあえず、これだと解釈して回答します。 ダイアログボックスの作成方法はどうしていますか? CDialogクラスのDoModal関数を使っている場合、裏で処理を行っていると ダイアログボックスの動きは止まりますよ。 基本は、モーダレスでダイアログボックスを作成してください。 そして、キャンセルボタンが押下されたら、裏の処理を中断するように プログラムを作成してください。 モーダル・ダイアログボックス:CDialogクラスのDoModal関数 モーダレス・ダイアログボックス:CDialogクラスのCreate関数

noname#794
質問者

補足

ありがとうございます。 Sleep関数の部分は本来ならば、サーバと通信の部分ですが、ダミーでSleepを使っているだけです。 他の部分はおっしゃる通りの状況です。 Create関数を使ってみたいと思うのですが、使い方がいまいちわかりません。 詳しく教えていただけませんでしょうか。

noname#9414
noname#9414
回答No.1

言語はCですか?C++ですか?それともVC++? VC++ならSleepExという関数があるのは知っていますが C++とかCとかだったらどうだったかな? #ご存じの方、フォローよろしく。 ではでは☆

noname#794
質問者

お礼

VC++でした。 回答ありがとうございました。

関連するQ&A

  • Windows8(BootCamp)でスリープ

    windows8をBootCamp上で使用しています。最近スリープボタンが無くなり、スリープ出来ません。 電源オプションより、電源とスリープボタンの設定には  1.電源ボタンを押した時のの動作 シャットダウン   2.スリープボタンを押した時の動作 何もしないor休止状態 の表示のみです。2.の時 スリープの動作表示を出せないでないでしょうか?教えて下さい。

    • 締切済み
    • Mac
  • 携帯の通信キャンセル方法

    こんにちは。 先日mova(P211i)からFOMA(P700i)に変えました。 今までは例えばメール送信を中止したい時や、Iモードの通信を途中でやめたい時などは電源オフボタンを押すと 『中止しますか?』との表示が出て通信をキャンセルする事が出来たのですが、今回この端末に変えてからそういう動作が出来ません。 見たいHPを間違った時にキャンセルすることも出来ませんし、 間違って空メールを送ることもしばしば・・・(汗 ドコモショップの人に聞いてみた事もあるのですが、その人も『う~ん?』って感じでして・・・ (その時に電源ボタンは?メニューボタンは?と言われ色々やってみたのですが、どれも出来ませんでした) もしご存知の方がいらっしゃれば是非教えてください。 余分なパケット代を使いたくありません^^;;

  • 「参考になった」キャンセル方法

    ボタンを押し間違えて、特に参考になってはいない回答に「参考になった」としてしまいました。 キャンセルしようと思ったのですが、キャンセルボタンは見当たりませんし、 もう一度押しても、ページは更新されるのですが、「参考になった」の数は変化しません。 果たしてキャンセルする方法はあるのでしょうか。

  • 処理をとめるキャンセルボタンのあるダイアログ作成

    開始ボタンを押すと、 ”保存しています。とめたい場合はキャンセルしてください” と言ったようなダイアログにキャンセルボタンがついたダイアログを 表示し(表示中に処理は行われていく)、処理をキャンセルさせたいのですが、 Showで表示させると、キャンセルボタンが反応せず、 ShowModalを使用すると表示と同時に処理が止まってしまい、 ボタンを押さない限り処理が進まずにいます。 何かよい方法はないでしょうか? よろしくおねがいします

  • ExcelVBA実行中にキャンセルをしたい。

     ExcelVBAで報告書を作成するプログラムを作成していますが、実行ボタンをつくりクリックすると終わるまで途中でキャンセルができません。  進行状況を表示するようなメッセージボックスみたいのを表示させてキャンセルボタンをつけるのが思いつきますが、どのようにしたらできるのでしょうか?

  • 楽天ブックスでの注文キャンセル

    楽天ブックスで、商品の注文をキャンセルしたいのですが、購入履歴から、キャンセルしようとしているのですが、キャンセルというボタンが表示されてません。注文したのは、午前中に注文しました。それで、2時間後ぐらいに、ご注文内容のご確認というメールが来ました。 でも、注文の詳細をみたら、まだ発送は、してませんでした。なので、間に合うと思ったのですが、キャンセルボタンが表示されてませんでした。キャンセルしたいのですが、どうすればキャンセルできるのでしょうか?もう一度、言いますが、楽天ブックスです。お願いします。

  • キャンセルボタンの無効

     いつもお世話になっています。  あるインストーラ(VBで作ったもの)をshell関数からキ起動させています。  インストールが完了するまでにいくつかウィンドウが出てきますが、  ユーザーには触らせたくないので、全部制御しています。  (全部SendKeysでOKボタンを送っています)。  でも1点だけできなくて困っていることがあります。  進行状態が分かり(~%と表示されている)、キャンセルボタンがついている  ウィンドウの制御です。  キャンセルボタンしかないので、SendKeysでキーを飛ばすわけに  いかず、このキャンセルボタンを無効にできないものかとネットで  調べましたが、私が見たものは×ボタンの制御しかありませんでした。  そこで質問です。  API関数で、キャンセルボタンを制御できるものはありませんか?  よろしくお願いします。

  • ExcelVBA2000でOKとCancelのメッセージボックス

    こんにちは メッセージボックスで表示されるボタンをOKとCancelにしたいのですが、vbOKCancel指定ではOKとキャンセル(カタカナ)になります。OKとCancelにする方法をお教えください。 無理でしたら、ユーザーフォームを使って独自に作りたいのですが、この場合は閉じるボタン(X)が表示されてしまいます。これを消す方法をお教えください。

  • マウスの誤動作について教えてください。

    ロジクールのマウスを使用しているのですが、何度買い換えても同じ誤動作が 起きることがあるのですが、他のハードウェアが原因でしょうか? 誤動作はまず右クリックが出来なくなる。 多分ですが、何も触れていないのにダブルクリックを認識しているのかブラウザ(OPERA)上で文字が打てなくなる、現在表示しているページ以外から他のサイトへ飛べなくなる(更新もできない為マウスの誤動作でキャンセルが掛かってしまっているのかと思います。) マウスが原因であろうと思う理由は右クリックが出来るようになると治るからです。 USBを挿し直して治ることもありました、ただ再起動しても治らない事もあります。 windowsボタンを押したら治る事もありました。 USBハブを変えても起こってしまうので困っています。 スリープ状態からも勝手に復帰してしまう為とても困っています。 もしわかる方がいらっしゃればご教授下さい。 宜しくお願いします。

  • エクセルVBAのInputBoxで「キャンセル」ボタンを押したときの動

    エクセルVBAのInputBoxで「キャンセル」ボタンを押したときの動作 上記のボタンが押されたときに強制的にプログラムを終了させる方法はありますか。 教えてください。