VB6.0 SP6
WindowsXP
画面起動直後、テキストボックスにTabIndex=0と設定をしていても
カーソルがあたりません。
Form_Load()でTabIndex=0に設定しているので、そこにBreakをはって起動し、
Breakで止めてから再度実行すると、カーソルはあたります。
こういった場合、どのようにしてテキストボックスにカーソルをあてれば
いいのでしょうか。
> Form_Load()でTabIndex=0に設定しているので
そのような使い方はせず、デザイン時に設定しておけば
テキストボックスにカーソルが当たると思います。
特攻隊長まるるうさん、回答ありがとうございます。
おっしゃるとおり、プロパティのTabIndexを0に設定しています。
詳細を説明しますと、本画面はダイアログの設定です。
起動時の処理としては、
Form_Load()で
1.画面上に表示する文言をLoadresstringで文字を読み込む。
2.中央表示、最上位表示に設定する。
そうした場合、カーソルがあたりません。
処理の順番があるのでしょうか?
SetFocusではだめでしょうか?
TextBox1.SetFocus
VB6の環境が無いため、確認はしてないですが。
> おっしゃるとおり、プロパティのTabIndexを0に設定しています。
最初の説明ではForm_Load()でプロパティを設定していると
おっしゃってますので、ボクの言った内容とは違うと思います。
何がおっしゃる通りなのか分かりません。
> 処理の順番があるのでしょうか?
知りませんが、処理をコメントアウトして原因を調べれば
いいんじゃないですか?
> SetFocusではだめでしょうか?
それ自体は良いのかもしれないけど、通常、
TabIndex=0のコントロールにフォーカスが
当たるのだから、原因を調査せずに解決する
のはバグを隠す行為に繋がりますよ。
>> SetFocusではだめでしょうか?
> それ自体は良いのかもしれないけど、
良くないと思いますよ。
Load イベントの時点では、まだフォームが表示されていないので、
SetFocus メソッドを呼び出すと、実行時エラーになってしまうはずです。
Load イベント完了後(または、フォーム表示後)に呼び出すのであれば
動作するでしょうけれども。
>>> Form_Load()で
>>> 1.画面上に表示する文言をLoadresstringで文字を読み込む。
>>> 2.中央表示、最上位表示に設定する。
>>> そうした場合、カーソルがあたりません。
各コントロールの GotFocus/LostFocus イベントを、Debug.Print 等を仕込んで
追跡してみてください。他のコントロールにフォーカスが遷移していませんか?
もしくは、現在どのコントロールにフォーカスがあるのかを、
Timer で調べてみてはいかがでしょう。たとえば、こんな感じで。
Private Sub Timer1_Timer()
If Me.ActiveControl Is Nothing Then
Debug.Print "(Nothing)"
Else
Dim s As String
s = Me.ActiveControl.Name
Debug.Print TypeName(Me.ActiveControl); " - ";
If Me.Controls(s) Is Me.ActiveControl Then
Debug.Print s
Else
Debug.Print s & "(" & CStr(Me.ActiveControl.Index) & ")"
End If
End If
End Sub
皆様アドバイスありがとうございます。
特攻隊長まるるう様
>> おっしゃるとおり、プロパティのTabIndexを0に設定しています。
>最初の説明ではForm_Load()でプロパティを設定していると
>おっしゃってますので、ボクの言った内容とは違うと思います。
>何がおっしゃる通りなのか分かりません。
説明不足でしたが、元々プロパティでTabIndexを0に設定していました。
それでは思った動作をしなかったので、Form_Loadに記載した訳です。
魔界の仮面弁士様
>もしくは、現在どのコントロールにフォーカスがあるのかを、
>Timer で調べてみてはいかがでしょう。
教えていただいたソースを使って、調べました。
すると、(Nothing)と表示され続けました。
つまり、どこにもフォーカスがあたっていないようです。
Form_Active()で、テキストにSetFocusをするとカーソルがあたりました。
このような解決方法でよいのでしょうか?
TabIndex が設定されていても、
・アクティブになれないコントロール(Label等)
・非表示のコントロール(自身、または親コンテナの Visible が False)
・使用不可コントロール(自身、または親コンテナの Enabled が False)
の場合、そのコントロールはアクティブになれないため、
次の TabIndex のコントロールに権利が移ります。
その結果、どのコントロールもアクティブになれない場合には、
ActiveControl Is Nothing の状態になります。
で。通常、Load 完了時点で使用可能なコントロールがある場合には、
Nothing にはならないハズなのですが、当方でも Nothing になってしまう
現象を経験した事があります。
(詳細は失念してしまい、今となっては再現手順も分かりませんが…)
可能であれば、原因を調査して解決したいところですが、
どうしても判明しない場合には、
> Form_Active()で、テキストにSetFocusをするとカーソルがあたりました。
も已む無しかと思います(実際は Form_Active → Form_Activate ですね)。
> このような解決方法でよいのでしょうか?
特攻隊長まるるうさんも仰っているように、バグを隠す行為なので、
個人的には不本意な解決策なのですけれども、どうしても解決しないなら
そのような回避策もアリだと思います。
ただし、その Activatate による強制 SetFocus は初回のみにしておき、
2 回目以降の Activate イベントでは、SetFocus しないように
制御した方が良いでしょうね。
FormLoad時にSetFocusは使用しないほうがいいんでね。
勉強になりました。
特攻隊長まるるうさんの言うように、通常であれば
TabIndexに0を設定しているのに、フォーカスがあたらないって根本が解決できてませんよね。
現在の方法で期待通りの動きをしていて、それで良しとするか
原因を追究するかの判断だと思います。
TabIndexが0に設定されているものが複数あるってことはないですかね?
全てに0を設定すると、最後に配置したものにフォーカスがあたっていました
でも、どこにもフォーカスがあっていないってことは、そういうことも
ないんでしょうね。
特にフォーカスの操作をしないで、どこにもフォーカスがあたっていないって事はあるものなんでしょうかね??
スレ主でもないのに、質問みたいなことしてすいません。
気になってしまったもので。
> TabIndexが0に設定されているものが複数あるってことはないですかね?
> 全てに0を設定すると、最後に配置したものにフォーカスがあたっていました
元質問者“教えてください”さんは、VB6 の場合の質問をしています。
しかしひよこさんは、VB.NET の話をしておられませんか?
VB6 においては、TabIndex は常に一意です。
同一フォーム上の 2 つ以上のコントロールに、TabIndex = 0 を
割り当てることはできないはずですけれども…。
(TabIndex を変更した場合、各コントロールの TabIndex は自動的に
スライドし、常に一意となる仕様になっています)
>TabIndex を変更した場合、各コントロールの TabIndex は自動的に
>スライドし、常に一意となる仕様になっています
あー、確かに同じ値のものがあればスライドしてました。
記憶が蘇ってきました。
VB6ではそうでしたね、、、
失礼しました
本画面は、
ラベル:1
ボタン:2
テキスト:1
で構成されています。
なぜフォーカスが当たらないのか、いろいろやってみましたが
わかりませんでしたので、Form_Activete()内で、SetFocusを
1度だけ呼ぶようにしました。
皆様、ありがとうございました。
ツイート | ![]() |