- ベストアンサー
VB2008、文字色について教えて下さい(再投稿)
先ほど、同じ質問をさせて頂き良回答を頂きました。 教えて頂いたコードで問題が解決したと思いましたが、検証を続けていく内に不具合が発生してしまいました。RichTextBoxとそれに対応するButtonが一つずつなら全く問題はなかったのですが、複数になってしまうと先のRichTextBoxに代入したTextBoxの文字色が黒色に戻ってしまいます。回答者様には本当に失礼だと思いますが再度質問をさせて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
チェック関数の中でチェックするTextBoxを適切なものにしてやればいいのではないかと思います そのためには 第二引数を Control.ControlCollection型ではなく Microsoft.VisualBasic.Collection型もしくは Windows.Forms.Contolの配列に変更したほうがいいでしょう 呼び出し側で Microsoft.VisualBasic.Collection型を使用する場合 dim ctls as Control() = { TextBox1, TextBox2, TextBox3 } dim cc as new Collection for each ctl as Control in ctls cc.add( ctl ) next containString( RitchTextBox1.Text, cc ) Windows.Forms.Contolの配列を使用する場合 dim ctls as Control() = { TextBox1, TextBox2, TextBox3 } containString( RitchTextBox1.Text, ctls ) といった具合です
その他の回答 (3)
- AlexSuns
- ベストアンサー率67% (78/115)
こうなるのでは? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click containString(Me.RichTextBox1.Text, New TextBox() {TextBox1, TextBox2, TextBox3}) Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click containString(Me.RichTextBox2.Text, New TextBox() {TextBox4, TextBox5, TextBox6}) ここかからは、前回の回答を踏まえてのアドバイス 1.フォーム上にグループボックスまたはパネル等のコンテナを配置する とりあえずここではグループボックス(GroupBox1)とする 2.グループボックスにTextBox1、TextBox2、TextBox3を配置する 3.メソッドの呼出を下記のようにする containString(Me.Me.RichTextBox1, Me.GroupBox1.Controls) 4.TextBox4、TextBox5、TextBox6も同様にグループボックスに配置し メソッドの呼出を下記のようにする containString(Me.Me.RichTextBox2, Me.GroupBox2.Controls) デザイン等も重要です お礼ポイントなどは、対応してくれたredfox63さん、Wizard_Zeroさんにどうぞ
お礼
AlexSuns様、redfox63 様、Wizard_Zero 様、私のような初心者に親身になって頂きありがとうございます。今回、皆さんに教えて頂いたことは、どれも非常に勉強になる内容でした。まだまだプログラムというものに触れたばかりの初心者ですが、皆さんのような親切な方にご助言頂けたことに本当に感謝しています。また質問させて頂くこともあると思いますが、その際も何卒よろしくお願いいたします。
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
横から失礼します。 コレクションにこだわらず、思い切ってIListで受け取ってしまえばトラブルも少なくなるかと。IListなら、コレクションでも配列でも、どちらでも渡せるようになります。 Private Sub containString(ByVal baseString As String, ByVal cc As System.Collections.IList) For Each item As Object In cc ' item が TextBox の場合 If TypeOf item Is TextBox Then Dim txt As TextBox = CType(item, TextBox) If baseString.Contains(txt.Text) Then txt.ForeColor = Color.Red Else txt.ForeColor = Color.Black End If End If ' item が Control の場合 If TypeOf item Is Control Then Dim ctl As Control = CType(item, Control) 'コンテナになっていたら再帰処理 If ctl.Controls.Count > 0 Then containString(baseString, ctl.Controls) ' ← ここではコレクションで渡している End If End If Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click containString(Me.RichTextBox1.Text, New TextBox() {TextBox1, TextBox2, TextBox3}) ' ←ここでは配列で渡している End Sub ControlsもTextBox配列も、ともにSystem.Collection.IListインターフェイスを実装するオブジェクトですので、どちらでも引数で渡せます。IList自体はObjectの集合体なので、For EachはControlではなくObjectでまわすようにします。
補足
Wizard_Zero 様いつもありがとうございます。 教えて頂いたコードを使用しましたが、先に回答頂いた方と同じく他のRichTextBoxに代入作業を行うと、先のRichTextBoxに代入されたTextBoxの文字が黒色に戻ってしまいます。下記のようなコードにあいてみましたがどこが間違っているのでしょうか? Private Sub containString(ByVal baseString As String, ByVal cc As System.Collections.IList) For Each item As Object In cc If TypeOf item Is TextBox Then Dim txt As TextBox = CType(item, TextBox) If baseString.Contains(txt.Text) Then txt.ForeColor = Color.Red Else txt.ForeColor = Color.Black End If End If Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click containString(Me.RichTextBox1.Text, New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6}) Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click containString(Me.RichTextBox2.Text, New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6}) これだと、Button1を押したときにTextBox1,TextBox2,TextBox3をRichTextBox1に代入した場合、TextBox1,TextBox2,TextBox3の文字色は赤色に変わり、RichTextBox1からTextBox2のTextを削除すればTextBox2の文字色は黒色に戻ります。しかし、続けてButton2を押してTextBox4,TextBox5,TextBox6をRichTextBox2に代入すると、先に実行したTextBox1,TextBox3の文字も黒色に戻ってしまいます。私の使用方法に間違いがありましたらお教え頂けると助かります。
- redfox63
- ベストアンサー率71% (1325/1856)
単なるタイプミスのようですよ RitchTextBox1ではなく RichTextBox1に変更してみてください
補足
何度もご回答頂きありがとうございます。訂正してみたところ、 containString(baseString, ctl.Controls)部分のctl.Controlsがエラーになってしまいました。どうやらMicrosoft.VisualBasic.Collection型には含まれない表現のようです。現在のコードは以下のとおりです。 Private Sub containString(ByVal baseString As String, ByVal cc As Microsoft.VisualBasic.Collection) For Each ctl As Control In cc If TypeOf ctl Is TextBox Then Dim txt As TextBox = CType(ctl, TextBox) If baseString.Contains(txt.Text) Then txt.ForeColor = Color.Red Else txt.ForeColor = Color.Black End If End If 'コンテナになっていたら再帰処理 If ctl.Controls.Count > 0 Then containString(baseString, ctl.Controls)←エラー箇所 End If Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ctls As Control() = {TextBox1, TextBox2, TextBox3} Dim cc As New Collection For Each ctl As Control In ctls cc.Add(ctl) Next containString(RichTextBox1.Text, cc) Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim ctls As Control() = {TextBox1, TextBox2, TextBox3} Dim cc As New Collection For Each ctl As Control In ctls cc.Add(ctl) Next containString(RichTextBox2.Text, cc)
お礼
redfox63様、ご回答頂きありがとうございます。 Microsoft.VisualBasic.Collection型を使用し、 Private Sub containString(ByVal baseString As String, ByVal cc As Control.ControlCollection) For Each ctl As Control In cc If TypeOf ctl Is TextBox Then Dim txt As TextBox = CType(ctl, TextBox) baseString.Contains(txt.Text) Then txt.ForeColor = Color.Red Else txt.ForeColor = Color.Black End If End If If ctl.Controls.Count > 0 Then containString(baseString, ctl.Controls) End If Next End Sub として、読み出し側で dim ctls as Control() = { TextBox1, TextBox2, TextBox3 } dim cc as new Collection for each ctl as Control in ctls cc.add( ctl ) next containString( RitchTextBox1.Text, cc ) としてみましたが、最終行のRitchTextBox1が宣言されていませんになってしまいます。正直、私には内容が高度過ぎてどこをどうすれば良いか分からなくなってしまいました。もしお時間があれば後学のためにも教えて頂けると幸いです。