どうも!リョクちゃです。
今回は、今まで紹介してきた記事で作成してきたコードを各ジャンルごとに使いやすくまとめたクラスを作って、クラスとは何かを紹介していきます。
また、クラスを作成していく中で関数やクラスの使い方についても触れていきます。
ちなみに前回はこちら
目次
クラスとは
クラスは各所でよく言われるの「データの設計図」と呼ばれます。
設計図には、特徴や機能、仕様などが書かれています。
ここでも各所ではクッキーの金型やたい焼きを例に解説されているところがあります。
イメージを下に載せておきます。(雑ですが……。)
クッキーの型クラスを使って、いろんなクッキーを作っていくイメージです。
このように何回も様々な形で使えるのがクラスの特徴の一つです。
クラスはいくつもの関数を持つことができる
また、クラスは関数を複数持つことができます。
関数以外にも変数やプロパティなども持つことができます。
クラスの中には下イメージのようなものが主に含まれています。
関数って??
関数は、いくつかの処理をまとめ、使いたいときに呼び出せる便利な要素でした。
様々な処理が機能として1つにまとまったモノを関数と呼んでいます。
VB.Netでは、Subプロシージャや
戻り値を返すFunctionプロシージャといった2種類の関数定義があります。
これらについては、以下の記事でも簡単に紹介しています。
プログラム編
それでは早速、クラスを作成していこうと思います。
今回は3つのクラスを作成するとこまでを紹介します。
- iniファイルに関するクラス
- CSVファイルに関するクラス
- テキストファイルに関するクラス
クラスの使い方については、次回の記事で解説していきます。
クラスの作り方
VB.Netではクラスは、以下の形で作成することができます。
1 2 3 4 5 6 |
Public Class クラス名 ' 変数 ' 関数 ' プロパティ ' などが書かれている End Class |
VisualStudio上では、
プロジェクト作成後の画面でプロジェクトタブをクリックし、クラスの追加を選択します。
適当な名前をつけ、追加ボタンを押します。
作成されたクラスは、ソリューションエクスプローラ上に表示がされます。
iniファイルを読み書きするクラスを作成する
以下の記事で作成したコードを1つのクラスとして新たに作成をしていきます。
iniファイルを読込む
iniファイルへ値を書き込む
これら記事のiniファイルを作成する際のAPIをまず、クラスに書いていきます。
クラスの名前は、clsIniとしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Imports System.Runtime.InteropServices Public Class clsIni ' iniファイルの場所を定数として宣言 Private Const INI_FILE_PATH As String = "./ini/test.ini" ' API宣言 ' ------------------------------------------------------ ' ini ファイル書き込み ' ------------------------------------------------------ <DllImport("Kernel32.dll")> Private Shared Function WritePrivateProfileString( ByVal lpAppName As String, 'セクション名 ByVal lpKeyName As String, 'キー名 ByVal lpString As String, ByVal lpFileName As String) As Integer End Function ' ------------------------------------------------------ ' ini ファイル読み込み ' ------------------------------------------------------ <DllImport("Kernel32.dll", CharSet:=CharSet.Auto)> Private Shared Function GetPrivateProfileString( ByVal lpAppName As String, ' セクション名 ByVal lpKeyName As String, ' キー名 ByVal lpDefault As String, ' キーが見つからなかった場合に取得するデフォルト値 ByVal lpReturnedString As System.Text.StringBuilder, ' 取得した文字列が入るバッファ ByVal nSize As Integer, ' 取得した文字列のバッファサイズ ByVal lpFileName As String) As Integer End Function '------------------------------------------------------- 'iniファイル(整数値読み込み) '------------------------------------------------------- <DllImport("Kernel32.dll", CharSet:=CharSet.Auto)> Private Shared Function GetPrivateProfileInt( ByVal lpAppName As String, ' セクション名 ByVal lpKeyName As String, ' キー名 ByVal nDefault As Integer, ' キーが見つからなかった場合に取得するデフォルト値 ByVal lpFileName As String) As Integer ' iniファイル名 End Function End Class |
APIを書いた、次はiniファイルを読み書きする関数を作成していきます。
このクラスでは、iniファイルから読み込む関数と書き込む関数をそれぞれ作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
Imports System.Runtime.InteropServices Public Class clsIni Private Const BuffSize As Integer = 256 ' 情報バッファのサイズ256文字 ' iniファイルの場所を定数として宣言 Private Const INI_FILE_PATH As String = "./ini/test.ini" ' API宣言 ' ------------------------------------------------------ ' ini ファイル書き込み ' ------------------------------------------------------ <DllImport("Kernel32.dll")> Private Shared Function WritePrivateProfileString( ByVal lpAppName As String, 'セクション名 ByVal lpKeyName As String, 'キー名 ByVal lpString As String, ByVal lpFileName As String) As Integer End Function ' ------------------------------------------------------ ' ini ファイル読み込み ' ------------------------------------------------------ <DllImport("Kernel32.dll", CharSet:=CharSet.Auto)> Private Shared Function GetPrivateProfileString( ByVal lpAppName As String, ' セクション名 ByVal lpKeyName As String, ' キー名 ByVal lpDefault As String, ' キーが見つからなかった場合に取得するデフォルト値 ByVal lpReturnedString As System.Text.StringBuilder, ' 取得した文字列が入るバッファ ByVal nSize As Integer, ' 取得した文字列のバッファサイズ ByVal lpFileName As String) As Integer End Function '------------------------------------------------------- 'iniファイル(整数値読み込み) '------------------------------------------------------- <DllImport("Kernel32.dll", CharSet:=CharSet.Auto)> Private Shared Function GetPrivateProfileInt( ByVal lpAppName As String, ' セクション名 ByVal lpKeyName As String, ' キー名 ByVal nDefault As Integer, ' キーが見つからなかった場合に取得するデフォルト値 ByVal lpFileName As String) As Integer ' iniファイル名 End Function #Region "INIファイル読取(文字列)" ''' <summary> ''' INIファイル読取(文字列) ''' </summary> ''' <param name="lpAppName"></param> ''' <param name="lpKeyName"></param> ''' <returns></returns> Public Shared Function GetIniString(ByVal lpAppName As String, ByVal lpKeyName As String) As String Dim str As System.Text.StringBuilder = New System.Text.StringBuilder(BuffSize) Try Call GetPrivateProfileString(lpAppName, lpKeyName, str.ToString, str, str.Capacity, INI_FILE_PATH) Return str.ToString Catch ex As Exception Return str.ToString End Try End Function #End Region #Region "INIファイル読取(整数)" ''' <summary> ''' INIファイル読取(整数) ''' </summary> ''' <param name="lpAppName">セクション</param> ''' <param name="lpKeyName">キー</param> ''' <returns></returns> Public Shared Function GetIniInt(ByVal lpAppName As String, ByVal lpKeyName As String) As Integer Dim int As Integer Try int = GetPrivateProfileInt(lpAppName, lpKeyName, 0, INI_FILE_PATH) Return int Catch ex As Exception Return int End Try End Function #End Region #Region "INIファイル書き込み" ''' <summary> ''' INIファイル書き込み ''' </summary> ''' <param name="lpAppName">セクション</param> ''' <param name="lpKeyName">キー</param> ''' <param name="lpString">書き込む文字列</param> Public Shared Sub WriteIniString(ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpString As String) Call WritePrivateProfileString(lpAppName, lpKeyName, lpString, INI_FILE_PATH) End Sub #End Region End Class |
読込む関数については、整数のときと文字列のときで分けて作成しています。
CSVファイルを読み書きするクラスを作成する
CSVファイルを読込む部分については、以下の記事を参考にクラスを作成していきます。
clsIniとは別に新たにクラス、clsCsvを作成します。
CSVファイルを読込む
1 2 3 4 |
' CSVファイルの読み書きに関するクラスです。 Public Class clsCsv End Class |
作成したクラスに読み込む関数と書き込む関数をそれぞれ作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
' CSVファイルの読み書きに関するクラスです。 Public Class clsCsv ''' <summary> ''' CSVファイルを読込み、戻り値としてリスト型で返す ''' </summary> ''' <param name="targetCsvFilePath"></param> ''' <returns></returns> Public Shared Function readCsvFile(ByVal targetCsvFilePath As String) As List(Of String) ' ファイルが見つかったら読込む処理を実施 If System.IO.File.Exists(targetCsvFilePath) Then Dim sr As System.IO.StreamReader = New System.IO.StreamReader(targetCsvFilePath) Dim recLst As New List(Of String) ' CAVファイルを最後まで読込む While sr.Peek >= 0 recLst.Add(sr.ReadLine) End While ' オブジェクトの解放 If sr IsNot Nothing Then sr.Close() sr.Dispose() sr = Nothing GC.Collect() End If Return recLst End If Return Nothing End Function ''' <summary> ''' CSVファイルを作成する ''' </summary> ''' <param name="targetCsvFilePath">CSVファイルの作成先</param> ''' <param name="writeText">書き込む文字列</param> Public Shared Sub createCsvFile(ByVal targetCsvFilePath As String, ByVal writeText As String) Dim sw As System.IO.StreamWriter = Nothing ' フォルダがあるかチェック ' ファイル名が保存されるディレクトリ名をExists関数を使って探しています。 ' 引数のtargetCsvFilePathではファイル名を含むので、 ' ファイル名を除去してディレクトリ名だけを抽出 If System.IO.Directory.Exists(targetCsvFilePath.Replace(System.IO.Path.GetFileName(targetCsvFilePath), "")) = False Then ' 無ければ作成する System.IO.Directory.CreateDirectory(targetCsvFilePath.Replace(System.IO.Path.GetFileName(targetCsvFilePath), "")) ' 文字コードを設定 UTF8 Dim utf_8 As System.Text.Encoding = System.Text.Encoding.UTF8 ' インスタンスを作成 ' 第1引数に作成するファイル名(パス含む) ' 第2引数に上書きするかしないか(True or False) ' 第3引数に文字コード sw = New System.IO.StreamWriter(targetCsvFilePath, False, utf_8) ' ファイルに書き込む sw.Write(writeText.ToString()) ' オブジェクトの解放を行う If sw IsNot Nothing Then sw.Close() sw.Dispose() sw = Nothing End If End If End Sub End Class |
テキストファイルを作成するクラスを作成する
最後に、テキストファイルを作成するクラスを作成していきます。
以下の記事で紹介したコードを参考に、読み書きする関数を作成します。
テキストファイルを作成する
テキストファイルを読み取る
クラス名は、clsTextとしました。
1 2 3 |
Public Class clsText End Class |
この中にそれぞれ読み書きする関数を作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Public Class clsText Public Shared Function readTextFile(ByVal targetTextFile As String) As List(Of String) ' ファイルが見つかれば処理をする If System.IO.File.Exists(targetTextFile) Then Dim sr As New System.IO.StreamReader(targetTextFile) ' 格納するリスト変数を作成 Dim lstRec As New List(Of String) ' テキストファイルを最後まで読込む While sr.Peek >= 0 lstRec.Add(sr.ReadLine()) End While ' オブジェクトの解放 If sr IsNot Nothing Then sr.Close() sr.Dispose() sr = Nothing GC.Collect() End If Return lstRec End If Return Nothing End Function ''' <summary> ''' テキストファイルを作成する ''' </summary> ''' <param name="targetTextFilePath">テキストファイルの作成先</param> ''' <param name="writeText">書き込む文字列</param> Public Shared Sub createTextFile(ByVal targetTextFilePath As String, ByVal writeText As String) Dim sw As System.IO.StreamWriter = Nothing ' フォルダがあるかチェック ' ファイル名が保存されるディレクトリ名をExists関数を使って探しています。 ' 引数のtargetCsvFilePathではファイル名を含むので、 ' ファイル名を除去してディレクトリ名だけを抽出 If System.IO.Directory.Exists(targetTextFilePath.Replace(System.IO.Path.GetFileName(targetTextFilePath), "")) = False Then ' 無ければ作成する System.IO.Directory.CreateDirectory(targetTextFilePath.Replace(System.IO.Path.GetFileName(targetTextFilePath), "")) ' 文字コードを設定 UTF8 Dim utf_8 As System.Text.Encoding = System.Text.Encoding.UTF8 ' インスタンスを作成 ' 第1引数に作成するファイル名(パス含む) ' 第2引数に上書きするかしないか(True or False) ' 第3引数に文字コード sw = New System.IO.StreamWriter(targetTextFilePath, False, utf_8) ' ファイルに書き込む sw.Write(writeText.ToString()) ' オブジェクトの解放を行う If sw IsNot Nothing Then sw.Close() sw.Dispose() sw = Nothing End If End If End Sub End Class |
書き込みについては、CSVファイル関連で作成したクラスとほぼ変わりません。
全てを追加した後のソリューションエクスプローラを見てみると、以下のようになります。
クラスが3つ追加されているのがわかります。
まとめ
クラスについて、作り方、クラスの中に組まれる関数の作り方について
例を交えて解説をしていきました。
クラスは、規模が大きくなりそうなアプリケーションの開発や、今までに書いたコードを再利用する上で非常に強力な技術要素になります。
クラスを学んで作れるようになることで、従来の開発期間を大幅に削減することも可能です。
ぜひ、これを参考にクラスを作成してもらってイメージをつかんでもらえたらなと思います。
最後までご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。