- - PR -
Text.Focus について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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) デバックもエラーなく正常に動作していますがどこが問題なのでしょうか ご指導下さい。 | ||||||||
|
投稿日時: 2007-10-26 14:51
こんにちは。
下記のメソッド・プロパティを混同しているんじゃ? ・Control.Focus メソッド ・Control.Focused プロパティ | ||||||||
|
投稿日時: 2007-10-26 14:55
うーむ。
失礼ながら、何が言いたいのかさっぱりわかりません。 とりあえず脳内エスパー伊東と脳内エスパー魔美と脳内笛座輪芸氏まで 呼び出して探ってみたんですが、やっぱりわかりませんでした。 とりあえず言えることは、Focus はプロパティじゃなくてメソッドだから Text1.Focus なんてやったらフォーカスが移動しちゃうんだぜ?という ことかな。 (メソッドなのに () 付けなくていい VB の仕様は嫌いだ) フォーカスがあるかどうか調べるには Focused プロパティを使うんじゃ ないかなぁと推測。 あと、フォーカスがらみはタイミングがシビアなので、MessageBox なんか使うとあとあと面倒なことになるので止めた方がいいと忠告。 (MessageBox を呼び出した時点でフォーカスがなくなるからね) # と、書いているうちに Tdnr_Sym さんに先を越されてしまったわけですが _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||
|
投稿日時: 2007-10-26 14:56
VB.NETのことはよくわかんないけど、引数のないメソッドは()を省略できるんでしょうか?
もし省略できるのなら、提示されたコードを省略なしに書くと
となります。 このコードが意味するところは、「Text1にフォーカスを移動し、移動できたらText1の入力内容を、ABCDEFGにし、移動できなければ(めんどいので以下略)」、となります。 おそらく、望まれているコードは、
でしょう。きっと。 | ||||||||
|
投稿日時: 2007-10-26 15:03
Tdnr_Symさん、解答ありがとうございました。
早速プロパティの方を If Text1.Focus = True Then → If Text1.Focused = True Then に修正しテストしますと正常に動作しました。それにしてもなぜ 「Text1.Focus」でエラーにならなかったのか分りませんが 見事に解決いたしました。このことは、おそらく忘れることはない と思います。ありがとうございました。 | ||||||||
|
投稿日時: 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が設定できるのでしょうか。 とりあえず、おかげさまで問題解決いたしました。 | ||||||||
|
投稿日時: 2007-10-26 15:33
もちろん、メソッドに値を設定することは出来ません。 ですが、Contro.Focus() メソッドは bool 型の戻り値を返します。 ということは、戻り値は true か false のどちらかであることは明らかです。 そして、VB の構文では比較の記号は = であるため
となるのでしょう。これはまぁ妥当な動作なんじゃないでしょうか。 | ||||||||
|
投稿日時: 2007-10-26 16:33
「なぜ『Text1.Focus』でエラーにならなかったのか」を理解しない まま突き進んでしまうと、また同じようなところでつまづく可能性が あります。 そしてだんじりさんの過去の投稿を拝見すると、その確率が非常に 高いと思います。 元のコードに書かれた Text1.Focus(継承されているので、元は Control.Focus() )は、渋木さんが書かれているとおり Boolean 型の戻り値を返します。 そしてそれは MSDN を見るとちゃんと書いてあります。 なぜエラーにならないのかと言われれば、Control.Focus() が戻 り値を返すタイプのメソッドであるからに他ならないわけですが、 Focus() がどういった動きをするのかを知っていれば 「なぜ『Text1.Focus』でエラーにならなかったのか」という疑問 は出てこないはずです。 今回のコードの原因は「 Control.Focus() と Focused を混同し ていた」ことだと思うのですが、これも Focus() を使おうとした 時点でMSDN で確認しておけば質問するほどの問題にならずに済 んだのではないでしょうか。 まずは MSDN を真っ先に見る習慣をつけてください。そして正しい 構文を頭の中に叩き込むようにしてください。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 |