- - PR -
[VB.NET]コントロール配列について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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の若い番号順に取得したいんですが、何か方法はありますでしょうか? | ||||||||||||
|
投稿日時: 2005-10-12 21:09
私も同じ現象になりました。 生成されたコードをみてもいまのところ法則性はみつけられていません。 対処方法としてFor EachではなくForでループさせると良いということが解りました。 アルマカンさんのサンプルの場合 o_lblTitleArrayのCountプロパティ分ループさせて o_lblTitleArray(ループカウンタ).Left で対応できるはずです。 _________________ たつごろー codeseek こみゅぷらす | ||||||||||||
|
投稿日時: 2005-10-13 09:36
こんにちは、じゃんぬ です。
このソースですが、po_lblTitle を持ってくる前の段階が大事でして、 このメソッドは全く重要ではないと思います。
po_lblTitle で格納された順です。 po_lblTitle から取り出される順番が問題なのではないです。 問題はもっと前だと思います。
質問者さんが、元の Object をどのように格納されているか、どこから判りました? 私には、手動で格納していないから起きているのではないと予想しています。 つまり... 以下のようなことです。 Form から For Each でコントロールを取得する場合は、ZOrder 順に取得されます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-10-13 10:05
質問者さんとまったく同じことはやっていないんですが、私のところでは、 VB6でLabelを5個作ってVB.NETに読み込んで試してみました。 私がざっと見たときには、自動生成されるコード群には怪しいところはみつけられ なかったのだけど、ZOrder順か。なるほど、判らないわけだ。 _________________ たつごろー codeseek こみゅぷらす | ||||||||||||
|
投稿日時: 2005-10-13 10:24
こんにちは、じゃんぬ です。
For Each でコントロールの Child から持ってきていれば、ですが... 個人的には、Microsoft.VisualBasic.Compatibility.VB6.LabelArray はやめて、 本当の「コントロールの配列」で実装した方が良いのではないかと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-10-13 11:40
たつごろーさん、じゃんぬねっとさん、ありがとうございました。
お礼が遅れてしまって申し訳ありません。 実は昨晩、たつごろーさんのご回答を拝見して、既にFor Loop文を使用して修正し、 正常に動くことを確認しました! ところで、質問攻めで申し訳ないんですが、時間があればお付き合い下さい。 ZOrder順で取得されているということですが、 .NETではZOrderの代わりに、「BringToFront」「SendToBack」の関数を使用して設定するようですが、どのような方法で自分の意図する順番に設定できるんでしょうか? 今後の参考として、よろしければ教えて下さい。 | ||||||||||||
|
投稿日時: 2005-10-13 12:06
こんにちは、じゃんぬ です。
ZOrder をアテにしたコーディングは大変危険です。(もちろん VB6 でもダメです) 見た目の優先順位以上の意識は持たないようにするのが理想です。 あるコンテナの小コントロール程度については、ZOrder は意識する必要すらないです。 仮に設定するにしても、デザイナで [最前面へ移動] [最背面へ移動] でやります。 あくまでも見た目レベルにして下さい。 順番を並べたいのであれば、格納する前に順序を並べておくか、 格納した後に Sort するようなメソッドを実装してください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1