プロが教えるわが家の防犯対策術!

はじめまして。
VB6.0 SP5で開発を行っております。
子フォームが開いていない状態のMDI親フォームで、F1~F12のファンクションキーを押下したら、それぞれ対応した子フォームが開くようにしたいのですが、MDI親フォームでは、KeyUpやKeyDownのイベントが発生しないため、キー入力監視ができません。

上記のような事を実現させるためには、どのようにすればよろしいのでしょうか。
MDI親フォームには、PictureBoxを貼りその中にボタンを設置して、マウスクリックでも子フォームを開くようにしています。PictureBoxでKeyイベントを取得しようとしましたが、ボタンをクリックして、子フォームを開き、その子フォームを閉じた後(子フォームのUnLoadイベント内で親フォームのPictureBoxにSetFocusしています)、フォーカスがどこかへ行ってしまい、イベントがとれません。

常に、子フォームを開いている状態で、子フォームでKeyイベントを取得するしかないのでしょうか。その場合、子フォームを閉じた時に、別のフォーム(Keyイベント取得用フォーム)を自動的に開く方法はありますでしょうか。

長文となり申し訳ありません。
ご教授の程、よろしくお願い致します。

開発環境
 OS:WindowsXP SP3
 言語:VisualBasic6.0 SP5

A 回答 (2件)

たぶんファンクションキーにて起動する子フォームの変数を


Dummyフォームのメンバー変数として Dimなどで宣言しているのでしょう
その場合CloseボタンでTerminateが発生しません

Dummyフォームに起動したフォームを扱うプロパティを設置します
public Property Get SubForm1 as SubForm
  ' objForm1がDim宣言された子フォーム
  Set SubForm1 = objForm1
End Property
Public Property Set SubForm1( frm as SubForm)
  ' objForm1をNothingに設定するために使用
  Set objForm1 = frm
End Property

といった具合にしておきます

MainForm_Testで
if not Dummy.SubForm1 is Nothing then
  Set Dummy.SubForm1 = nothing
  Exit Sub
end if
MDIForm_Activate

といった具合でうまくいきませんか

SubForm側はUnloでとTerminateの両方に
MDIForm1.Test
を記述しておきます

当方は dummyには SubForm用の変数を準備することなく組んだので
Terminateイベントがそのまま利いてしまいました
    • good
    • 0
この回答へのお礼

redfox63様

丁寧なご説明ありがとうございます。

>たぶんファンクションキーにて起動する子フォームの変数を
>Dummyフォームのメンバー変数として Dimなどで宣言しているのでしょう
ご指摘の通りでした。
お教えいただいた方法を、これから試してみます。
ありがとうございました。

お礼日時:2009/03/13 18:40

1つダミーの子フォームを追加してはいかがでしょう


このダミーのフォームのKeyDownイベントで F1-F12に対して子フォームを作成するようにします
仮に Dummy という名前の子フォームだとします
Dummyフォームの BorderStyleを『0-なし』にしておきます
これをしないと ダミーが見えてしまいます

次にMDIFormにPublicなメソッドを1つ追加します
Public Sub Test()
  MDIForm1_Activate
End Sub

MDIFormのアクティベイトイベントに
If ActiveForm Is Nothing then
  dummy.Visible = False
  dummy.WindowState = VbMaximized
  dummy.Show
End If

追加される子フォームのTerminateイベントで
MDIForm1.Test

といった具合でどうでしょう
    • good
    • 0
この回答へのお礼

redfox63様
早速のご回答有難うございます。
教えていただいた方法を試してみました。

DummyのWindowStateが最大の場合、子フォームを開いて、閉じた後、Dummyでのキーイベントの取得ができないようです。
DummyのWindowStateを標準にした場合は、子フォームを閉じた後でもDummyでのキーイベントが取得できました(ただし、MDIフォーム内にDummyが表示されてしまいます)。

また、デバッグモードで見てみたのですが、子フォームを閉じた後(子フォームのTerminateイベントにMDIForm1.Testを記述したんですが、Terminateイベントが発生しないみたいで、Unloadイベントに記述しました)の処理のMDIForm1のMDIForm_ActivateでのIf ActiveForm Is Nothing thenがFalseになっているのか、if文内の処理がスルーされてしまいました。

これは、子フォーム側のプロパティの設定等が必要なのでしょうか?

申し訳ありませんが、ご回答のほどよろしくお願い致します。

お礼日時:2009/03/13 13:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!