プロが教えるわが家の防犯対策術!

VB.NETで配列にPoint型のデータを入れたいのですが、
ArrayListのAddメソッドのように総数をあらかじめ指定せずに
順次追加するように登録していきたいのですが、
そのようなことは可能でしょうか?

最終的には
Dim points As Point()
g.DrawLines(Pens.Black, points)

の方法で線分を描きたいのですが、
ArrayListですとデータ型が指定できないので
Point型のデータを格納できないです。

良い方法がありましたら、ご教示頂けると助かります。

A 回答 (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 …
'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
    • good
    • 0

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()

といった具合で …
    • good
    • 0

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