- PR -

「終了」ボタンクリック時に、イベントをキャンセル

1
投稿者投稿内容
NOTCH
会議室デビュー日: 2003/08/20
投稿数: 3
投稿日時: 2003-08-20 10:48
既出の質問でしたら申し訳ありません。

VB.netでの開発なのですが、フォームに、コンボボックスと終了ボタン、
その他いくつか配置されているものがあります。
コンボボックスのフォーカスが外れた時に、ある処理を走らせる
(具体的には、Private Sub comboAAA_LostFocusから処理が始まる)
ということになっています。

但し、終了ボタンがクリックされた時には、この処理をキャンセル
にしたいと思っています。
(重い処理が走るので、実行させたくない)

現在、コンボのLostFocusイベントで、Booleanのモジュール変数を切り替えて、
タイマーで拾って、実行させているのですが、どうもスマートではない
ような気がしていますし、動作もなにか怪しげです。
(つまり、もっと的確な方法があると思っている)

皆様宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-20 11:06
こんにちは。

 考えなければならないことがいくつかあると思うのですが。

 「終了ボタン」以外にも、終了させるボタンがありますよね。つまり「×」ボタンです。こちらはどうしますか?また、左上のアイコンをクリックして「閉じる」でも、終了動作になります。これはどうしますか?フォームがフォーカスを失ったとき、LostFocusのイベントは発生しないのでしょうか?フォーカスの移動はマウスのボタンを押したときに発生すると思うのですが、「終了ボタン」の上でマウスボタンを押したままだったら?


 フォーカスの移動というのは連続したユーザ操作の一過程だと思うのです。重い処理と言うことですから、一連のユーザ操作がすべて完了してから、もしくはユーザの指示によって動作するように、変更はできないのでしょうか。

追加:
別スレッドで走らせて、スレッドをキャンセルする、という手もあります。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-08-20 11:18 ]
NOTCH
会議室デビュー日: 2003/08/20
投稿数: 3
投稿日時: 2003-08-20 11:31
ご返答ありがとうございます。

「×」ボタン、左上のアイコン、フォームのフォーカス、
全ての場合で「できるだけ」イベントをキャンセルということになります。
(どうしてもできないものは仕様ということで)

ユーザの指示によって動作というのは、確かにそれが正論とは思うのですが、
要望としてタブ移動で自動的にデータの取得・表示を実行してほしいというのが
ありまして。。。。いかんともしがたいのです。

追加で書かれた、別スレッドというものを、もう少し教えていただけませんか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-20 14:05
>要望としてタブ移動で自動的にデータの取得・表示を実行してほしい

あ、なるほど。私の場合、起動時に全データを持ってきて、内部メモリで処理させました。5〜6年前の話。


>追加で書かれた、別スレッドというものを、もう少し教えていただけませんか?

 1つのプログラム内で、複数の処理を同時に実行させます(もちろん、CPUは1つなので、仮想的ですが)。「スレッド」で検索するといろいろ出てきますが、シンクロさせたりが面倒なので、全く初めてあれば、使わない方がいいかも。少なくとも、MSDN中に出てくる「この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。」の意味がわかるようになってから使ってください。

 「データの取得」処理を、完全にクラスを分けて設計します。このクラスのインスタンスを、フォームクラスのメンバとして持ちます。ロストフォーカスイベントで、New Threadしてスレッドを作成し、実行させます。ClosingEventで、スレッドをキャンセルさせます。スレッドが正常に最後まで走れたならば、シンクロしてフォームを書き直すか、イベント通知してメインスレッドでフォームを書き直します。スレッドのために作ったオブジェクトの破棄を忘れないようにしてください。
問題:スレッド実行中は、古いデータでユーザがアクセス可能である。
回避:フォームをロックしておくなど

↑私がスレッドを使ったのはUNIXのCとBorland C++ Builderなのだが、VS.NETの場合はクラスを分けなくても使える??

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-08-20 14:07 ]
NOTCH
会議室デビュー日: 2003/08/20
投稿数: 3
投稿日時: 2003-08-20 15:58
諸々ありがとうございます。
起動時に全部持ってくるには、ちょっと重いので、
今のやり方を微調整することにしたいと思います。
Booleanの切替と、終了ボタンのクリックの間に、
TimerがTickになる可能性を考えると、あえてプログラムを複雑にする
メリットが薄れるような気がしますので。。。

でも、参考になりました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)