猫がプログラムを組む

猫は直ぐに忘れるのでメモを取ります

ListViewにアイテムを追加する

意外に毎回、やり方を忘れるのでメモしておこう。

With ListView1
    .Items.Add("アイテム")
    .Items(.Items.Count-1).SubItems.Add("サブアイテム1")
    .Items(.Items.Count-1).SubItems.Add("サブアイテム2")
    .Items(.Items.Count-1).SubItems.Add("サブアイテム3")
End With

Columnsは、デザイナで設定する前提ですね。

クラスをシリアライズしてファイル保存する

シリアルライズしてファイルの読み書きするクラス

Public Class clsSerialize

    ''' <summary>
    ''' シリアライズされたデータの読み込み
    ''' </summary>
    ''' <typeparam name="T">クラス</typeparam>
    ''' <param name="_fp">ファイルパス</param>
    ''' <param name="_cls">読み込むオブジェクト</param>
    ''' <remarks></remarks>
    Public Shared Sub loadSerialize(Of T)(_fp As String, ByRef _cls As T)

        Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim _obj As Object = Nothing

        If My.Computer.FileSystem.FileExists(_fp) = True Then
            Using fs As New System.IO.FileStream(_fp, System.IO.FileMode.Open)
                _obj = serializer.Deserialize(fs)
            End Using
            _cls = CType(_obj, T)
        End If

    End Sub


    ''' <summary>
    ''' シリアライズされたデータの保存
    ''' </summary>
    ''' <typeparam name="T">クラス</typeparam>
    ''' <param name="_fp">ファイルパス</param>
    ''' <param name="_cls">保存するオブジェクト</param>
    ''' <remarks></remarks>
    Public Shared Sub saveSerialize(Of T)(_fp As String, ByRef _cls As T)

        Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(T))
        Dim _obj As Object = _cls

        Using fs As New System.IO.FileStream(
            _fp, System.IO.FileMode.Create)
            serializer.Serialize(fs, _obj)
            fs.Flush()
        End Using

    End Sub

End Class

使用方法は、

' 設定保持クラス
Public Class clsSetting
    Private _val As Boolean
    Public Property val As Boolean
        Get
            Return _val
        End Get
        Set(value As Boolean)
           _val = value
        End Set
    End Property
End Class

Public _setting As New clsSetting

' クラスの読み込み
clsSerialize.loadSerialize(Of clsSetting)("clsSetting.xml",_setting)
' クラスの保存
clsSerialize.saveSerialize(Of clsSetting)("clsSetting.xml",_setting)

煩雑なファイル操作を必要とせずに、変数や状態の保存、読み出しができるので、重宝しています。

キーバッファをクリアする

不用意に押されたクリックやキーで次の画面に遷移した時に意図しない動作を抑制したい時

Imports System.Runtime.InteropServices

Public Class clsKeyBuff

   <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function PeekMessage(
            ByRef lpMsg As MSG,
            ByVal hwnd As Int32,
            ByVal wMsgFilterMin As Int32,
            ByVal wMsgFilterMax As Int32,
            ByVal wRemoveMsg As PeekMsgOption
        ) As Boolean
    End Function
    <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function TranslateMessage(ByRef lpMsg As MSG) As Boolean
    End Function
    <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function DispatchMessage(ByRef lpMsg As MSG) As Int32
    End Function

    Private Enum PeekMsgOption
        PM_NOREMOVE = 0 ' 削除しない
        PM_REMOVE       ' 削除する 
    End Enum

    <StructLayout(LayoutKind.Sequential)>
    Structure MSG
        Public HWnd As Int32
        Public Msg As Int32
        Public WParam As Int32
        Public LParam As Int32
        Public Time As Int32
        Public Pt As POINTAPI
    End Structure 'MSG

    <StructLayout(LayoutKind.Sequential)>
    Structure POINTAPI
        Public x As Int32
        Public y As Int32
    End Structure

    Const PM_REMOVE = &H1
    Const WM_KEYFIRST = &H100
    Const WM_KEYLAST = &H108
    Const WM_MOUSEFIRST = &H200
    Const WM_MOUSELAST = &H20A

    ''' <summary>
    ''' キーバッファクリア
    ''' </summary>
    ''' <param name="frm">フォームオブジェクト</param>
    Public Shared Sub clearBuff(frm As Form)

        Try
            Dim m As New MSG
            Do While PeekMessage(m, CInt(frm.Handle), WM_KEYFIRST, WM_KEYLAST, PeekMsgOption.PM_REMOVE)
            Loop
            Do While PeekMessage(m, CInt(frm.Handle), WM_MOUSEFIRST, WM_MOUSELAST, PeekMsgOption.PM_REMOVE)
            Loop
        Catch ex As Exception
        End Try

End Class

キーバッファをクリアしたいイベント箇所に

clsKeyBuff.clearBuff(Me)

これだけでキーバッファはクリアされて意図しない動作を抑制できます。

iniファイルを読み込む

iniファイルを読み込む為のクラス

Imports System.Runtime.InteropServices
Imports System.Text

Public Class clsIniFile

    Public Declare Auto Function GetPrivateProfileString Lib "kernel32" _
        Alias "GetPrivateProfileString" (
        <MarshalAs(UnmanagedType.LPTStr)> ByVal lpApplicationName As String,
        <MarshalAs(UnmanagedType.LPTStr)> ByVal lpKeyName As String,
        <MarshalAs(UnmanagedType.LPTStr)> ByVal lpDefault As String,
        <MarshalAs(UnmanagedType.LPTStr)> ByVal lpReturnedString As StringBuilder,
        ByVal nSize As UInt32,
        <MarshalAs(UnmanagedType.LPTStr)> ByVal lpFileName As String) As UInt32

End Class

使用する時は、

#Imports System.Text

ret = clsIniFile.GetPrivateProfileString(
              "SERVER",
              "CONNECT",
              "",
              sb,
              Convert.ToUInt32(sb.Capacity),
               strFilePath)
Dim _serverConnect As String = sb.ToString

iniファイルの中身は

[SERVER]
;接続文字列
CONNECT="Data Source=;Initial Catalog=;User ID=;Password="