長い処理(ループ処理)を中断する為にキャンセルボタンを作ったのですが、クリックしても押したアクション(ボタンが引っ込む)がないので、押したかどうかわからずに何度も押してしまいます。しかし、処理的にはちゃんと処理のキャンセル(ループを抜ける)をしてくれます。
キャンセルボタンは始めはフォーム上で非表示になっており、処理を実行した後に表示させるようにしています。
このような場合に、クリック動作を起こさせるにはどうすればいいのでしょうか?
用語がよくわからないので文章がちょっと変で申し訳ありません。
どうぞよろしくお願いします。
ループの途中にDoEventsを入れると、解決する可能性があります。
> キャンセルボタンは始めはフォーム上で非表示になっており、処理を実行した後に表示させるようにしています。
あと、こういう場合、ボタンを非表示にしたりするのは、好ましくないと思います。
この場合は、ボタンを使えないときには淡色表示にするべき(Enabledプロパティ)でしょう。
なるべくボタンの表示/非表示を切り替えない、そういうソフト、あんまり見ないでしょう?
たかみちえさん、お返事ありがとうございます!
DoEventsについてですが、すでに入っているんです。
現象を詳しく説明すると、1回目のキャンセル時はボタンが引っ込まないのですが、その後「処理を中止しますか?」のダイアログBOXを表示後、処理続行を選択すると、次回のキャンセルからボタンが押せるようになるんです。
> あと、こういう場合、ボタンを非表示にしたりするのは、好ましくないと思います。
そうだったんですか!他にもプログレスバーも非表示にしてあって、キャンセルボタンと同時に表示するようにしていました。
このような場合別フォームを作成するなどしたほうがいいのでしょうか?
例えば、実行ボタンとキャンセルボタンを用意し、
初期状態で実行ボタンのEnabled=True,
キャンセルボタンのEnabled=Falseにしておきます。
実行ボタンのクリックイベントプロシージャの先頭で
実行ボタンのEnabled=False,キャンセルボタンのEnabled=Trueに設定します。
キャンセルボタンのクリックイベントプロシージャの先頭で
キャンセルボタンのEnabled=Falseに設定し、
実行ボタンのクリックイベントプロシージャ内の
ループを中断してExit Subする直前で実行ボタンのEnabled=Trueにします。
また、ループが正常に終了し、実行ボタンのクリックイベントプロシージャを
抜ける直前で実行ボタンのEnabled=True,
キャンセルボタンのEnabled=Falseに設定します。
このように制御すれば、ボタン表面の文字の色で
現在行われている処理、可能な処理がわかります。
さらに親切にしたいなら、状態表示用のLabelを用意し、
「実行ボタンクリックで処理を開始します。」
「処理実行中・・・キャンセルボタンクリックで処理中断します。」
「処理中断中・・・しばらくお待ちください。」
「処理は正常に終了しました。」
等の表示を行えばいいでしょう。
>このような場合別フォームを作成するなどしたほうがいいのでしょうか?
デザイン上の問題です。そのほうが見栄えや操作性がよくなるようなら
作成してもいいでしょう。
たかみちえさん、Sayさんありがとうございます!
たかみちえさんのご指摘のようにDoEventsを入れて(入れるところ間違ってました。)、Sayさんのご意見を参考に制御したらうまくいきました!
ラベルも貼ってかなり見栄えがよくなりました。
みなさまありがとうございました!!