- ベストアンサー
VB.NETの配列とArrayListについて教えてください。
VB.NETで配列にPoint型のデータを入れたいのですが、 ArrayListのAddメソッドのように総数をあらかじめ指定せずに 順次追加するように登録していきたいのですが、 そのようなことは可能でしょうか? 最終的には Dim points As Point() g.DrawLines(Pens.Black, points) の方法で線分を描きたいのですが、 ArrayListですとデータ型が指定できないので Point型のデータを格納できないです。 良い方法がありましたら、ご教示頂けると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Class Q4240323A Shared Sub Main() 'ケース1 Dim Points1 As System.Drawing.Point() '何故かBC42030の警告が出るorz System.Array.Resize(Points1,2) Points1(0).X = 100 Points1(0).Y = 100 System.Console.WriteLine(Points1.Length.ToString()) Points1(1).X = 200 Points1(1).Y = 200 System.Console.WriteLine(Points1.Length.ToString()) 'http://msdn.microsoft.com/en-us/library/bb348051.aspx 'VB6をご存知ならRedim Preserveと言った方が解りやすいだろう 'VB.NETでもRedimやRedim Preserveは有効だけど, '僕はVB6時代の構文を嫌っているから.NETらしくArray.Resizeを使っているよ。 'でも一次元配列はともかく多次元配列の配列添字については良く知らないんだ。 System.Array.Resize(Points1,1) System.Console.WriteLine(Points1(0).X.ToString()) System.Console.WriteLine("======================================") '.NET 2.0やJava 1.5から取り入れられた機能としてGenericsってのがある。 'System.Collections.ArrayListがSystem.Objectを基本としていたのに対し, '.NETのSystem.Collections.Generic.List<T>は宣言時に型を記述することで '型のキャストをいちいち行わなくていいようになっている。 '例を示そう。 Dim Points2 As System.Collections.Generic.List(Of System.Drawing.Point) Points2 = New System.Collections.Generic.List(Of System.Drawing.Point)() Dim Point21 As System.Drawing.Point Dim Point22 As System.Drawing.Point Point21.X = 100 Point21.Y = 100 Point22.X = 200 Point22.Y = 200 Points2.Add(Point21) Points2.Add(Point22) 'ちなみに 'System.Collections.Generic.List<T>.ToArray() 'でArray<T>つまりTの配列を返すことが出来るようになっている。 Dim Bitmap1 As System.Drawing.Bitmap Bitmap1 = New System.Drawing.Bitmap(500,500) System.Drawing.Graphics.FromImage(Bitmap1).DrawLines(System.Drawing.Pens.Black,Points2.ToArray()) 'VistaだとProgram Filesとかに書けなくてエラー出るかも。 Bitmap1.Save("Q4240323-1.bmp") 'こんな感じ。 '何故質問文でArrayListの話が出てきているのに最初に配列の話持ってきたかっつーと。 '多分Boxing関係だと思っているが,よくは理解できていないことがあって(Q3320160) 'Points2.Item(0).X = 100 'とかは出来ず, 'Dim Point23 As Point 'Points23.X = 100 'Points23.Y = 100 'Points2.Item(0) = Point23 'とかしないといけなかったので '勧めづらかったんですよ。面白いんですけどね。・・・・A '最後に脱線してこんなのを紹介しておきましょう。 'オブジェクト初期化子(多分.NET 3.0から) Dim Points3 As System.Drawing.Point Points3 = New System.Drawing.Point() With {.X = 100,.Y = 100} System.Console.WriteLine(Points3.X.ToString()) 'Aと組み合わせると色々面白いかもしれません System.Console.ReadKey(true) End Sub End Class
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
ArrayListでできませんか? Dim pts as new ArrayList() dim myPoints as Point() pts.Add( new Point( 10, 20 ) ) pts.Add( new Point( 30, 25 ) ) pts.Add( new Point( 35, 15 ) ) pts.Add( new Point( 45, 20 ) ) System.Array.Resize( myPoints, pts.Count) pts.CopyTo( myPoints ) Dim g as Graphics = PictureBox1.CreateGraphics g.DrawLines( Pens.Black, myPoints ) g.Dispose() といった具合で …