- PR -

[VB.NET]コントロール配列について

1
投稿者投稿内容
アルマカン
会議室デビュー日: 2004/07/08
投稿数: 4
投稿日時: 2005-10-12 19:41
コントロール配列についてお伺いします。

VB6から.NETへバージョンアップウィザードを使用しました。
VB6ではLabelコントロール15個がコントロール配列になっています。
ウィザードを使用することにより、自動的にコントロール配列(LabelArray)を作成してくれるため、コーディング時はあまり気にせずに使用できますが、
以下のコードを実行しようとしたところで、疑問点があります。

Public Sub LabelArray(ByRef po_lblTitle as Object)
Dim d_Distance As Double
Dim o_lblTitle As System.Windows.Forms.Label
Dim o_lblTitleArray As Microsoft.VisualBasic.Compatibility.VB6.LabelArray

o_lblTitleArray = po_lblTitle

For Each o_lblTitle In o_lblTitleArray
   'ラベルの配置位置を取得
d_Distance = o_lblTitle.Left
Next o_lblTitle
End Sub

↑上記のとき、LabelコントロールのLeftの値を一つづつ取得しようとしていますが、
 デバッグしながら見てみると、コントロールのIndexが、0から順にではなく、ばらばらの順番で取得してしまうんです。
 今回は、9,2,4,13,6,15,8,1,10,3,12,5,14,7,0という順番でした。
 これには何か規則性などがあるんでしょうか?
 Indexの若い番号順に取得したいんですが、何か方法はありますでしょうか?
 
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-10-12 21:09
引用:

VB6から.NETへバージョンアップウィザードを使用しました。
VB6ではLabelコントロール15個がコントロール配列になっています。
 デバッグしながら見てみると、コントロールのIndexが、0から順にではなく、ばらばらの順番で取得してしまうんです。


私も同じ現象になりました。
生成されたコードをみてもいまのところ法則性はみつけられていません。
対処方法としてFor EachではなくForでループさせると良いということが解りました。

アルマカンさんのサンプルの場合
o_lblTitleArrayのCountプロパティ分ループさせて
o_lblTitleArray(ループカウンタ).Left
で対応できるはずです。

_________________
たつごろー
codeseek
こみゅぷらす
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-13 09:36
こんにちは、じゃんぬ です。

引用:

アルマカンさんの書き込み (2005-10-12 19:41) より:

上記のとき、LabelコントロールのLeftの値を一つづつ取得しようとしていますが、
デバッグしながら見てみると、コントロールのIndexが、0から順にではなく、ばらばらの順番で取得してしまうんです。


このソースですが、po_lblTitle を持ってくる前の段階が大事でして、
このメソッドは全く重要ではないと思います。

引用:

これには何か規則性などがあるんでしょうか?
Indexの若い番号順に取得したいんですが、何か方法はありますでしょうか?


po_lblTitle で格納された順です。
po_lblTitle から取り出される順番が問題なのではないです。
問題はもっと前だと思います。

引用:

私も同じ現象になりました。
生成されたコードをみてもいまのところ法則性はみつけられていません。


質問者さんが、元の Object をどのように格納されているか、どこから判りました?
私には、手動で格納していないから起きているのではないと予想しています。
つまり... 以下のようなことです。

Form から For Each でコントロールを取得する場合は、ZOrder 順に取得されます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-10-13 10:05
引用:

質問者さんが、元の Object をどのように格納されているか、どこから判りました?
私には、手動で格納していないから起きているのではないと予想しています。


質問者さんとまったく同じことはやっていないんですが、私のところでは、
VB6でLabelを5個作ってVB.NETに読み込んで試してみました。

私がざっと見たときには、自動生成されるコード群には怪しいところはみつけられ
なかったのだけど、ZOrder順か。なるほど、判らないわけだ。

_________________
たつごろー
codeseek
こみゅぷらす
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-13 10:24
こんにちは、じゃんぬ です。

引用:

たつごろーさんの書き込み (2005-10-13 10:05) より:

私がざっと見たときには、自動生成されるコード群には怪しいところはみつけられ
なかったのだけど、ZOrder順か。なるほど、判らないわけだ。


For Each でコントロールの Child から持ってきていれば、ですが...

個人的には、Microsoft.VisualBasic.Compatibility.VB6.LabelArray はやめて、
本当の「コントロールの配列」で実装した方が良いのではないかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
アルマカン
会議室デビュー日: 2004/07/08
投稿数: 4
投稿日時: 2005-10-13 11:40
たつごろーさん、じゃんぬねっとさん、ありがとうございました。
お礼が遅れてしまって申し訳ありません。

実は昨晩、たつごろーさんのご回答を拝見して、既にFor Loop文を使用して修正し、
正常に動くことを確認しました!

ところで、質問攻めで申し訳ないんですが、時間があればお付き合い下さい。

ZOrder順で取得されているということですが、
.NETではZOrderの代わりに、「BringToFront」「SendToBack」の関数を使用して設定するようですが、どのような方法で自分の意図する順番に設定できるんでしょうか?

今後の参考として、よろしければ教えて下さい。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-13 12:06
こんにちは、じゃんぬ です。

引用:

アルマカンさんの書き込み (2005-10-13 11:40) より:

.NETではZOrderの代わりに、「BringToFront」「SendToBack」の関数を使用して設定するようですが、どのような方法で自分の意図する順番に設定できるんでしょうか?


ZOrder をアテにしたコーディングは大変危険です。(もちろん VB6 でもダメです)
見た目の優先順位以上の意識は持たないようにするのが理想です。
あるコンテナの小コントロール程度については、ZOrder は意識する必要すらないです。

仮に設定するにしても、デザイナで [最前面へ移動] [最背面へ移動] でやります。
あくまでも見た目レベルにして下さい。
順番を並べたいのであれば、格納する前に順序を並べておくか、
格納した後に Sort するようなメソッドを実装してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)