VisualBasic テクニック集 |
VB6は素人プラグラマーにとっては大変使い勝手の良いプログラムソフトでした。しかしながらWindows10・11には対応しないことになり、VB6ユーザーはVisualStudio内のVisualBasicに移行せざるを得なくなりました。
このVisualBasicはもともとVB.Netといわれるもので、「Visual Studio 2005以降、旧呼称の Visual Basic が用いられるが、6.0以前との互換性はなく、.NETベースであることには変わりない」(Wikipediaより)とあるように、VB6とはかな異なった点が多くあります。特に変数の宣言が厳密になった点や、ファイルの入出力・グラフィック処理などの機能が削減された点などVB6ユーザーにとっては途方に暮れる変化があり、プログラミングをあきらめざるを得ない気持ちに陥ります。しかしながら、VB.Netには奥深い機能があるとともに、Win32のAPIを使えるなどの長所があり、工夫すればVB6の機能をカバーできます。
この度私が移行した際に調べて得たテクニックの一部を紹介したいと思います。また、掲載していたホームページも同時に紹介いたします。 |
項 目 |
参 考 サ イ ト |
ファイルの入出力関係(CVSフィルの読み込み) |
VisualBasic 中学校
http://rucio.o.oo7.jp/main/dotnet/shokyu/standard30.htm
VBレスキュー 花ちゃん
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013file_io03.htm |
グラフィックの使用 |
VisualBasic 中学校
http://rucio.o.oo7.jp/main/dotnet/shokyu/standard2.htm
諏訪研究室
http://www.setsunan.ac.jp/~suwa/lecture/vb_graphics1.pdf
dobon,net
https://dobon.net/vb/dotnet/graphics/drawrectangle.html#section2 |
グラフィックス 直線・四角・楕円等 |
dobon.net
https://dobon.net/vb/dotnet/graphics/drawline.html
https://dobon.net/vb/dotnet/graphics/drawrectangle.html |
グラフィックス 文字 |
dobon.net
https://dobon.net/vb/dotnet/graphics/drawstring.html |
グラフィックス 領域塗りつぶし |
VBレスキュー 花ちゃん
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013graphics04.htm
このサイトを参照してください |
コントロール配列の疑似的作成 ①
(新しくコントロールを作り出す) |
dobon.net
https://dobon.net/vb/dotnet/control/buttonarray.html
プログラムノート
http://note.websmil.com/%e7%9b%ae%e6%ac%a1 |
コントロール配列の疑似的作成 ②
(既存の複数コントロールを配列化する) |
ソフト工房 波田
http://tki.main.jp/hata/indexer.html |
'CSVファイルの読みこみ
Dim OpenFileName As String
OpenFileName = OFN
Dim Reader = New StreamReader(OpenFileName)
Dim Items() As String 'CSVの各項目を表す配列
Dim Line As String = Reader.ReadLine 'CSVの一行
Dim Num1 As Integer
Num1 = 1
Do Until IsNothing(Line)
Items = Line.Split(",") 'カンマを区切り文字に設定する
Dat(Num1, 1) = Items(0)
Me.testTextBox(Num1 * 3 - 3).Text = Items(0) '一番目のデーターの抽出
Dat(Num1, 2) = Items(1)
Me.testTextBox(Num1 * 3 - 2).Text = Items(1) '2番目のデーターの抽出
Dat(Num1, 3) = Items(2)
Me.testTextBox(Num1 * 3 - 1).Text = Items(2) '3番目のデーターの抽出
Num1 = Num1 + 1
Line = Reader.ReadLine '次の行を読み込む。
Loop
DMax = Num1 - 1
Reader.Close() |
|
'グラフィックスの使用
'グラフィックス使用の設定方法(4種類)
'その1 Paintイベントを使い e.Graphicsで描く方法 (クリックイベントなしで描画される)
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawLine(Pens.Red, 50, 60, 100, 150)
End Sub
注) dispose() はしない
'その2 AutoGraphics を用いる方法 (クリックイベントなしで描画される) 設定が簡単だがあまり利用されない
Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics
If picSource.Image Is Nothing Then
picSource.Image = New Bitmap(picSource.ClientRectangle.Width, picSource.ClientRectangle.Height)
End If
Return Graphics.FromImage(picSource.Image)
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim g As Graphics = AutoGraphics(PictureBox1)
g.DrawLine(Pens.Red, 0, 0, 100, 200)
end sub
'その3 CreateGraphics を用いる方法 (描画するにはクリックイベントが必要)
使用後 dispose()で破棄する必要がある 消える画像 実用性に乏しい
Dim g As Graphics = PictureBox1.CreateGraphics
g.DrawLine(Pens.Red, 0, 0, 100, 200)
g,dispose()
'その4 FromImage を用いる方法 (クリックイベントなしで描画される) 最も使い勝手が良い Imports System.Drawing PictureBox1.Image = New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height) 'imageプロパティに描画 Dim gr As Graphics = Graphics.FromImage(PictureBox1.Image) gr.DrawLine(Pens.Red, 0, 0, 100, 200) gr.dispose() 'その5 FromImage で form1 に描画する場合 (クリックイベントなしで描画される) 'BackgoundImageプロパティに描画 Imports System.Drawing Me.BackgrounDImage = New Bitmap(Me.Size.Width, Me.Size.Height)
Dim gr As Graphics = Graphics.FromImage(Me.BackgroundImage)
gr.DrawLine(Pens.Red, 0, 0, 100, 200) gr.dispose() |
|
'グラフィックス 直線・四角・楕円等 グラフィックスの使用設定後
'Penオブジェクトの作成(幅3黒色)
Dim p As New Pen(Color.Black, 3)
'直線
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawLine(Pens.Red, 50, 60, 100, 150)
End Sub
Dim g As Graphics = Graphics.FromImage(canvas) '(10, 20)-(100, 200)に、幅1の黒い線を引く
g.DrawLine(Pens.Black, 10, 20, 100, 200)
g.Dispose()
PictureBox1.Image = canvas
'四角 g.DrawRectangle(p, 10, 20, 100, 80) ’ペン、左上X、Y、横幅、縦幅
'楕円(円) g.DrawEllipse(Pens.Black, 10, 20, 100, 80) ’左上X、Y、長径、短径 円の場合は長径・短径を同じにする
'円弧 g.DrawArc(Pens.Black, 10, 20, 100, 80, 0, 90)
'扇形 g.DrawPie(Pens.Black, 10, 20, 100, 80, 0, 90)
'ブラシの作成
Dim b As New SolidBrush(Color.FromArgb(100, 200, 50, 100)) ’(Color.red)でも可能
'塗りつぶし図形
’四角 FillRectangle
'楕円 FillEllipse
'扇形 FillPie |
|
'グラフィックス 文字 グラフィックスの使用設定後
'フォントオブジェクトの作成
Dim fnt As New Font("MS UI Gothic", 20)
'文字列を位置(0,0)、青色で表示
g.DrawString("これはテストです。", fnt, Brushes.Blue, 0, 0) |
|
コントロール配列の疑似的作成 ①
(新しくコントロールを作り出す)
Private testLabel() As System.Windows.Forms.Label 'ラベルコントロール配列のフィールドを作成
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.testLabel = New System.Windows.Forms.Label(49) {} 'コントロール配列の疑似的作成
50個
Me.SuspendLayout()
Dim i As Integer
For i = 0 To Me.testLabel.Length - 1
Me.testLabel(i) = New System.Windows.Forms.Label 'インスタンス作成
'testLabel(1)はtestLabel1を、testLabel(49)はtestLabel49意味している
Me.testLabel(i).Name = "Button" + i.ToString() 'プロパティ設定
Me.testLabel(i).Size = New Size(30, 30) 'Labelのサイズと位置と色とスタイルの設定
Me.testLabel(i).Location = New Point((i Mod 25) * 30 + 150, (i \ 25) * 31)
Me.testLabel(i).BackColor = Color.FromArgb(iroban(i, 0), iroban(i, 1), iroban(i, 2))
Me.testLabel(i).BorderStyle = BorderStyle.FixedSingle '外枠有りに設定
Next i
Me.Controls.AddRange(Me.testLabel)
Me.ResumeLayout(False)
End Sub |
|
コントロール配列の疑似的作成 ②
既存のコントロールをコントロール配列にする
(PictureBox1~PictureBox5 をmyPictureBoxes()という配列に関連付ける)
この例では、form1上にPictureBox1~PictureBox5の5つのコントロールとListBox1を既に配置している。
Public Class Form1
Private myPictureBoxes As New List(Of PictureBox)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
call CTRArray()
end sub
Private Sub CTRArray()
Me.myPictureBoxes.Add(Me.PictureBox1)
Me.myPictureBoxes.Add(Me.PictureBox2)
Me.myPictureBoxes.Add(Me.PictureBox3)
Me.myPictureBoxes.Add(Me.PictureBox4)
Me.myPictureBoxes.Add(Me.PictureBox5)
'クリックイベントをイベントハンドラーに関連付け
For i As Integer = 0 To Me.myPictureBoxes.Count - 1
AddHandler myPictureBoxes(i).Click, AddressOf myPictureBoxes_Click
Next
End Sub
Private Sub myPictureBoxes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
'イベントの送り側の名前を取得
Dim senderName As String = DirectCast(sender, PictureBox).Name
'ボタンのベース名 長さの取得に使用
Dim strBut As String = "PictureBox"
'Buttonxxのxxを取得して数字に直している
Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length))
ListBox1.Items.Add(index)
End sub
※Sendername はクリックした既存のコントロール名「PictureBox2」等を表している
senderName.Substring(strBut.Length, senderName.Length - strBut.Length)は
PictureBox2 抽出 PictureBox(10文字) PictureBox2(11文字) PictureBoX(10文字) となり
PictureBox2 という文字列の 11番位置から1文字抽出せよとなり (抽出位置は最初の位置が0)
結果として「2」が抽出される |
|