dポイントプレゼントキャンペーン実施中!

今、VB2005ExpressEditionでソフトを作っているのですが、
コマンドボタン(Button)を並べ、その隣にテキストボックス(Textbox)を並べ、
約80組のボタン・テキストの組を作りました。
そのボタンを隣に記載してある数字分だけクリックさせたいのですが、クリックさせる関数を

public function clk(a1 as integer,a2 as integer)
If a2 < 1 Then Exit Function
Dim a3 As Integer = a2
Do
If a1 = 1 Then Call Button1.PerformClick()
If a1 = 2 Then Call Button2.PerformClick()
.......
a3=a3-1
loop until a3<1
End function

として、a1をクリックするボタンの添え字、a2=textbox(a1).text(a1の部分は毎回手打ち)としていますが、buttonやtextboxの名前を変数化して、読み込むことができれば、コードを省略できると思います。何かいいアイデアはないものでしょうか?

A 回答 (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
    • good
    • 0
この回答へのお礼

返信が遅くなってしまってすみませんでした。
お返事ありがとうございました。
実行してみたところDO~LOOPから抜け出すことなく、200万までカウントしていたので、DO~LOOP内のif文にElse : Exit Doを挿入したらちゃんと稼動しました。
本当にありがとうございました。

お礼日時:2006/10/19 12:33

環境が無く正確な例はかけないのですが、イメージで。


'ボタンとテキストのペアを表す構造体を定義
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内のボタンに関して、同じことを実行する」

ということが出来れば、自分がやりたいことが実現できるのですが、私が書いた案を実装するコード、もしくはこの案でなにか思いついた(またはやっと状況がわかっていただけた)コードがあれば、どなたかご教授お願いいたします。

補足日時:2006/10/17 13:12
    • good
    • 0

関数「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などでまとめて読み込む方法を探しています。
大変お手数をおかけしますが、よろしくお願いします。

補足日時:2006/10/15 21:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!