プログラミングのすすめ 第十六歩 Visual Basic リファレンス

プログラミング

ここまで、Visual Studio 2022 を使ってVisual Basic でプログラミングをしてきました。度々、ネット検索やマイクロソフトのヘルプ・ドキュメントでVBの関数やメソッドについて調べてきました。それらを、もっと分かり易く ここにまとめておこうと思います。

引数

デバッグで引数を渡す

メニューでデバッグ(D) -> xxxx のデバッグ・プロパティ

出て来た画面のコマンドライン引数 に渡したい引数を記述します。

引数を受け取る

Sub Main(args As String())
        Debug.WriteLine(args.Length)
        Debug.WriteLine(args(0))

.Length は、引数の数を返します。 引数は args(0) のように配列変数に入ります。

1        <---  args.Length 
c:\SumByDay\All_Data\TradeRecordList(12).csv   <--- args(0)

Windows Form

Form上に配置した、Button や Label 等のControl を探して、見つかったControl のプロパティを操作する事が出来ます。

Control を探す

次のような、Shared Function を記述します。

   Public Shared Function FindControl(ByVal hParent As Control, ByVal stName As String) As Control
        ' hParent 内のすべてのコントロールを列挙する

        For Each cControl As Control In hParent.Controls
            ' 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする
            If cControl.HasChildren Then
                Dim cFindControl As Control = FindControl(cControl, stName)

                ' 再帰呼び出し先でコントロールが見つかった場合はそのまま返す
                ' If Not cFindControl Is Nothing Then
                If cFindControl IsNot Nothing Then
                    Return cFindControl
                End If
            End If

            ' コントロール名が合致した場合はそのコントロールのインスタンスを返す
            If cControl.Name = stName Then
                Return cControl
                Exit Function
            End If
        Next cControl
        Return Nothing
    End Function

使い方は、以下のような A - J のラベルが Label1 ~ Label10 のコントロール名であるとすると

Dim RedYellowLabel As Control = FindControl(Me, “Label” + i.ToString) とすることで、i が 1から10まで変化すると、 RedYellowLabel は、 Label1 ~ Label10 に変化します。

以下のようなサブルーチンを記述して、

   Sub RedAndYellow(k As Integer)
        For i = 1 To 10
            Dim RedYellowLabel As Control = FindControl(Me, "Label" + i.ToString)
            If i Mod 2 = k Then
                RedYellowLabel.BackColor = Color.Red
            Else
                RedYellowbel.BackColor = Color.Yellow
            End If
        Next
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        RedAndYellow(1)
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        RedAndYellow(0)
    End Sub

ボタン1を押すと末尾が奇数番号のLabel は赤に、偶数のLabelは黄色になります。

ボタン2を押すと、上記の逆になります。

Size , Location の変更

Control.Location = New Point(座標X , 座標Y ) で Control の位置を変更出来ます。

Control.Size = New Size(サイズX , サイズY ) で Control の大きさを変更できます。

RedYellowLabel.Location = New Point(RedYellowLabel.Location.X, 15)
RedYellowLabel.AutoSize = False
RedYellowLabel.Size = New Size(30, 30)

多数のControlを配置して、それを名前順に整列して並べたい場合、デザイナー画面での作業では大変です。以下の様に取り敢えず、コピペでその数だけcontrolを配置します。

次のコードで、Formのロード時に整列させます。

   Dim i As Integer
        For y = 27 To 355 Step 41

            For x = 10 To 330 Step 40
                i += 1
                Dim TBox As Control = FindControl(Me, "TextBox" + i.ToString)
                TBox.Location = New Point(x, y)
            Next

        Next

フォントの変更

RedYellowLabel.Font = New Font("Yu Gothic UI", 20.25F, FontStyle.Bold)
RedYellowLabel.Font = New Font(("Yu Gothic UI", 9.0F, FontStyle.Regular)
RedYellowLabel.Font = New Font("Yu Gothic UI", 20.25F, FontStyle.Bold Or FontStyle.Strikeout)

音(Wave)を鳴らす

Wave ファイルを埋め込む

先ず、wave ファイルをプロジェクトのリソースに取り込みます。

プロジェクト(P) -> コンポーネントの追加

リソース ファイル を選択して追加

左上の文字列 となっている項目をオーディオに変更

リソースの追加(R) をクリック

.wav を追加します。

リソース ファイルからリソースを取り出す

前項で追加したリソース ファイルの名前は、Resource1.resx 、それに追加した wave ファイルは、jump06.wav です。 My.Resources.Resource1.jump06 で取り出せます。

Dim strm As System.IO.Stream = My.Resources.Resource1.jump06

Playerを定義して、Play と後処理

        '同期再生する
        Dim player As New System.Media.SoundPlayer(strm)
        player.PlaySync()
        '後始末
        player.Dispose()

ファイル ダイアログ

ファイル選択用 ダイアログ を表示しファイルを開く

以下のようなファイル選択のためのダイアログを表示します。

 Dim openFileDialog1 = New OpenFileDialog() With {.InitialDirectory = CurDir(),
        .Filter = "すべてのファイル(*.*)|*.*|ナンプレ問題ファイル(Numpre*.txt;*.txt)|Numpre*.txt;*.txt",
        .Title = "開くファイルを選択してください",
        .RestoreDirectory = True,
        .CheckFileExists = True,
        .CheckPathExists = True
        }
If openFileDialog1.ShowDialog() = DialogResult.OK Then

            MsgBox(openFileDialog1.FileName)

        End If

ファイル選択後の処理

ファイルが選択され、開く(O) が押されたかを判断し処理を記述します。

    If openFileDialog1.ShowDialog() = DialogResult.OK Then

            MsgBox(openFileDialog1.FileName)

        End If

ファイル保存用 ダイアログを表示しファイルを保存する

Dim sfd As New SaveFileDialog With {
            .FileName = "Numpre*.txt",
            .InitialDirectory = CurDir(),
            .Filter = "Numpreファイル(Numpre*.txt)|*.txt|すべてのファイル(*.*)|*.*",
            .FilterIndex = 1,
            .Title = "保存先のファイルを選択してください",
            .RestoreDirectory = True,
            .OverwritePrompt = True,
            .CheckPathExists = True
        }
      If sfd.ShowDialog() = DialogResult.OK Then
            Dim stream As System.IO.Stream
            stream = sfd.OpenFile()
            If Not (stream Is Nothing) Then
                'ファイルに書き込む
                Dim sw As New System.IO.StreamWriter(stream)
                sw.Write(Form2.TextBox1.Text)
                '閉じる
                sw.Close()
                stream.Close()
              
            End If

        End If

List 変数

次のような数値が3x3のブロックに入っている状況をブロック毎に処理したい場合、List 変数にIndexを代入して処理すると便利です。

111222333
111
222333
111
222333
444
555666
444
555666
444
555666
777888999
777
888999
777
888999

List 変数の宣言

次のようにList変数の宣言と値の代入をします。

Dim Blocks As New List(Of Integer())

Blocks.Add({1, 2, 3, 10, 11, 12, 19, 20, 21})
Blocks.Add({4, 5, 6, 13, 14, 15, 22, 23, 24})
Blocks.Add({7, 8, 9, 16, 17, 18, 25, 26, 27})
Blocks.Add({28, 29, 30, 37, 38, 39, 46, 47, 48})
Blocks.Add({31, 32, 33, 40, 41, 42, 49, 50, 51})
Blocks.Add({34, 35, 36, 43, 44, 45, 52, 53, 54})
Blocks.Add({55, 56, 57, 64, 65, 66, 73, 74, 75})
Blocks.Add({58, 59, 60, 67, 68, 69, 76, 77, 78})
Blocks.Add({61, 62, 63, 70, 71, 72, 79, 80, 81})

for each で List 変数を使う

for each で List変数 Blocks() の中の Integer を Array() の Index として使い処理します。

        Dim BlData As String = ""
        Dim Cn As Integer
        For k = 0 To 8
            For Each q As Integer In Blocks(k)
                BlData += Array(q - 1)
                Cn += 1
                If Cn = 9 Then
                    Debug.WriteLine(BlData)
                    Cn = 0
                    BlData = ""
                End If

            Next
        Next

結果は、各ブロック毎のデータが出力されます。

111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999
スレッド 0x1d9c はコード 0 (0x0) で終了しました。

プログラムのICONを設定する

作成したプログラムをインストールすると、以下のように味気ない表示になってしまいます。

プログラムのICONを設定することにより、少しはましな表示に出来ます。

ICONは、以下の手順で設定出来ます。

メニューのプロジェクト(P) –> xxxのプロパティ(P)

出て来たプロジェクトのプロパティからリソースの項目のアイコンで .ico ファイルを設定します。

公開するパッケージにファイルを含める

カレントディレクトリにファイルを含めてパッケージを公開したい場合は、以下の手順でファイルをパッケージ含めます。

含めたいファイルを .sln ファイルと同じディレクトリに置きます。

ソリューションエクスプローラから目的のファイルを右クリックして、ファイルのプロパティを表示します。プロパティで、 ビルドアクション なし -> コンテンツ に変更します。

これで、ファイルが発行したパッケージのカレントディレクトリに出力されます。

PowerShell を立ち上げてコンソールに出力する

Powershell を立ち上げる

 Dim ProcID As Integer
 ' Start Windows Powershell , and store the process id.
 ProcID = Shell("powershell.EXE", AppWinStyle.NormalFocus)

アクティベイト出来るまで待つ

        ' Activate Windows powershell .
        Dim ti As Integer
WaitO:  On Error GoTo 0
        On Error GoTo WaitO
        System.Threading.Thread.Sleep(380)
        ti += 1
        AppActivate("Windows Powershell")
        On Error GoTo 0

PowerShell にキーストロークを送る

        ' Send the keystrokes to the Windows Powershell.
        My.Computer.Keyboard.SendKeys(ti.ToString + "{enter}", True)
        My.Computer.Keyboard.SendKeys("./test2.ps1 {Enter}", True)

上記コードの実行結果です。

PS >1
1
PS >./test2.ps1
689 4   5
23
   92
  6738
  7   4
  2    7
  1   9
       1
 5   6
PS >
タイトルとURLをコピーしました