• 締切済み

コントロールが発生させるイベントを回避したい

DexMachinaの回答

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

AccessのVBAしか扱ったことのない者ですが(汗)、概念としては共通でいけると思いますので・・・ 移動元のFocus喪失系のイベントが終了してからでないと、移動先のFocus取得系のイベントは 発生しないので、移動先でのフラグ処理では間に合わないと推測されます。 従って、移動先によるLostFocusイベントの切り分けは無理だと思いますので、以下はその前提での 対策になります。 1)TextBox1のLostFocusイベントでは、「TextBox1のLostFocusイベントが発生したこと」を記録する  フラグだけを立てます(変数EveFlag=True) 2)Button1のGotFocusイベントでは、上記フラグを元に戻します(EveFlag=False) 3)TextBox1のLostFocusイベントで行いたかった処理を、イベントとは無関係のPrivate Subとして  フォーム モジュールに記述します(WhenMoveFromTB1) 4)TextBox1・Button1以外の、Focusを取得できる全コントロールのGotFocusイベントで、上記フラグが  オンだった場合は、上記Private SubをCallします ・・・以上が概念です。 コードの実例は以下の通り: Option Explicit 'フォームのモジュールレベルでフラグを宣言 Dim EveFlag As Boolean Private Sub TextBox1_LostFocus()   'TextBox1のLostFocusイベントが発生したことをフラグに記録   EveFlag = True End Sub Private Sub WhenMoveFromTB1()   'フラグの初期化   EveFlag = False   'ここ(↓)には、現在、TextBox1のLostFocusイベントに記述している処理を転記   MsgBox "LostFocusイベントの処理を代行します。" End Sub Private Sub TextBox2_GotFocus()   'TextBox1のLostFocusイベントが必要なTextBox2では、代行するSubをCall   If EveFlag = True Then Call WhenMoveFromTB1 End Sub Private Sub Button1_GotFocus()   'TextBox2のLostFocusイベントが無用のButton1では、フラグの初期化のみを実行   EveFlag = False End Sub Private Sub TextBox3_GotFocus()   'TextBox1のLostFocusイベントの起動が必要なコントロールがTextBox2以外にも   'ある場合は、TextBox2と同様に、代行SubをCall   If EveFlag = True Then Call WhenMoveFromTB1 End Sub ・・・以上です。

xiaolong_goo
質問者

お礼

お返事ありがとうございました。 結局フラグを立てるのもめんどくさくなりtextbox2のenterイベントで処理するようにしました。

関連するQ&A

  • イベントが発生しません・・・

    Excel VBAでの質問です。 フォーム上にコントロールはTextBox1つしかありません。 商品コードを入力させ、入力値より商品データを検索、編集させようと思います。 コードを入力しエンターキーを押しても、フォーカスの移動場所が無いためかExitイベントが発生しません。 閉じるボタン[×]でフォームを閉じると、Exitイベントは発生するようです。 入力後はフォームは閉じてもかまいませんが、イベントを発生させることはできるでしょうか。 どなたか教えてください。

  • comboboxのクリックイベントについて

    VB6です comboboxを設置してクリックイベントに処理を書いたら、フォームロード時に必ず1回クリックイベントが発生します。 当初はフラグを立ててこの現象を回避していたのですが、コードを書くうちに、この最初のクリックイベントが面倒で仕方ありません。 comboboxを設置するとフォームロード時に必ずクリックイベントが発生するのはVB6の仕様なのでしょうか。 それともほかに回避の仕方があるのでしょうか。

  • コマンドボタンのEnterイベント後に、フォーカスを移動したい。

    コマンドボタンのEnterイベント後に、フォーカスを移動したい。 フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。 CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 Private Sub CommandButton1_Enter() CommandButton1_Click End Sub Private Sub CommandButton1_Click() MsgBox ("OK") TextBox2.SetFocus End Sub この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。 (正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。) Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

  • ボタンをマウスで押し続けたときのイベント

    VB2005,Frameworks2を使用しています。 フォームに設置したButtonは、通常マウスをクリックする度にイベントが発生しますが、これをボタンをマウスで押している間だけイベントを発生されたいのですがその様なイベントやボタンの設定が見つかりません。 やはりタイマー等を使わないと再現できないのでしょうか? よろしくお願いします。

  • UserControl内の複数のTextBoxでKeyDownイベントが使えない

    VB2005の初心者です。 色々調べたつもりなのですが解らなくてよろしくお願いします。 フォームのTab移動を[Enter]きーで移動するようにしているのですが UserControlに複数のTextBoxを配置しUserControlを作成したものを、フォームに配置するとKeyDownイベントが取得できないというか、フォームに配置したTextBoxなどにフォーカスが移動してしまいます。 UserControl内のTextBoxのTabIndex順に移動させる方法などご存知の方いらっしゃいましたらご教授願えないでしょうか。 ProcessDialogKeyのオーバーライト辺りまでは調べたのですがよく解らなくてお願いします。

  • イベントの発生を待つ

    現在、テキストボックスへの文字入力を待つプログラムを作っております。 Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。 方針としては、まずBoolean型のフラグを用意し、まずTextBoxのKeyPressイベントでこのフラグをオンにし、メインのプロシージャでは必要個所でDoループを回してこのフラグを確認し、オンになっていたらオフにしてループを抜け出すというプログラムです。 このループの中にSleep()関数を入れたりしても、ループのところでアプリケーションがフリーズしてしまいます。(ブレークポイントなどで確認しました) もっと効率のよい方法をご存知でしたらご伝授ください。 (KeyPressイベントの中に直接処理を書けばいいじゃないか、とおっしゃるかもしれませんが、今回はあくまでメインプロセスから読む必要があったため、質問をさせていただきました。)

  • VBのイベント処理について

    お世話になります。 VB6.0のイベント処理について教えてください。 VB.NETでは、イベント処理のメソッド(VBだとプロシージャですか) のシグニチャのおしりに Handles Button1.Click という記述がされているので、このメソッドはButton1のクリックという イベントが発生したときに行われる処理だなと見当がつくのですが、 VB6.0ではその記述をしないのが一般的とみました。 してそのときに、このメソッドがButton1のクリック時のイベントだと いうのは、どのように判断されるのですか?メソッド名が Button1_Click みたいに勝手につけられるので、それで判断されるのですか?という ことはメソッド名を変えたらそのメソッドはButton1のクリック時の イベント処理メソッドではなくなってしまうのですか? よろしくご教授ください。

  • keydownイベントを発生で他のフォームで受信

    VB初心者です。 よろしくお願いします。 バーコードリーダーで読み込んでtextboxに表示させる仕組みを作りましたが、バーコードリーダーが ないのでバーコードリーダーを読み込んだように疑似的にできるようなことを考えています。 考えとしては バーコードを読み込んで表示させる:フォームA  ・keydownイベントを受っとる  ・textboxに読み込んだ値を表示 バーコードを読み込んだように疑似的に動作する:フォームB  ・keydownイベントを発生させる  ・フォームBに入力した値をフォームAに渡す フォームAは作成できましたが、フォームBのようなことはできるのでしょうか。 どのようなイベントを使用したらいいかなど、アドバイスをいただけないでしょうか。 環境:VB2008 OS:Windows7

  • VB6のロストフォーカス時の処理をキャンセルしたい。

    textbox1 textbox2 textbox3 があったとします。 textbox1には ロストフォーカス時にエラー処理が入っています。 登録、終了ボタンがあり、登録ではエラーではじいていいのですが、 終了ボタンの場合、エラー処理を回避(キャンセル)する方法はないでしょうか? こんな感じで 終了.click textbox1.lostfocus の処理をキャンセル end

  • VBAのExitイベントについて

    VBA(Excel)についてご質問します。 フォームにて、IDというオブジェクト名のテキストボックス、 Private Sub ID_Exit(ByVal Cancel As MSForms.ReturnBoolean) という関数(Exitイベント)を用意しました。 IDにフォーカスがある状態で、フォーカスを移動しようとすると、この関数が必ず実行されるかと思います。 そのとき、特定のボタン(例えばキャンセルボタン)がクリックされたためにフォーカスが移動したときは、この関数の処理を実行したくない。もしくはこの関数内で特定のボタンがクリックされたこと(そのためにフォーカスが移動したこと)を検出して、処理をスキップしたいです。 どうすれば実現できますでしょうか? よろしくお願いします。