初期設定:Frame1.Visible = False
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyAdd Then
If Toggle1 = False Then
Frame1.Visible = True
End If
End If
If KeyCode = vbKeyPageDown Then
Frame1.Visible = False
End If
End Sub
としているのですが、最初のTrueは有効になるのに
vbKeyPageDown ThenのあとのFalseが有効にならず、
それどころか、そのほかのプログラムもストップしてしまいます。
(エラーにはならないのですが、全ての動きがなくなってしまいます。)
終了することしか出来ません。
誰か力を貸して下さい。
よろしくお願いします。
他のコントロールにフォーカスが移って
Form_KeyDown 自体が動作してないのでは?
そもそもフレームって実行中は選択できないと
思うんですが、フォームの KeyPreview = True
とかにして動作させてるんですか?
うまく動作しなくなった状態で有効になってる
コントロールはなんですか?
>それどころか、そのほかのプログラムもストップしてしまいます。
>(エラーにはならないのですが、全ての動きがなくなってしまいます。)
これはフリーズするということですか?…例えば
テキストボックスを貼り付けておいて、うまく動作
しなくなった状態で入力しても正常に動作しますか?
To 特攻隊長まるるうさん
ありがとうございます。
> そもそもフレームって実行中は選択できないと
> 思うんですが、フォームの KeyPreview = True
> とかにして動作させてるんですか?
選択できない事を知らなかったので、
プログラムをroadさせたあとに動作中のform上に
置いていたFrameを単純にVisible=FalseからTureへ
キーを押すと変更するようにしていました。
(プログラム中で)
特攻隊長まるるうさんの意見を参考にして、
一つのForm上でFrameのVisibleをF→T→Fなどとするの
ではなく、新しくFormを作ってそこにこのFrame1を
そのまま移動させて、下記のようにしたのですが、
やはり画面からFrame1が消えてくれません。
何が悪いのでしょうか?
###Form1###
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyAdd Then
If ToggleEnter = False Then
FrmForm2.Show
FrmForm2.SetFocus
End If
End If
End Sub
###Form2###(Frame1を貼り付けてある)
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyAdd Then
Unload Me
End If
End Sub
*Frame1なしの状態で上記プログラムを実行した場合は
ちゃんとForm2は消える。
>何が悪いのでしょうか?
それはデバッグして頂かないと分かりませんてば(^^;)
vbKeyAdd ってのが何となく怪しいですが…
問題を整理しましょう。まずは KeyCode がまずいのか
その他が原因なのか?です。
例えば
・フォームは新規作成
・Frame のプロパティは全てデフォルト
・他のコントロールは貼り付けない
で以下のコードを実行してみて下さい。
こちらの環境では正常に動作します。
[VB6.0]
Option Explicit
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyAdd Then
Frame1.Visible = True ' ※
End If
If KeyCode = vbKeySubtract Then
Frame1.Visible = False ' ※
End If
If KeyCode = vbKeyPageUp Then
Frame1.Visible = True ' ※
End If
If KeyCode = vbKeyPageDown Then
Frame1.Visible = False ' ※
End If
Debug.Print KeyCode
End Sub
で、ボクの質問にちゃんとした回答を頂けませんでしたが
フリーズするなら ※ 印の所に全てブレークポイントを
置いてみて下さい。何が原因かイマイチ分からないので
1行ずつステップ実行して設定を確認していって下さい。
フリーズしないなら単純にキーコードが違うんじゃないですか?
Debug.Print KeyCode
で出力されるキー番号を確認して下さい。
To 特攻隊長まるるうさん
> で、ボクの質問にちゃんとした回答を頂けませんでしたが
> フリーズするなら ※ 印の所に全てブレークポイントを
> 置いてみて下さい。
すみません。
選択できないということだったので、つい先走ってしまいました。
フリーズするわけではなく、無反応になるという感じです。
ある操作で(キー操作)
MsgBox("プログラムを終了しますか?", vbYesNo + vbQuestion, "終了")を
設定しているのですが、それもできないため、
"×"をクリックして終わらせるしかない感じです。
特攻隊長まるるうさんのおっしゃったとおりに
※ 印の所に全てブレークポイントを
置いてチェックしてみたところ、ブレークさせた場合は
そのあと進めると、Frame1はVisible=Falseになって、
画面から消えました。
しかし、ブレークなしで普通にプログラムを動かすと
やはり画面に残ったままになり、操作不能になってしまいます。
(やはり"×"をクリックして終わらせるしかない感じになる)
Debug.Print KeyCode の結果は107と34でした。
現在、そういう状態です。
初期設定:Frame1.Visible = False
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyPageDown Then
Frame1.Visible = False '※ブレークポイント
If Label1.Caption = LABEL Then
Toggle1 = True
〜中略〜
End If
End If
If KeyCode = vbKeyAdd Then
If Toggle1 = False Then
Frame1.Visible = True '※ブレークポイント
End If
End If
End Sub
>※ 印の所に全てブレークポイントを
>置いてチェックしてみたところ、ブレークさせた場合は
>そのあと進めると、Frame1はVisible=Falseになって、
>画面から消えました。
>しかし、ブレークなしで普通にプログラムを動かすと
>やはり画面に残ったままになり、操作不能になってしまいます。
むむむむむっ…そうきましたか(^^;)
マイクロソフトのサポート技術情報でそれらしいのは引っかかりません
でしたが、とりあえずボクの環境(Win2000(Sp4)VB6.0(Sp5))では
正常に動きます。OSとVBの種類・バージョン・サービスパックの
バージョンはどうなってますか?
[テスト1]
サービスパックバージョンが5以上なら次にテキストボックスを1個貼り付けて
フォームのプロパティ KeyPreview = True
で実行したらどうなります?
(表示するコントロールが無くなるのが不満かも?と思ってテキスト
ボックス貼り付け。コントロール側でのキーイベントが悪さしてるのか?
と思って KeyPreview = True)
ブレークした時に正常に動いたのって…ブレークするとコード側が
アクティブになって、フォームを表示させるとフォームが再描画
されるから正常に動いた気がします。描画関係の問題かも??
>Debug.Print KeyCode の結果は107と34でした。
キーコード自体は問題無さそうですね。
[テスト2]
キーが悪いのか?… vbKeyA とか vbKeyB とかだとどうなります?
To 特攻隊長まるるうさん
親切にありがとうございます。
バージョンは
WindowsXP Professional Ver2002 SP1
VB 6.0(SP5)
です。
> フォームのプロパティ KeyPreview = True
> で実行したらどうなります?
!!!
動きましたっ!
ありがとうございます!!!
<KeyPreview>・・・フォームのキーボード イベントとコントロールのキーボード イベントのどちらを先に実行するかを設定します。
とありますが、今回の場合いったい何が起きていたんでしょうか?
ぼんやりとしか分かりません。。。
もしよろしければ、その辺りも教えていただけますでしょうか?
お手数おかけしてすみません。
すみません。
"解決"にチェックを入れるべきでしたね。
ありがとうございます。
>もしよろしければ、その辺りも教えていただけますでしょうか?
>お手数おかけしてすみません。
うぅんー。確かにちょっと手間ですねぇ。お金をもらえない範囲では
この辺が限界です…詳しく調べる気はありません(この問題に関して
もう少し範囲の狭い質問がくるか、自分が必要な情報になったら
答える事はあるかもしれませんが…)。
…正直『これ!』といった理由が分かった訳ではありません。
まず…KeyDown イベント、KeyUp イベントについてヘルプで調べてください。
[ヘルプより抜粋]
>解説
>
>フォーカスが設定されているオブジェクトでは、KeyDown イベントおよび
>KeyUp イベントによってすべてのキー操作を検出できます。フォームに
>フォーカスが設定できるのは、フォーム上に有効なコントロールが表示
>されていない場合だけです。
つまり、
・[追加]プロジェクトごと新規作成
・フォームは新規作成
・Frame のプロパティは全てデフォルト
・他のコントロールは貼り付けない
・[追加]上の条件の例外としてテキストボックス1個のみ Frame 以外の場所に貼り付ける
・[確認]Form1.KeyPreview = False のまま
この状態ではテキストボックスが有効となり Form_KeyDown イベントは
起こらないはずです。
[テスト3]
新しく貼り付けたテキストボックスの KeyDown イベント
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyAdd Then
Frame1.Visible = True ' ※
End If
If KeyCode = vbKeySubtract Then
Frame1.Visible = False ' ※
End If
If KeyCode = vbKeyPageUp Then
Frame1.Visible = True ' ※
End If
If KeyCode = vbKeyPageDown Then
Frame1.Visible = False ' ※
End If
End Sub
だと上手く動きます?
…で、
・フォームは新規作成
・Frame のプロパティは全てデフォルト
・他のコントロールは貼り付けない
で Form_KeyDown イベントが有効なのは、他に有効なコントロールが
無いから…だと思うんですが…。
もう一度言いますが、ボクの環境(Win2000(Sp4)VB6.0(Sp5))では
正常に動きます(T▽T)。…もしかしたら
>新しくFormを作ってそこにこのFrame1をそのまま移動させて
って書いてるから Frame1 になんか乗ってたりします??
Frame1 も新規貼り付けでやってて…同じ症状なら…OSの違い?…とか
ちょっと調べるには手間が掛かる…というかマイクロソフトに聞いて
下さいって話になるかもしれません。
ここで『全体に共通のキーボード処理ルーチンを記述する』場合、
それぞれのコントロールで処理するのは面倒なのでフォームで
KeyPreview プロパティを真(True)に設定するわけです。
[ヘルプより抜粋]
>メモ
>
>KeyPreview プロパティが真 (True) に設定されている場合、KeyDown
>イベントおよび KeyUp イベントは、フォーム上のコントロールよりも先に、
>フォームによって認識されます。
ここで初めて Form_KeyDown イベントが有効になってくる…はず…なんですが
…初心者プログラマさんの環境では
[最初の書き込みより抜粋]
>としているのですが、最初のTrueは有効になるのに
>vbKeyPageDown ThenのあとのFalseが有効にならず、
>それどころか、そのほかのプログラムもストップしてしまいます。
>(エラーにはならないのですが、全ての動きがなくなってしまいます。)
>終了することしか出来ません。
…しかも KeyPreview についてご存知ない様子…つまり False のまま。
ということでまだ状況がつかめてないんですよ(^^;)こちらで再現できません。
Xp のマシンで試しても良いんですが…[VB6.0]インストールしてないですし…
で、結局、なんでか分からないけど本来取れるはずの無い(?)(←いまいち
情報に自信なし) Form_KeyDown イベントが走ってバグってるのか、有効な
コントロールが無くて Form_KeyDown イベントは正常に起こってるけど
その後の処理で非表示になったオブジェクト(コントロール?)に制御が
移ってるのか、フォームの制御がなんかのツボにはまって戻ってこないか…
…でもそれなら
>(やはり"×"をクリックして終わらせるしかない感じになる)
これがおかしい。"×"をクリックしても反応しなくなる…なら分かる
んですが…。
では Form_KeyDown イベントが起こってないだけ?
…それもおかしい。
>※ 印の所に全てブレークポイントを
>置いてチェックしてみたところ、ブレークさせた場合は
>そのあと進めると、Frame1はVisible=Falseになって、
>画面から消えました。
イベントが起こってなければブレークポイントで止まるわけがない。
わけわかりませんw。で、原因の追求はあきらめて本来の使い方
> フォームのプロパティ KeyPreview = True
> で実行したらどうなります?
となったわけです。
現状で言える事は『何かがおかしい』w
どれが原因かは上にあげたようなことを一つ一つ調べてもらわないと
分かりません。くどいようですがボクの環境(Win2000(Sp4)VB6.0(Sp5))
では正常に動きます(T▽T)。
ざっと全体を読み返して…最初の1回だけなぜか(←ここはやっぱり分からない)
Form_KeyDown イベントが起こってその段階で本来の動きに戻り、有効な
コントロールに制御が移ってそれ以降 Form_KeyDown イベントが起こらない
…が一番可能性はあるんですが…
Frame1 以外のコントロール(オブジェクト)1個も貼り付けてませんよね?ね?
あ。分かった。
>としているのですが、最初のTrueは有効になるのに
最初は Frame が非表示→有効なコントロールが無い
→Form_KeyDown イベントが起こって成功
>vbKeyPageDown ThenのあとのFalseが有効にならず、
>それどころか、そのほかのプログラムもストップしてしまいます。
>(エラーにはならないのですが、全ての動きがなくなってしまいます。)
>終了することしか出来ません。
Frame が表示された時点で何かフォーカスを受け取れるような
"有効な"コントロールが表示される→制御がそのコントロールに
移る→有効なコントロールがあるので Form_KeyDown イベントは
起こらない。
…でどうよ?
To 特攻隊長まるるうさま
ど素人の超初心者に色々と教えていただき
ありがとうございました。
よく読んで、理解したいと思います。
本当にありがとうございました。
ツイート | ![]() |