起動直後、テキストボックスにカーソルがある状態にするには?

解決


教えてください  2009-09-08 22:48:47  No: 142501

VB6.0  SP6
WindowsXP

画面起動直後、テキストボックスにTabIndex=0と設定をしていても
カーソルがあたりません。

Form_Load()でTabIndex=0に設定しているので、そこにBreakをはって起動し、
Breakで止めてから再度実行すると、カーソルはあたります。

こういった場合、どのようにしてテキストボックスにカーソルをあてれば
いいのでしょうか。


特攻隊長まるるう  2009-09-08 23:27:26  No: 142502

> Form_Load()でTabIndex=0に設定しているので
そのような使い方はせず、デザイン時に設定しておけば
テキストボックスにカーソルが当たると思います。


教えてください  2009-09-08 23:39:19  No: 142503

特攻隊長まるるうさん、回答ありがとうございます。

おっしゃるとおり、プロパティのTabIndexを0に設定しています。
詳細を説明しますと、本画面はダイアログの設定です。
起動時の処理としては、
Form_Load()で
1.画面上に表示する文言をLoadresstringで文字を読み込む。
2.中央表示、最上位表示に設定する。

そうした場合、カーソルがあたりません。
処理の順番があるのでしょうか?


ひよこ  2009-09-09 01:05:51  No: 142504

SetFocusではだめでしょうか?

TextBox1.SetFocus

VB6の環境が無いため、確認はしてないですが。


特攻隊長まるるう  2009-09-09 01:07:51  No: 142505

> おっしゃるとおり、プロパティのTabIndexを0に設定しています。
最初の説明ではForm_Load()でプロパティを設定していると
おっしゃってますので、ボクの言った内容とは違うと思います。
何がおっしゃる通りなのか分かりません。

> 処理の順番があるのでしょうか?
知りませんが、処理をコメントアウトして原因を調べれば
いいんじゃないですか?


特攻隊長まるるう  2009-09-09 01:09:39  No: 142506

> SetFocusではだめでしょうか?
それ自体は良いのかもしれないけど、通常、
TabIndex=0のコントロールにフォーカスが
当たるのだから、原因を調査せずに解決する
のはバグを隠す行為に繋がりますよ。


魔界の仮面弁士  2009-09-09 01:21:55  No: 142507

>> 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


教えてください  2009-09-09 01:46:09  No: 142508

皆様アドバイスありがとうございます。

特攻隊長まるるう様
>> おっしゃるとおり、プロパティのTabIndexを0に設定しています。
>最初の説明ではForm_Load()でプロパティを設定していると
>おっしゃってますので、ボクの言った内容とは違うと思います。
>何がおっしゃる通りなのか分かりません。
説明不足でしたが、元々プロパティでTabIndexを0に設定していました。
それでは思った動作をしなかったので、Form_Loadに記載した訳です。

魔界の仮面弁士様
>もしくは、現在どのコントロールにフォーカスがあるのかを、
>Timer で調べてみてはいかがでしょう。
教えていただいたソースを使って、調べました。
すると、(Nothing)と表示され続けました。
つまり、どこにもフォーカスがあたっていないようです。
Form_Active()で、テキストにSetFocusをするとカーソルがあたりました。
このような解決方法でよいのでしょうか?


魔界の仮面弁士  2009-09-09 02:51:01  No: 142509

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 しないように
制御した方が良いでしょうね。


ひよこ  2009-09-09 03:06:53  No: 142510

FormLoad時にSetFocusは使用しないほうがいいんでね。
勉強になりました。

特攻隊長まるるうさんの言うように、通常であれば
TabIndexに0を設定しているのに、フォーカスがあたらないって根本が解決できてませんよね。

現在の方法で期待通りの動きをしていて、それで良しとするか
原因を追究するかの判断だと思います。

TabIndexが0に設定されているものが複数あるってことはないですかね?
全てに0を設定すると、最後に配置したものにフォーカスがあたっていました

でも、どこにもフォーカスがあっていないってことは、そういうことも
ないんでしょうね。

特にフォーカスの操作をしないで、どこにもフォーカスがあたっていないって事はあるものなんでしょうかね??

スレ主でもないのに、質問みたいなことしてすいません。
気になってしまったもので。


魔界の仮面弁士  2009-09-09 03:15:03  No: 142511

> TabIndexが0に設定されているものが複数あるってことはないですかね?
> 全てに0を設定すると、最後に配置したものにフォーカスがあたっていました

元質問者“教えてください”さんは、VB6 の場合の質問をしています。
しかしひよこさんは、VB.NET の話をしておられませんか?

VB6 においては、TabIndex は常に一意です。
同一フォーム上の 2 つ以上のコントロールに、TabIndex = 0 を
割り当てることはできないはずですけれども…。
(TabIndex を変更した場合、各コントロールの TabIndex は自動的に
  スライドし、常に一意となる仕様になっています)


ひよこ  2009-09-09 03:25:24  No: 142512

>TabIndex を変更した場合、各コントロールの TabIndex は自動的に
>スライドし、常に一意となる仕様になっています

あー、確かに同じ値のものがあればスライドしてました。
記憶が蘇ってきました。
VB6ではそうでしたね、、、
失礼しました


教えてください  2009-09-09 19:32:19  No: 142513

本画面は、
ラベル:1
ボタン:2
テキスト:1
で構成されています。

なぜフォーカスが当たらないのか、いろいろやってみましたが
わかりませんでしたので、Form_Activete()内で、SetFocusを
1度だけ呼ぶようにしました。

皆様、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加