Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


475 / 2272 ツリー ←次へ | 前へ→

【11456】閉じるボタンと BeforeUpdateイベント わさび 10/2/16(火) 13:24 質問[未読]
【11462】Re:閉じるボタンと BeforeUpdateイベント YU-TANG 10/2/18(木) 1:56 質問[未読]
【11463】Re:閉じるボタンと BeforeUpdateイベント わさび 10/2/18(木) 8:41 発言[未読]
【11466】Re:閉じるボタンと BeforeUpdateイベント YU-TANG 10/2/18(木) 23:45 回答[未読]
【11468】Re:閉じるボタンと BeforeUpdateイベント YU-TANG 10/2/19(金) 10:28 回答[未読]
【11472】Re:閉じるボタンと BeforeUpdateイベント わさび 10/2/19(金) 16:57 お礼[未読]
【11523】Re:閉じるボタンと BeforeUpdateイベント YU-TANG 10/3/12(金) 3:57 回答[未読]

【11456】閉じるボタンと BeforeUpdateイベント
質問  わさび  - 10/2/16(火) 13:24 -

引用なし
パスワード
   フォームを閉じる際の処理について質問致します。

フォーム上のテキストボックスにフォーカスがある状態で、
「閉じるボタン」をクリックすると、
フォームのCloseイベントよりも先に、
テキストボックスのBeforeUpdateイベントが走ってしまいます。
これは当然の仕様ではありますが、
「閉じるボタン」をクリックしたときには、
BeforeUpdateイベントを走らせたくありません。

そこで、BeforeUpdateイベントの処理に、
「閉じるボタンがクリックされたとき以外」という条件式を追加すれば、
この問題は解決できるかと思って、いろいろ調べてみたのですが、
「閉じるボタンがクリックされた」ということがどうやったらわかるのか、
調べきることができませんでした。
どなたかご存知の方がいらっしゃいましたら、教えていただけませんでしょうか。
もしくは、他にいい方法はありませんでしょうか。

「閉じるボタン」で解決できなければ、
最終的には無効にして、コマンドボタンで対応する方法も考えてはおります。
何卒、宜しくお願い致します。

【11462】Re:閉じるボタンと BeforeUpdateイベント
質問  YU-TANG  - 10/2/18(木) 1:56 -

引用なし
パスワード
   ちょっと確認させていただいてよろしいですか。
「閉じるボタン」とは当然フォームの「閉じるボタン」を指していると
思いますが、アプリケーションの「閉じるボタン」は、どうするおつもり
ですか?

# それとも 2007 で SDI だと一つしかないのかしら?

【11463】Re:閉じるボタンと BeforeUpdateイベント
発言  わさび  - 10/2/18(木) 8:41 -

引用なし
パスワード
   ▼YU-TANG さん:

ありがとうございます。

アプリケーションの「閉じるボタン」は考えてませんでした。
が、私の力では対応できないため、今回は無視いたします。

該当フォームの「閉じるボタン」をクリックすることは、
今回のソフトでは「通常の操作」ですが、
該当フォームが開いている状態で、
アプリケーションの「閉じるボタン」をクリックすることは、
このソフトでは「正しくない操作」になるため、
「間違った使い方をしたからよ」と言い訳したいと思います(-_-;

なお、当方は2000もしくは2003を使用しております。

【11466】Re:閉じるボタンと BeforeUpdateイベント
回答  YU-TANG  - 10/2/18(木) 23:45 -

引用なし
パスワード
   わさびさん、こんばんは。

> アプリケーションの「閉じるボタン」は考えてませんでした。
> が、私の力では対応できないため、今回は無視いたします。

そうですか。
では自フォームのみ対象ということで。

API 必須になりますが、たぶんアプローチとしては大きく

1) フォームをサブクラス化してメッセージをフック(たぶん WM_NCLBUTTONDOWN あたり)
or
2) それ以外

になるのではないかと思います。
確実なのは 1 なのですが、VBA 単独でのサブクラス化は
危険すぎて勧められないので、必然的に 2 になります。

考え方としては、ベタですがおそらくこんな感じ。

If A) 仮想マウス左ボタンが押されていたら
  If B) マウスカーソルが自フォームの閉じるボタンの真上にあれば
    ' C) 閉じるボタンがクリックされた!(たぶん…)

1 よりも精度は落ちますが(理論上、誤判定の余地が残る)、
実用には耐えるはず。

必要と思われる API を列挙しておきます。

A)
GetAsyncKeyState
GetSystemMetrics(SM_SWAPBUTTON)

B)
GetCursorPos
SendMessage(WM_NCHITTEST)

組んでいくと他にも必要になるかもしれませんが。

一般的にはもっと、ウィンドウの検査とか、ウィンドウが重なっている
場合の考慮とかが必要ですが、BeforeUpdate イベントが走る状況なら
自フォームが可視・アクティブと考えてほぼ間違いないと思われるので、
かなり簡略化できるでしょう。

なお同件のトピック準備中ですが、今週中はまず間に合わないので、
たぶん待つよりご自分で書いたほうが早いです。
あるいは、もっと良い案があるかもしれないので、他の方のレスを
お待ちになってみてもよいかと思います。

それでは。

【11468】Re:閉じるボタンと BeforeUpdateイベント
回答  YU-TANG  - 10/2/19(金) 10:28 -

引用なし
パスワード
   こんにちは、YU-TANG です。
ちょっと訂正。

> If A) 仮想マウス左ボタンが押されていたら

これ成立しないですね。
実際にクリックされたことになるのは、左ボタンが離された後ですから、
GetAsyncKeyState で調べてもボタンは押されていないことになります。
今さっき押されたかどうかを調べるとなると、メッセージをポーリング
するしかないと思いますが、そうすると結局サブクラス化になっちゃいますね。

かといって、サブクラス化以外で判定しようとすると、条件が

>  If B) マウスカーソルが自フォームの閉じるボタンの真上にあれば

しか残りません。
これでは、クリックしてなくても、たまたまカーソルが上にあるだけで
誤判定しますから、幾らなんでも実用的ではないですね。

ちょっと手詰まりの予感がしますが。
どなたか良案ないか、待ってみましょうか。

それでは。

【11472】Re:閉じるボタンと BeforeUpdateイベント
お礼  わさび  - 10/2/19(金) 16:57 -

引用なし
パスワード
   ▼YU-TANG さん:

APIは未経験なので、これから勉強しないといけませんが、
私では思いつかないアイデアで、発想の幅が広がりました。
ありがとうございます!

【11523】Re:閉じるボタンと BeforeUpdateイベント
回答  YU-TANG  - 10/3/12(金) 3:57 -

引用なし
パスワード
   こんばんは、YU-TANG です。

なんとかフックしない逃げ道が見つかったような気がしますので、
下記で公開してみました。

更新前処理イベント内で閉じるボタンのクリックを判定する方法 | YU-TANG's MS-Access Discovery
ht tp://www.f3.dion.ne.jp/~element/msaccess/AcTipsBeforeUpdateEventAndCloseButton.html

それでは。

475 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free