DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コントロール配列に関する問題

環境/言語:[XP,VB.NET 2003]
分類:[.NET]

.NET Tipsのコントロール編で、「コントロールの配列を作成する」のページを参考にさせていただきました。そこで、質問したいのでよろしくお願いします。
コントロール配列の2つ目の方法のところですが、
Private testButtons(4) As System.Windows.Forms.Button

Private Sub Form1_Load(sender As Object, e As System.EventArgs)
Handles MyBase.Load
'ボタンコントロールの配列にすでに作成されているインスタンスを代入
testButtons(0) = Button1
testButtons(1) = Button2
testButtons(2) = Button3
testButtons(3) = Button4
testButtons(4) = Button5
この部分です。この部分を
For i=0 To 10
testButtons(i)=control("Button" & i)
next
な感じに出来るでしょうか?(もちろんこれでは動きませんが)
コントロールが貼り付けられている、という前提でお願いします。
こんにちは、じゃんぬねっと です。

■No9460に返信(トラさんの記事)
> For i=0 To 10
> testButtons(i)=control("Button" & i)
> next
> な感じに出来るでしょうか?(もちろんこれでは動きませんが)
> コントロールが貼り付けられている、という前提でお願いします。

リフレクション何かを駆使すれば、For ステートメントを利用することはできますが、恩恵は全く何もないですね。
画面デザイナと独立して考えることができないから、どちらかと言えば「デメリットが多い」かと思います。

というより、既にフォームに配置されている時点で、
各々が独立したインスタンスを持っていることを意識して頂きたいです。
Button を可変な配列を作りたいのならば、紹介ページの 1 番目の手法をとるべきで、
既に配置しているものを、For で抽象的に扱うこと自体ナンセンスなのです。
■No9461に返信(じゃんぬねっとさんの記事)

じゃんぬねっとさん、早速のレスありがとうございます。

VB6.0は少しいじったことがあるので、その感覚でいうと3つの方法のうち2番目が一番取っつきやすかったので質問させていただきました。
コントロール配列として使用したいときは、2番目の手法は使わず、3つの手法のうち1 番目の手法をとるのが定石ということですか、よく分かりました。
.NETはなかなか難しいですね、.NET初心者なのでこれからもよろしくお願いします。
■No9461に返信(じゃんぬねっとさんの記事)

こんにちは 平ちゃんです

質問者が教えて欲しかったのは
既に存在するインスタンスを簡単に配列変数に関連付ける方法ではないかと思います。
(それならば最初から配列に関連付けてインスタンスを作成すればいいのでは、という議論はフォームをデザイナで作成する場合は無理です)

以前私も、20個位のボタンインスタンスを作成した後、その後の処理が簡単になるので、再度配列に割り当てたことがあります。

(例) testButtons(i).BackColor = Color.Red

残念ながら 私は関連付ける方法をしりませんので

testButtons(0) = Button1
testButtons(1) = Button2
testButtons(2) = Button3
testButtons(3) = Button4
testButtons(4) = Button5
のようにした記憶があります。

質問者のフォローという事で。
>以前私も、20個位のボタンインスタンスを作成した後、その後の処理が簡単になるので、再度配列に割り当てたことがあります。

どこが<<<再度>>>なのかよく分からないんですが・・・

で、まぁこの場合のやり方は
Dim testButtons as Button(5)
testButtons(0) = Button1
testButtons(1) = Button2
testButtons(2) = Button3
testButtons(3) = Button4
testButtons(4) = Button5

でもいいですし、
Dim alButtons as New ArrayList()
alButtons.add(Button1)
alButtons.add(Button2)
alButtons.add(Button3)
alButtons.add(Button4)
alButtons.add(Button5)

私は後者を選びます。
こんにちは、じゃんぬねっと です。

■No9503に返信(平ちゃんさんの記事)
> 質問者が教えて欲しかったのは
> 既に存在するインスタンスを簡単に配列変数に関連付ける方法ではないかと思います。

反論する前に、ちゃんと読みましょう。(--;)

> ---------------------------------------------------------------------
> > For i=0 To 10
> > testButtons(i)=control("Button" & i)
> > next
> > な感じに出来るでしょうか?(もちろんこれでは動きませんが)
> > コントロールが貼り付けられている、という前提でお願いします。
> ---------------------------------------------------------------------

という問いに対し、

> ---------------------------------------------------------------------
 リフレクション何かを駆使すれば、For ステートメントを利用することはできますが
> ---------------------------------------------------------------------

と、このように回答しています。
その後、質問者のためを思って、デメリットについても述べてますし、
For で扱いたければ、1 番目の手法を取るべきですよと言っているのです。

少なくとも、

> 残念ながら 私は関連付ける方法をしりませんので

のような投稿より、遥かに有意義な回答だと思いますが (w
それに、方法も知らないのに反論なんて出来るものですかね。

> (それならば最初から配列に関連付けてインスタンスを作成すればいいのでは、
> という議論はフォームをデザイナで作成する場合は無理です)

そんなこと、一言も言ってませんがね (--#)
静的に配置されたものを、For ステートメント内で動的に扱うべきではない。
"For について" は、ソースの可読性・保守性、すべてにおいて無意味だと言っただけです。

コントロールの参照として設定すること自体は、問題ありません。
まあ、やるのでしたら、コントロール「参照」として Array な変数に設定するのが普通でしょう。
2005/03/03(Thu) 10:53:07 編集(投稿者)
2005/03/03(Thu) 10:49:50 編集(投稿者)
2005/03/03(Thu) 10:47:13 編集(投稿者)

■No9507に返信(じゃんぬねっとさんの記事)


中博俊さん じゃんぬねっとさん こんにちは いつもお世話になります。

質問者のフォローしたつもりだったんですがが全然フォローになってないみたいですね。

例えば電卓の0〜9までのボタンを想定してこのボタンの処理をするためにNum(9) を準備し
i=0
Num(i).BackColor = Color.Red のようにすれば 汎用的にアクセスできるようになり便利です。
そのために配列に関連づけ Button1.BackColor = Color.Red の代わりに使用したい。
その関連付けを簡単に For でしたかった。
(と私は思う)

中博俊さん は格納の方法ですね。(私の書き方が悪かったせいです)




□投稿者/ じゃんぬねっと ベテラン(241回)-(2005/03/03(Thu) 09:54:12)
http://jeanne.wankuma.com/


じゃんぬねっとさんの 仰っている事はスキル不足のため殆どわかりません。

>静的に配置されたものを、For ステートメント内で動的に扱うべきではない。
>"For について" は、ソースの可読性・保守性、すべてにおいて無意味だと言っただけです。
ただこのようなことを質問しているかなあ?と思ったので投稿させて頂きました。
(じゃんぬねっとさん に反論なんて とても、とても)

ただ最後の
コントロールの参照として設定すること自体は、問題ありません。
まあ、やるのでしたら、コントロール「参照」として Array な変数に設定するのが普通でしょう。
はわかります。

質問者は多分参照として簡単にArray な変数に設定したかったのでは?
これを For とか 簡単な方法でできますでしょうか?。
宜しくお願いします。
> VB6.0は少しいじったことがあるので、その感覚でいうと3つの方法のうち2番目が一番取っつきやすかったので質問させていただきました。
> コントロール配列として使用したいときは、2番目の手法は使わず、3つの手法のうち1 番目の手法をとるのが定石ということですか、よく分かりました。

恐らく3番目の方法は取っ付きにくかったのでごらんになっていないかもしれませんが、じゃんぬねっとさんも仰っているように”リフレクション何か”を利用した方法です。まずはGetControlArrayByNameをブラックボックスとして使ってみてはどうでしょうか?
連絡が遅くなりました。
平ちゃんさん、自分がうまく疑問を説明でなくフォローしていただきありがとうございます。
平ちゃんさんが言うように単に、参照として簡単にArray な変数に設定できるのかなと思っただけです。
VBのいいところは(自分的には)コントロールを視覚的にフォームに配置できるので、まず、先に配置ありきという考えからの質問でした。(これがいけないのかな?)

中博俊さん じゃんぬねっとさんいろいろアドバイスありがとうございます。
じゃんぬねっとさんのホームページを見つけました。
ちょくちょく利用させていただきます。

antさんアドバイスありがとうございます。
確かに、3番目は.NET初心者の私にはよくわかりませんがこれから分析しながら勉強していきたいと思います。

これからもいろいろ質問したいと思いますが、何しろ初心者のため、とんちんかんな質問もするかもしれませんが、よろしくお願いします。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板