こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

前回、同じようなプログラムを簡単にまとめる方法を教えて頂いたのですが新しい事で困ってしまいました。

説明が非常にへたくそなので、プログラムをそのまま書きます・・・・
スイマセン


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

投稿日時 - 2012-11-02 18:22:00

QNo.7778496

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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)

投稿日時 - 2012-11-08 22:01:55

ANo.5

ANo.2の追記)
100 個のハンドラは,AddHandler のコードをT4 Text Templateで生成した方が楽かもしれません。
# 1個ずつフォームから設定しても良いですが……。

MSDN: T4 テキスト テンプレートを使用したデザイン時コード生成
http://msdn.microsoft.com/ja-jp/library/dd820620.aspx
上記のMSDNは出力がC#コードですが,当然出力をVBとすることもできます。

投稿日時 - 2012-11-06 17:49:28

ANo.4

>これをRedimとかRedim Preaserveで確保していく。


間違えた!

というか補足です。

使う場合にSetで割当してやらないと使用できません。それを補足しておきます。

投稿日時 - 2012-11-06 17:09:20

ANo.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

っていう風にできるし。


使用するコンポーネントの数が多くなるとか不定の場合、私はこういう方法を使いますが・・・どうですかね?


それと、あんまりコードをまんま載せるのって良くないと思うけど・・・。そういうのって「丸投げ」する人がよくやるんで・・・。

投稿日時 - 2012-11-06 17:07:01

ANo.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

投稿日時 - 2012-11-03 12:38:57

ANo.1

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

投稿日時 - 2012-11-02 18:42:50