C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: テキスト全選択


(過去ログ 112 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■66174 / inTopicNo.1)  テキスト全選択
  
□投稿者/ p-ecot (1回)-(2013/04/05(Fri) 17:53:20)

分類:[VB.NET/VB2005 以降] 

テキストボックスのフォーカスを離れると全選択するような処理をしたいのですが、VB6では上手くいきますが
.Netだとうまくいきません。変換ツールを使用しても上手くいきません。
お解りの方、ご存知の方回答よろしくお願いします。

VB6のソースは下記の通りです
Private Sub txt1_GotFocus()
txt1.SelStart = 0
txt1.SelLength = Len(txt1.Text)
End Sub


ちなみに、.Netなので複数のテキストボックスの処理をひとつにまとめたいです。
そちらの方もよろしくお願いします。

Private Sub SubGotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus

Dim zz As TextBox = DirectCast(sender, System.Windows.Forms.TextBox)
Dim qq As Integer = zz.SelectionLength

End Sub

引用返信 編集キー/
■66176 / inTopicNo.2)  Re[1]: テキスト全選択
□投稿者/ LL (2回)-(2013/04/05(Fri) 18:47:39)
GotFocusイベントはコントロールがフォーカスを受け取ると発生するので
コントロールのフォーカスを離れる時に派生するのはLostFocusイベントだと思うのですが。。。

ちなみにテキストボックスのプロパティの名前は以下の名前に変わっています

SelStart → SelectionStart
SelSelLength → SelectionLength


次に複数のテキストボックスの処理をひとつにまとめる部分ですが

Private Sub SubGotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus

Dim zz As TextBox = DirectCast(sender, System.Windows.Forms.TextBox)
Dim qq As Integer = zz.SelectionLength

End Sub

これはこれで一種のまとめ方として成立しているように思えます
TextBox1.GotFocus と TextBox2.GotFocus のイベントを
ひとつのイベントプロシージャで処理するようにまとまっています。
そうではなくて可変個のコントロールのイベントを実行時に動的にまとめたいということであれば
AddHandler ステートメント 、RemoveHandler ステートメント を使用して
実行時にイベントプロシージャとイベントを関連付けたり解除したりさせればOKかと

或いはTextBoxを継承して新たな機能を付与したコントロールを作るという方法もありますね。

引用返信 編集キー/
■66177 / inTopicNo.3)  Re[1]: テキスト全選択
□投稿者/ 魔界の仮面弁士 (192回)-(2013/04/05(Fri) 18:50:03)
No66174 (p-ecot さん) に返信
> テキストボックスのフォーカスを離れると全選択するような処理をしたいのですが
> Private Sub txt1_GotFocus()
逆ですよね? 離れたときなら LostFocus の筈ですし。


> ちなみに、.Netなので複数のテキストボックスの処理をひとつにまとめたいです。
この構文は…VB2008以下のバージョンのようですね。
今回の場合は「DirectCast(sender, TextBox).SelectAll()」を呼び出すのが良いでしょう。


> Dim qq As Integer = zz.SelectionLength
これって、選択された文字数を「設定」しているのではなく、
現在の選択されている文字数を「取得」しているだけですよね?


> .Netだとうまくいきません。
まず、GotFocus/LostFocus の利用は避けましょう。
TextBox の Enter イベントに対して、こんな感じで如何でしょうか。

  DirectCast(sender, TextBox).SelectAll()
  'If MouseButtons <> System.Windows.Forms.MouseButtons.None Then
  '    BeginInvoke(New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAll))
  'End If

コメントを外した場合、マウスクリックでのフォーカス移動時の動作が変わります。

引用返信 編集キー/
■66209 / inTopicNo.4)  Re[2]: テキスト全選択
□投稿者/ p-ecot (1回)-(2013/04/09(Tue) 14:31:14)
LLさん、魔界の仮面弁士さんありがとうございました。

DirectCast(sender, TextBox).SelectAll()
If MouseButtons <> System.Windows.Forms.MouseButtons.None Then
BeginInvoke(New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAll))
End If

上記の内容を今度は、クラス内でやろうとしたら、BeginInvokeで「式はメソッドではありません」というエラーメッセージが出てきます。
Imports System.Windows.Forms.Controlや引数として、ByVal BeginInvoke As System.IAsyncResultなど試してみましたが波線が消えません
クラスでやる場合、問題があるのでしょうか?


よろしくお願いします。
引用返信 編集キー/
■66210 / inTopicNo.5)  Re[3]: テキスト全選択
□投稿者/ howling (339回)-(2013/04/09(Tue) 14:53:55)
No66209 ( p-ecot さん) に返信

こんにちわ。

> 上記の内容を今度は、クラス内でやろうとしたら、BeginInvokeで「式はメソッドではありません」というエラーメッセージが出てきます。
> Imports System.Windows.Forms.Controlや引数として、ByVal BeginInvoke As System.IAsyncResultなど試してみましたが波線が消えません
> クラスでやる場合、問題があるのでしょうか?

魔界の仮面弁士さんのソースを見ましたが、特に問題は無さそうでした。
何か引数とか間違ったりしてませんか?分割して考えてみるといいかもしれません。

以下は念のため。


BeginInvoke(New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAll))

まず、BeginInvokeの引数はdelegateですね。
http://msdn.microsoft.com/ja-jp/library/0b1bf3y3(v=vs.80).aspx

DirectCast(sender, TextBox)で、senderをTextBoxにキャストしています。TextBoxはちゃんと来てますか?

TextBoxBase.SelectAllメソッドはしっかりあるようですね。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.textboxbase.selectall.aspx

そして、このメソッドのアドレスをMethodInvokerの引数に指定している。大丈夫そうです。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.methodinvoker(v=vs.80).aspx

でも、エラー内容からすると、BeginInvokeの引数がおかしいようですね。
とすると、何かしらそのあたりがおかしいということになります。
一旦、New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAllだけ取り出してみるといいかもしれません。
おそらくそこでエラーが出るはずですので。
引用返信 編集キー/
■66211 / inTopicNo.6)  Re[3]: テキスト全選択
□投稿者/ ニチェ (2回)-(2013/04/09(Tue) 14:55:21)
2013/04/09(Tue) 15:11:10 編集(投稿者)

BeginInvokeは、コントロールのメソッドです。
これは、実際にはMe.BeginInvoke(MeがフォームならばフォームのBeginInvoke)のMe.が省略されていると思ってください。

なので、クラスでそれを行いたい場合は、クラス内でBeginInvokeを行うコントロールを参照し、
そのコントロールに対してBeginInvokeをする必要があります。
(あとは、その「クラス」とやらがどう設計されているかにもよりますが。BeginInvokeする必要性もよく考えてください。)
引用返信 編集キー/
■66212 / inTopicNo.7)  Re[4]: テキスト全選択
□投稿者/ howling (340回)-(2013/04/09(Tue) 15:15:11)
補足?です。

クラス内でやろうとしたら、とありますが、
ニチェさんの話は、これをどこでやろうとしたかによって変わります。

魔界の仮面弁士さんが書いている通り、

「TextBox の Enter イベントに対して」とありますので、
これは今回全選択したいTextBox内にEnterイベントメソッドを作成して、その中で書くことを前提としています。

p-ecotさんがもしこの場所でソースを書いたのであれば、
ニチェさんの話はスルーしてしまって問題ないと思いますが、
そうでないなら、まずはEnterイベントで行ってみてはいかがでしょうか。
(どこでもやろうと思えばできますがね)
引用返信 編集キー/
■66213 / inTopicNo.8)  Re[5]: テキスト全選択
□投稿者/ ニチェ (3回)-(2013/04/09(Tue) 16:35:24)
2013/04/09(Tue) 16:38:10 編集(投稿者)

No66212 (howling さん) に返信

勝手に私のコメントをスルーさせるようなことはしないでください。

BeginInvokeに「式はメソッドではありません」というエラーが出ているということは、
BeginInvokeという変数を定義しているのだと推測します。
なので、BeginInvokeが何なのか理解していないのではないかと推測するわけです。

推測するに、新たなクラスを作成し、ここのコードにBeginInvokeなるものを書いたものの、
「BeginInvokeは定義されていません」というエラーが出たため、BeginInvokeなる変数を定義してしまい、
「式はメソッドではありません」というエラーが出たものと推測します。
(Formのクラス内にBeginInvokeのメソッドを書いている間は、そもそもこのようなことは起こらなかったのでは、と考えます。
 他のTextBoxも同じようにしたい、ということなので、何らかのクラスを作成したということは十分考えられます。)

これらは推測の域を出ていませんが、質問者の提示内容から読み取れることはこれが限界でしょう。
でも、質問者はBeginInvokeについてよく理解していないであろうことを回答者は把握すべきであり、
内容をよく読んだ上で回答することが回答者のすべきことと思います。

@ハウリングさんは、質問でも回答でも見切り発車のような傾向が散見されますが、
 もう少し冷静になってみては如何でしょうか。
引用返信 編集キー/
■66215 / inTopicNo.9)  Re[6]: テキスト全選択
□投稿者/ howling (341回)-(2013/04/09(Tue) 17:25:36)
No66213 (ニチェ さん) に返信

> 勝手に私のコメントをスルーさせるようなことはしないでください。

すみません、確かに横から何かするのは良くないですね。こちらは失礼しました。

> BeginInvokeに「式はメソッドではありません」というエラーが出ているということは、
> BeginInvokeという変数を定義しているのだと推測します。
> なので、BeginInvokeが何なのか理解していないのではないかと推測するわけです。

はい、おそらく理解できていないのではないか?と推測されるのはわかります。
ですから補足ですし、「こうやっている場合なら大丈夫ですよ」と書いているのです。
また、わかるようにリファレンスのURLも書いているのはそのためです。

> 推測するに、新たなクラスを作成し、ここのコードにBeginInvokeなるものを書いたものの、
> 「BeginInvokeは定義されていません」というエラーが出たため、BeginInvokeなる変数を定義してしまい、
> 「式はメソッドではありません」というエラーが出たものと推測します。
> (Formのクラス内にBeginInvokeのメソッドを書いている間は、そもそもこのようなことは起こらなかったのでは、と考えます。
>  他のTextBoxも同じようにしたい、ということなので、何らかのクラスを作成したということは十分考えられます。)

はい、それも推測できると思います。
ですので、おそらくはTextBoxを継承したクラスではなく、別のクラス内でやっていることかと思います。
ならば説明として、Controlと書くべきではないと思いますよ。
リファレンスを張った通り、SelectAllメソッドはTextBoxBaseの話です。
もちろん今回はBeginInvokeだけが問題なんだから、そこだけどうにかすれば良いだろう、と言うのなら止めません。
ですが、それでControlにして次に飛んでくる質問はSelectAllメソッドの話だと推測できませんか?

正直、ここはこうだからダメ、というのを教えるよりは、
理解できるのであればリファレンスでどう定義されていますよ、というのを見せる方が良いかと思います。

> これらは推測の域を出ていませんが、質問者の提示内容から読み取れることはこれが限界でしょう。
> でも、質問者はBeginInvokeについてよく理解していないであろうことを回答者は把握すべきであり、
> 内容をよく読んだ上で回答することが回答者のすべきことと思います。

「きっとそうだから」で物事は書くべきではないと思います。それって推測でしかないですから。
ですから、「もし○○している場合だったらこうしてね」と書く方が正しいのではないでしょうか。

> @ハウリングさんは、質問でも回答でも見切り発車のような傾向が散見されますが、
>  もう少し冷静になってみては如何でしょうか。

これ自体はあまり良くないことなのかもしれないですが、
「こうやるべきだ」とか、「こうやってください」と断定してしまうのはどうかと。
そのため、断定しない書き方は心がけています。
私の場合はこうやって解決しましたよ、という言い方はしますが、
だからといって同じ手法を取るべきだなんてとても言えない技量しかないと思っています。

「あ、こうなんだ!」と早合点してしまうことは確かによくありますので、そこは自分でも直していきたい部分です。
こちらはおっしゃる通り見切り発車になっていると思いますので、改善していきたいと思います。

# ただ、今回の回答内容は見直してみて頂けると幸いです。
# どちらが勝手に見切ったつもりになっているかは、それでわかると思います。失礼。
引用返信 編集キー/
■66222 / inTopicNo.10)  Re[7]: テキスト全選択
□投稿者/ ニチェ (4回)-(2013/04/09(Tue) 20:20:13)
No66215 (howling さん) に返信

「見切り発車」の発言は不適切でしたね。ごめんなさい。
ただし、「見切り発車」ではなく、記載内容をよく理解していないのではないでしょうか?

> ならば説明として、Controlと書くべきではないと思いますよ。
> リファレンスを張った通り、SelectAllメソッドはTextBoxBaseの話です。
> もちろん今回はBeginInvokeだけが問題なんだから、そこだけどうにかすれば良いだろう、と言うのなら止めません。
> ですが、それでControlにして次に飛んでくる質問はSelectAllメソッドの話だと推測できませんか?

どうしてこのような意見が出てくるのか理解できません。
私は不適切なControlの説明をした覚えはありません。
また、TextBox(または基底のTextBoxBase)に関する説明をした覚えもありませんし、SelectAllメソッドの説明もしたつもりはありません。
あなたの言うControlの説明とは、

> BeginInvokeは、コントロールのメソッドです。
> これは、実際にはMe.BeginInvoke(MeがフォームならばフォームのBeginInvoke)のMe.が省略されていると思ってください。
> (以下略)

のコントロールの文言のことを指しているのでしょうか?
これは、コード

> BeginInvoke(New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAll))

のBeginInvokeのメソッドが何のメソッドかを説明しているわけで、ちゃんと読んで頂ければTextBox(あるいは基底のTextBoxBase)のことを
説明しているのではないことに気づくと思うのですが、どの観点で「Controlと書くべきではない」と思ったのかご教示頂けますか?

私の投稿内容をよく理解した上で「スルーしてもいい」というのであれば結構なことなのですが、
人の投稿内容をよく読みもせず、このようなことをされることは非常に不愉快です。
引用返信 編集キー/
■66228 / inTopicNo.11)  Re[8]: テキスト全選択
□投稿者/ howling (346回)-(2013/04/10(Wed) 11:30:09)
2013/04/10(Wed) 12:53:27 編集(投稿者)

No66222 (ニチェ さん) に返信
> 「見切り発車」の発言は不適切でしたね。ごめんなさい。
> ただし、「見切り発車」ではなく、記載内容をよく理解していないのではないでしょうか?

いいえ、これはおっしゃる通りだと思う部分がありますから、特に気にしていません。

> どうしてこのような意見が出てくるのか理解できません。
> 私は不適切なControlの説明をした覚えはありません。
> また、TextBox(または基底のTextBoxBase)に関する説明をした覚えもありませんし、SelectAllメソッドの説明もしたつもりはありません。

ですから、不適切なControlの説明はしていないと思いますよ。
ただ、ここではControlと書くよりも、少なくともTextBoxBaseより上の継承クラスを書くべきだと思いました。
Controlの継承クラスを使っても、別のところで(SelectAllですね、今回は)問題が出てしまうのは明らかだったからです。

> 私の投稿内容をよく理解した上で「スルーしてもいい」というのであれば結構なことなのですが、
> 人の投稿内容をよく読みもせず、このようなことをされることは非常に不愉快です。

いやいや、だからどう書いていますか?
「スルーしてもいい」ところだけピックアップされても困ります。
よく読んでください、お願いですから。

>「TextBox の Enter イベントに対して」とありますので、
>これは今回全選択したいTextBox内にEnterイベントメソッドを作成して、その中で書くことを前提としています。

>p-ecotさんがもしこの場所でソースを書いたのであれば、
>ニチェさんの話はスルーしてしまって問題ないと思いますが、

こう書きましたよね?
「この場所で」と書いていますが、
「TextBox内でEnterイベントを作成し、そのEnterイベントの中で」というのがそれを指しています。
ですから、そこで書いたならスルーしても問題ないと思いますよと。
そこで書いていないならスルーするべきではない、という意味でもあるんですよ?
これはニチェさんの話を理解できていませんか?


…ところで、できれば場所を変えるか、失礼になってしまいますが、この話はそろそろ終えたいと思っています。
勝手に横から「スルーしても問題ない」と書いてしまったことはお詫びします。申し訳ありません。
ただ、これ以上このスレッドが荒れてしまうことは避けるべきだと思っています。
もし、謝りが足りないというのであれば、どこか別の場所でそれは話しますから、
できれば一旦引いて頂けないでしょうか。ご検討ください。
引用返信 編集キー/
■66233 / inTopicNo.12)  Re[9]: テキスト全選択
□投稿者/ ニチェ (5回)-(2013/04/10(Wed) 12:32:07)
No66228 (howling さん) に返信

> ただ、ここではControlと書くよりも、少なくともTextBoxBaseより上の継承クラスを書くべきだと思いました。
> Controlの継承クラスを使っても、別のところで(BeginInvokeですね、今回は)問題が出てしまうのは明らかだったからです。

もしかしたら、あなたは例示された

> BeginInvoke(New MethodInvoker(AddressOf DirectCast(sender, TextBox).SelectAll))

のBeginInvokeがTextBoxやTextBoxBaseのメソッドだと勘違いしていませんか?

私の回答は、上記のようにBeginInvoke(引数)と書いた場合は、Me.が省略されていること、つまり、Me.に該当する
コントロールのメソッドであるということを書いているに過ぎません。
(Me.がフォームなら、フォームのメソッドであるということになります。)

No.66209 の質問の本質に対する回答として、TextBoxやTextBoxBaseは直接関係ありませんので、
私はTextBoxやTextBoxBaseに言及する理由が全くないのです。

No.66209 の質問文には、

> 上記の内容を今度は、クラス内でやろうとしたら、BeginInvokeで「式はメソッドではありません」という
> エラーメッセージが出てきます。

とありますが、あなたは「式はメソッドではありません」というエラーが出て困っているという質問者に対して、
「式はメソッドではありません」に対するアドバイスをなにかされましたか?
もちろん、あなたが引数の内容について検証されたことについては素晴らしいことだと思いますが、
「式はメソッドではありません」がどういう状況で発生するのかという本質に着目しなかったことが、
あなたのミスリードの原因のようにも思います。

もし、あなたが例示コードのBeginInvokeがTextBoxやTextBoxBaseのメソッドだと勘違いしていなかったら、
あなたも「TextBoxBaseクラスについて書くべき」などという戯言を発言することもなかったでしょうし、
「よく読め」という私の暴言もなかったでしょう。
よく理解している人が「これはスルーしてもよい」と書くのは別にかまわないのですが、勘違いをしている人が
人のアドバイスに対して判断を決定するのはとても怖いことです。

私もこのスレッドに書き込みをしたくはないのですが、ここで私が書き込みを放棄すると、BeginInvokeの箇所で
「式はメソッドではありません」というエラーという質問の本質とこの解決方法が埋もれてしまいそうで、
このスレッドが何の役に立たないゴミスレッドになってしまうのは嫌なので、あえて書き込ませて頂きました。
引用返信 編集キー/
■66234 / inTopicNo.13)  Re[10]: テキスト全選択
□投稿者/ howling (348回)-(2013/04/10(Wed) 12:52:42)
No66233 (ニチェ さん) に返信

すみません、これはNo66228で私がミスって書いてますね。
BeginInvokeはControlのメソッドですね。
SelectAllがTextBoxBaseのメソッドですね。
(BeginInvokeですね、今回は)→(SelectAllですね、今回は)
要は純粋にBeginInvokeだけの話をするべきではないのです、ということなんですが、もう良いです。
一応そこだけ編集しときます。

> よく理解している人が「これはスルーしてもよい」と書くのは別にかまわないのですが、勘違いをしている人が
> 人のアドバイスに対して判断を決定するのはとても怖いことです。

じゃあそれでいきましょう。とても怖いことをしていましたね。私の発言はスルーしてください。

> 私もこのスレッドに書き込みをしたくはないのですが、ここで私が書き込みを放棄すると、BeginInvokeの箇所で
> 「式はメソッドではありません」というエラーという質問の本質とこの解決方法が埋もれてしまいそうで、
> このスレッドが何の役に立たないゴミスレッドになってしまうのは嫌なので、あえて書き込ませて頂きました。

了解しました。
引用返信 編集キー/
■66235 / inTopicNo.14)  Re[11]: テキスト全選択
□投稿者/ p-ecot (2回)-(2013/04/10(Wed) 13:28:28)
LLさん、魔界の仮面弁士さん、ニチェさん、howlingさんありがとうございました。
無事解決しました。

また、色々ご迷惑をおかけすると思いますがよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -