- ベストアンサー
VB2005ExpressEditionでコマンドボタンとテキストボックスの変数化
- VB2005ExpressEditionでコマンドボタンとテキストボックスの変数化を行う方法について教えてください。
- 約80組のコマンドボタンとテキストボックスを並べ、クリックさせる関数を作成しようとしています。
- ボタンやテキストボックスの名前を変数化して、繰り返し処理を省略したいです。アイデアを教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
やっぱりですか?(^^;)了解です。以下ルールとします。 1.ButtonXXと対になるのはTextBoxXXというルールとする。 (1~任意の数) 2.欠番は無いものとする。 フォームロードを下のように書き換えて下さい。 Dim btn As Button Dim txt As TextBox Dim no As Integer = 1 On Error Resume Next Do Until Err.Number <> 0 txt = Me.Controls.Item("TextBox" & no) btn = Me.Controls.Item("Button" & no) If txt IsNot Nothing AndAlso btn IsNot Nothing Then ctlList.Add(New CtrlSet(btn, txt)) txt = Nothing : btn = Nothing End If no = no + 1 Loop On Error GoTo 0
その他の回答 (2)
- pen_pen_pen
- ベストアンサー率65% (52/79)
環境が無く正確な例はかけないのですが、イメージで。 'ボタンとテキストのペアを表す構造体を定義 Private Structure CtrlSet Public btn As Button Public txt As TextBox Sub New(iBtn As Button, iTxt As TextBox) btn = iBtn txt = iTxt End Sub End Structure 'ボタンとテキストのペアを格納するリストを宣言 Private ctlList As List(Of CtrlSet) 'ロードイベント Private Sub Form1_Load() Handles Me.Load ctlList = New List(Of CtrlSet) '80組のボタンとテキストをリストに保存 ctlList.Add(New CtrlSet(Button1, TextBox1)) ctlList.Add(New CtrlSet(Button2, TextBox2)) ・・・ ctlList.Add(New CtrlSet(Button80, TextBox80)) End Sub '一つのコマンドボタンをクリックすると、のクリックイベント Sub ボタン_Click() Handles ボタン.Click Dim ctlSet As CtrlSet '全部のペアをclk関数に渡す For Each ctlSet In ctlList clk(ctlSet.btn, ctlSet.txt) Next End Sub
補足
お返事ありがとうございます。 返信が遅くなってすみませんでした。 私が一番困っているのは 「'80組のボタンとテキストをリストに保存」 コード内の「・・・」の部分を省略する方法です。 今はボタンが80個なんですが、いずれ150以上までは拡張するつもりです。 自動的に「・・・」の部分を拡張できる方法を探しています。 答えていただいたコードも大変参考になりましたが、 ctlList.Add(New CtrlSet(ButtonXX, TextBoxXX)) をXXが1~任意の数まで動かして、リストに登録する方法はないものでしょうか。 自分でも若干案があることはあるのですが、 「(1)Formのボタンを1つ選んで固定する (2)Formのテキストボックスを1つ固定する (3)選んだボタンの名前(コントロール名)から最初の6文字(「Button」部分)を取り除いた文字列と、選んだテキストボックスの名前から最初の7文字(「Textbox」部分)を取り除いた文字列が一致するか調べる。 (4)もし一致しなかったら、次のテキストボックスに移り、一致したら、pen_pen_penさんの提案してくれたコードでリストに格納して、次のボタンに移る (5)すべてのForm内のボタンに関して、同じことを実行する」 ということが出来れば、自分がやりたいことが実現できるのですが、私が書いた案を実装するコード、もしくはこの案でなにか思いついた(またはやっと状況がわかっていただけた)コードがあれば、どなたかご教授お願いいたします。
- pen_pen_pen
- ベストアンサー率65% (52/79)
関数「clk」の仕様を変えてしまいますが、以下のようにしてはいかがでしょうか? Public Sub clk(clkButton As Button, numText As TextBox) Dim clkNum As Integer = numText.Text Dim i As Integer For i = 1 To clkNum clkButton.PerformClick() Next End Sub そして、関数を実行するときに ボタンとテキストをセットでこの関数に渡します。 微妙に状況を理解しきれてないのでヘンなこと言ったらすみません。 どういうタイミングで実行するんですか?
補足
返信ありがとうございます。 回答を見させていただいて、自分の質問が変だったことに気付きました。 最初に言った80個のボタンには、すべて違う命令(大きなテキストボックスに文を貼り付ける)というコマンドをインプットしており、 「一つのコマンドボタンをクリックすると、1つのボタンをそれと組になっているテキストボックスの回数分だけクリックさせ、それをすべての組に対して実行する」 ということがしたいのですが、その組はソフトを改良をするたびに増えていくので、 「......」という部分を増やしていかなくてはいけないのです。 今回返信して頂いた引数の型を変えるというコードは大変参考になりました。 あとは、「各ボタンについて1行(1つ)のコード」ではなく、FOR,NEXTやDO,LOOPなどでまとめて読み込む方法を探しています。 大変お手数をおかけしますが、よろしくお願いします。
お礼
返信が遅くなってしまってすみませんでした。 お返事ありがとうございました。 実行してみたところDO~LOOPから抜け出すことなく、200万までカウントしていたので、DO~LOOP内のif文にElse : Exit Doを挿入したらちゃんと稼動しました。 本当にありがとうございました。