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」が抽出される