- PR -

Text.Focus について

投稿者投稿内容
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-26 14:28
Visual Basic 2005 Express Edition でWindowsアプリケーションを開発しています。
Focus についてお尋ねします。

現在フォームに2個のTextBoxを配置してText1に入力した後はFocusをText12に移動し、
Text12に入力後はText1に移動するようプログラムしています。この状態でフォーカスを
Text2にあることを確かめてから下記のコードを実行してもText1に"ABCDEFG"と入力されます。

If Text1.Focus = True Then
Text1.Text = "ABCDEFG"
Text12.Focus()
ElseIf Text2.Focus = True Then
Text2.Text = "TUVWXYZ"
Text1.Focus()
End If
ためしに下のコードを最初の行に挿入して実行しますと「True True」とメッセージが
帰ってきます。
MessageBox.Show(Text1.Focus & " " & Text2.Focus)

デバックもエラーなく正常に動作していますがどこが問題なのでしょうか
ご指導下さい。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-10-26 14:51
こんにちは。

下記のメソッド・プロパティを混同しているんじゃ?

Control.Focus メソッド
Control.Focused プロパティ
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-10-26 14:55
うーむ。
失礼ながら、何が言いたいのかさっぱりわかりません。
とりあえず脳内エスパー伊東と脳内エスパー魔美と脳内笛座輪芸氏まで
呼び出して探ってみたんですが、やっぱりわかりませんでした。

とりあえず言えることは、Focus はプロパティじゃなくてメソッドだから
Text1.Focus なんてやったらフォーカスが移動しちゃうんだぜ?という
ことかな。
(メソッドなのに () 付けなくていい VB の仕様は嫌いだ)
フォーカスがあるかどうか調べるには Focused プロパティを使うんじゃ
ないかなぁと推測。

あと、フォーカスがらみはタイミングがシビアなので、MessageBox
なんか使うとあとあと面倒なことになるので止めた方がいいと忠告。
(MessageBox を呼び出した時点でフォーカスがなくなるからね)

# と、書いているうちに Tdnr_Sym さんに先を越されてしまったわけですが
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-10-26 14:56
VB.NETのことはよくわかんないけど、引数のないメソッドは()を省略できるんでしょうか?
もし省略できるのなら、提示されたコードを省略なしに書くと
コード:
If Text1.Focus() = True Then
  Text1.Text = "ABCDEFG"
  Text12.Focus()
ElseIf Text2.Focus() = True Then
  Text2.Text = "TUVWXYZ"
  Text1.Focus()
End If 


となります。
このコードが意味するところは、「Text1にフォーカスを移動し、移動できたらText1の入力内容を、ABCDEFGにし、移動できなければ(めんどいので以下略)」、となります。

おそらく、望まれているコードは、
コード:
If Text1.Focused = True Then
  Text1.Text = "ABCDEFG"
  Text12.Focus()
ElseIf Text2.Focused = True Then
  Text2.Text = "TUVWXYZ"
  Text1.Focus()
End If 


でしょう。きっと。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-26 15:03
Tdnr_Symさん、解答ありがとうございました。

早速プロパティの方を
If Text1.Focus = True Then → If Text1.Focused = True Then
に修正しテストしますと正常に動作しました。それにしてもなぜ
「Text1.Focus」でエラーにならなかったのか分りませんが
見事に解決いたしました。このことは、おそらく忘れることはない
と思います。ありがとうございました。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-26 15:24
ぽぴ王子(本物)さん、かずくんさん続けて解答いただいていましたので見落としました。
ありがとうございました。ご指摘の通りText1.Focusedに修正し正常に動作します。
間違いついでに以下のように1行目を以下のように修正しますと、今度はText2にしか
入力されず"TUVWXYZ" と入力されます。
If Text1.Focus = False Then

また、"If Text1.Focus ="まで記述するとIntelliSenseが動作してTrue,Falseのリスト
が表示されます。Text1.FocusメソッドそのものにもTrue,Falseが設定できるのでしょうか。
とりあえず、おかげさまで問題解決いたしました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-26 15:33
引用:

また、"If Text1.Focus ="まで記述するとIntelliSenseが動作してTrue,Falseのリスト
が表示されます。Text1.FocusメソッドそのものにもTrue,Falseが設定できるのでしょうか。



もちろん、メソッドに値を設定することは出来ません。

ですが、Contro.Focus() メソッドは bool 型の戻り値を返します。
ということは、戻り値は true か false のどちらかであることは明らかです。

そして、VB の構文では比較の記号は = であるため

引用:

また、"If Text1.Focus ="まで記述するとIntelliSenseが動作してTrue,Falseのリスト
が表示されます。



となるのでしょう。これはまぁ妥当な動作なんじゃないでしょうか。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-10-26 16:33
引用:

だんじりさんの書き込み (2007-10-26 15:03) より:

早速プロパティの方を
If Text1.Focus = True Then → If Text1.Focused = True Then
に修正しテストしますと正常に動作しました。それにしてもなぜ
「Text1.Focus」でエラーにならなかったのか分りませんが
見事に解決いたしました。このことは、おそらく忘れることはない
と思います。ありがとうございました。


「なぜ『Text1.Focus』でエラーにならなかったのか」を理解しない
まま突き進んでしまうと、また同じようなところでつまづく可能性が
あります。
そしてだんじりさんの過去の投稿を拝見すると、その確率が非常に
高いと思います。

元のコードに書かれた Text1.Focus(継承されているので、元は
Control.Focus() )は、渋木さんが書かれているとおり Boolean
型の戻り値を返します。
そしてそれは MSDN を見るとちゃんと書いてあります。

なぜエラーにならないのかと言われれば、Control.Focus() が戻
り値を返すタイプのメソッドであるからに他ならないわけですが、
Focus() がどういった動きをするのかを知っていれば
「なぜ『Text1.Focus』でエラーにならなかったのか」という疑問
は出てこないはずです。

今回のコードの原因は「 Control.Focus() と Focused を混同し
ていた」ことだと思うのですが、これも Focus() を使おうとした
時点でMSDN で確認しておけば質問するほどの問題にならずに済
んだのではないでしょうか。
まずは MSDN を真っ先に見る習慣をつけてください。そして正しい
構文を頭の中に叩き込むようにしてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)