
はじめまして。
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件)
- 最新から表示
- 回答順に表示
No.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イベントがそのまま利いてしまいました
redfox63様
丁寧なご説明ありがとうございます。
>たぶんファンクションキーにて起動する子フォームの変数を
>Dummyフォームのメンバー変数として Dimなどで宣言しているのでしょう
ご指摘の通りでした。
お教えいただいた方法を、これから試してみます。
ありがとうございました。
No.1
- 回答日時:
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
といった具合でどうでしょう
redfox63様
早速のご回答有難うございます。
教えていただいた方法を試してみました。
DummyのWindowStateが最大の場合、子フォームを開いて、閉じた後、Dummyでのキーイベントの取得ができないようです。
DummyのWindowStateを標準にした場合は、子フォームを閉じた後でもDummyでのキーイベントが取得できました(ただし、MDIフォーム内にDummyが表示されてしまいます)。
また、デバッグモードで見てみたのですが、子フォームを閉じた後(子フォームのTerminateイベントにMDIForm1.Testを記述したんですが、Terminateイベントが発生しないみたいで、Unloadイベントに記述しました)の処理のMDIForm1のMDIForm_ActivateでのIf ActiveForm Is Nothing thenがFalseになっているのか、if文内の処理がスルーされてしまいました。
これは、子フォーム側のプロパティの設定等が必要なのでしょうか?
申し訳ありませんが、ご回答のほどよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Microsoft Formsの「個人情報や...
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Excelにて、ユーザーフォームで...
-
Form_Load と Form_Activate の...
-
クリックイベントなのに、2回ク...
-
ACCESSでストップウォッチの作成
-
Access フォームが前面に表示さ...
-
アクセスのUserFormにはInitial...
-
VBAでユーザーフォームを再表示...
-
Hideについて(.NET)
-
フォームを画面のど真ん中に表...
-
ExcelVBAのユーザーフォームでe...
-
ExcelVBAでユーザーフォームが...
-
子フォームでDB更新後、親フォ...
-
VBAのテキストフォームの折り返...
-
エクセルのチェックボックスの...
-
フォームの二重起動の阻止
-
タスクバーにフォーム名を表示...
-
任意のフォームが表示されてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Microsoft Formsの「個人情報や...
-
Form_Load と Form_Activate の...
-
VBAでユーザーフォームを再表示...
-
クリックイベントなのに、2回ク...
-
ユーザーフォーム上に現在日時...
-
テキストボックス入力データの...
-
VBAのテキストフォームの折り返...
-
ACCESSのフォーム、開くんです...
-
Hideについて(.NET)
-
ユーザーフォームのテキストボ...
-
エクセルVBAのフォームを最...
-
モーダルフォームとモードレス...
-
EXCEL VBA ユーザーフォームの...
-
フォームのテキストボックスな...
-
コントロールの存在確認
-
パソコンの画面に合わせてユー...
-
フォームウィンドウを最前面に...
-
Accessで、一つのフォーム画面...
おすすめ情報