• 締切済み

簡単なプログラムにまとめる方法

前回、同じようなプログラムを簡単にまとめる方法を教えて頂いたのですが新しい事で困ってしまいました。 説明が非常にへたくそなので、プログラムをそのまま書きます・・・・ スイマセン Private Sub TextBox1_1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1_1.GotFocus Me.TextBoxNum.Text = "1" End Sub Private Sub TextBox2_1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2_1.GotFocus Me.TextBoxNum.Text = "2" End Sub Private Sub TextBox3_1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox3_1.GotFocus Me.TextBoxNum.Text = "3" End Sub 上記のプログラム、TextBox○○○_1.KeyPressの○○○の部分が1から100まであるのですが、あまりにも行数が多くなって長くなるので、以下のプログラムで纏めたのですが、 Me.TextBoxNum.Text = "○○○" にフォーカスされたTextBox○○○_1の○○○を入れる方法はありますか? Private Sub TextBox1_1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1_1.GotFocus,TextBox2_1.GotFocus,TextBox3_1.GotFocus Me.TextBoxNum.Text = "○○○" End Sub 説明が下手くそでスイマセン、ほかに新しい方法でも有ればお願いします よろしくお願いしますm(__)m

みんなの回答

  • angel_Z
  • ベストアンサー率66% (12/18)
回答No.6

こんなのはどうでしょうか? 思い違いでしたらすいません。 Imports VB = Microsoft.VisualBasic Private Sub All_GotFocus(Byval ctrl As Control) 'ctrlに1つ以上の子コントロールが格納されている時 If ctrl.HasChildren Then Call Event_Set(Me) End If End Sub Private Sub AllControl_GotFoccus(Byval sender As Object, Byval As System.EventArgs) 'senderをctrlにキャスト Dim ctrl As TextBox = Ctype(sender, TextBox) 'ctrlのTextBoxから余分な文字を置換して、番号を取得 Dim txt_num As String = System.Text.RegularExpressions.Regex.Replace(Replace(ctrl.Name,"TextBox", ""), "_.*", "") '取得した番号を格納 Me.TextBoxNum.Text = txt_num End Sub Private Function Event_Set(Byval Ctrl As Control)As Control() Dim buf As ArrayList = New ArrayList 'Ctrl内のすべてのコントロールを列挙する For Each C As Control In Ctrl.Controls '親から子、孫まで取得 buf.Add(C) '末尾に追加 buf.AddRange(Event_Set(C)) 'コントロール名の取得 '取得したコントロールがTextBoxの時 If TypeOf C Is TextBox Then If VB.Left(C.Name, 7) = "TextBox" Then Dim txt_num As String = System.Text.RegularExpressions.Regex.Replace(Replace(ctrl.Name,"TextBox", ""), "_.*", "") If CInt(txt_num)>=1 and CInt(txt_num)<=100 Then 'イベントAllCntrol_GotFocusのセット AddHandler C.GotFocus, AddressOf AllControl_GotFocus End If End If End If Next Return Ctype(buf.ToArray(GetType(Control)), Control()) '配列格納 End Function Form_Loadの時 Call All_Got_Focus(Me)

すると、全ての回答が全文表示されます。
回答No.5

ANo.2の追記) 100 個のハンドラは,AddHandler のコードをT4 Text Templateで生成した方が楽かもしれません。 # 1個ずつフォームから設定しても良いですが……。 MSDN: T4 テキスト テンプレートを使用したデザイン時コード生成 http://msdn.microsoft.com/ja-jp/library/dd820620.aspx 上記のMSDNは出力がC#コードですが,当然出力をVBとすることもできます。

すると、全ての回答が全文表示されます。
  • kaoaru
  • ベストアンサー率33% (42/127)
回答No.4

>これをRedimとかRedim Preaserveで確保していく。 間違えた! というか補足です。 使う場合にSetで割当してやらないと使用できません。それを補足しておきます。

すると、全ての回答が全文表示されます。
  • kaoaru
  • ベストアンサー率33% (42/127)
回答No.3

>TextBox○○○_1.KeyPressの○○○の部分が1から100まで ということは、実際に100個貼り付けたワケですね? あんまり好ましくないけど・・・。 TextBoxを動的に確保して、コードで処理したほうがいいかもね!表示位置もTwip数で制御しやすいし。 フォームの先頭で private TextCtrl() as Contorol とか private TextCtrl() as Object とかすれば変数にできる。 これをRedimとかRedim Preaserveで確保していく。 これならば構造体の配列変数のようにアクセスできてやりやすいと思うけど・・・。 たとえばTextBoxを全部クリアするんなら For i=1 to 100 TextCtrl(i).Text="" Next っていう風にできるし。 使用するコンポーネントの数が多くなるとか不定の場合、私はこういう方法を使いますが・・・どうですかね? それと、あんまりコードをまんま載せるのって良くないと思うけど・・・。そういうのって「丸投げ」する人がよくやるんで・・・。

すると、全ての回答が全文表示されます。
回答No.2

senderにイベントを発生させたオブジェクトが渡されますので,それをキャストして利用します。 DirectCast(sender, Control).Text = "○○○" ※GotFocusイベントの使用は推奨されません。Enterイベントを使いましょう。 MSDN: Control.GotFocus イベント (System.Windows.Forms) http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.gotfocus

すると、全ての回答が全文表示されます。
  • tsunji
  • ベストアンサー率20% (196/958)
回答No.1

VB6なら、TextBoxをインデックス化するのが楽だけどね。

すると、全ての回答が全文表示されます。

関連するQ&A