-
文字列から数値型への変換は以下のページにありますが、今回はオブジェクト型から数値への変換を記します。
⇒文字列から数値型への変換(parse - tryparse)
Integer型に変換するために Integer.TryParse メソッドを使いますが、引数としては文字列なので 先ずはオブジェクト型から文字列型への変換関数を宣言します。 ソースは以下の様になります。(Objectデータが「Nothing」「DBNULL」の場合には空文字列を返します。)オブジェクト型からString型への変換
'''
''' Object型からString型にデータ変換 ''' ''' <param>元のObject</param> '''String型に変換後の値 '''String型に変換できない場合は「""」を返す Function ObjToStr(ByVal objSrc As Object) As String Dim strRet As String Try If objSrc Is Nothing Then 'Objectデータが「Nothing」の場合 strRet = "" ElseIf IsDBNull(objSrc) Then 'Objectデータが「DBNULL」の場合 strRet = "" Else '文字列に変換 strRet = CStr(objSrc) End If Catch ex As Exception 'エラーの場合 strRet = "" End Try '変換値を返す Return strRet End Functionこのオブジェクト型から文字列型への変換関数を利用して、 オブジェクト型からInteger型への変換関数を宣言します。
オブジェクト型からInteger型への変換
'''
''' Object型からInteger型にデータ変換 ''' ''' <param>元のObject</param> '''Integer型に変換後の値 '''Integer型に変換できない場合は「0」を返す Function ObjToInt(ByVal objSrc As Object) As Integer Dim intRet As Integer Try 'String型に変換 Dim strSrc As String = ObjToStr(objSrc) 'Integer型に変換 If Integer.TryParse(strSrc, intRet) = False Then '変換が不可の場合 intRet = 0 End If Catch ex As Exception 'エラーの場合 intRet = 0 End Try '変換値を返す Return intRet End Function
更にオブジェクト型からDecimal型への変換は以下の様になります。 (その他のDouble型とかも同様に宣言できます)
オブジェクト型からDecimal型への変換
'''
''' Object型からDecimal型にデータ変換 ''' ''' <param>元のObject</param> '''Decimal型に変換後の値 '''Decimal型に変換できない場合は「0」を返す Function ObjToDec(ByVal objSrc As Object) As Decimal Dim decRet As Decimal Try 'String型に変換 Dim strSrc As String = ObjToStr(objSrc) 'Decimal型に変換 If Decimal.TryParse(strSrc, decRet) = False Then '変換が不可の場合 decRet = 0 End If Catch ex As Exception 'エラーの場合 decRet = 0 End Try '変換値を返す Return decRet End Function関連する記事
⇒文字列から数値型への変換(parse - tryparse)
PR -
標準コントロールのボタンは特によく使われると思いますが、 今回は、ボタンに画像を張付けの使い方について順を追って説明したいと思います。
■ボタン上の Image に画像を張り付ける方法
フォーム上にボタンを張り付けて、そのボタンの Image プロパティに画像を設定します。
(以下の図は、ボタンを張り付けたところまで)次にボタンの Image プロパティの「…」ボタンをクリックします。リソースの選択ダイアログが開きます。
上のダイアログの「プロジェクト リソースファイル」の下の方の「インポート(M)」ボタンをクリックします。
以下のファイル選択ダイアログが開きますので、そこでペイント等の画像ソフトで作成しておいた画像ファイルを指定します。 (今回は簡単な矢印の画像のファイルを作成しました)このダイアログの「開く」をクリックすると以下の様に画像がリストに反映されます。 矢印の画像ファイルが選択されている状態で、「OK」をクリックします。
そのボタンの Image プロパティに画像が設定されたことが分かります。 ここで TextImageRelation プロパティを適当な値(今回は ImageBeforeText)に設定します。 そうしますと左側のデザイン画面にも画像が表示されます。
以下のソースを見て下さい。 通常通りボタンのクリックイベントの処理を記述して、ボタンが働くことを確認します。Public Class frmButton Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox("Bitmapイメージを貼付したボタン") End Sub End Classこれを実行すると以下の様な表示になります。
■別の場所からボタンクリックを起動する方法
別の処理からボタンのクリック処理を呼び出したい場合がありますが、 この時にはボタンの PerformClick メソッドをコールします。
次は、上記で張り付けたボタンのコピーをフォーム上で行います。 第2のボタンから最初のボタンクリックを呼出します。Public Class frmButton Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox("Bitmapイメージを貼付したボタン") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '別のボタンからクリックイベントを起動 Me.Button1.PerformClick() End Sub End Classこれを実行すると以下の様な表示になります。(下図は Button2 をクリックしたところです)
■ボタン全面に画像を張り付ける方法
新しいフォームにボタンを追加して、サイズを縦横 200 ピクセルぐらいとします。 さらにボタンの BackgroundImage に画像ファイルを指定します。
(以下の図は、ボタンを張り付けたところまで)次にボタンの BackgroundImage プロパティの「…」ボタンをクリックします。リソースの選択ダイアログが開きます。 「ローカル リソース」をクリックします。
上のダイアログの「ローカル リソース」の「インポート(M)」ボタンをクリックします。
以下のファイル選択ダイアログが開きますので、そこでペイント等の画像ソフトで作成しておいた画像ファイルを指定します。 (今回は簡単な四角い画像のファイルを作成しました)このダイアログの「開く」をクリックすると以下の様に画像がリストに反映されます。 さらに、「OK」をクリックします。
そのボタンの BackgroundImage プロパティに画像が設定されたことが分かります。 ここで FlatStyle プロパティを Flat に設定します。 そうしますと左側のデザイン画面にも画像が表示されます。
このままプログラムを実行してもボタンの画像は全体が表示されませんので、ボタンの画像描画などは自分で行うことになります。
フォームロード時にボタンのペイントイベントの処理ハンドラを登録します。
ペイントイベントでは、ボタンの背景画像をボタンのサイズに合わせて再描画します。 その後で、ボタンの Text プロパティに設定された文字列を、ボタンの中央に表示します。
背景画像の描画には Graphics.DrawImage メソッドを使用し、 文字列の描画には Graphics.DrawString メソッドを使用します。
文字列描画の Graphics.DrawString では StringFormat クラスを用いてボタンのTextを描画の位置指定します。Public Class frmButton2 Private Sub frmButton2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Button1のPaintイベントハンドラを追加 AddHandler Button1.Paint, AddressOf Button1_Paint End Sub Private Sub Button1_Paint(sender As Object, e As PaintEventArgs) 'ボタンの背景画像をボタンの大きさに合わせて描画 e.Graphics.DrawImage(Me.Button1.BackgroundImage, Me.Button1.ClientRectangle) 'StringFormatクラスを用いてボタンのTextを描画の位置指定 Dim Sfrm As New StringFormat() '文字列の水平位置 Sfrm.Alignment = StringAlignment.Center '文字列の垂直位置 Sfrm.LineAlignment = StringAlignment.Center 'ブラシの作成 Dim Brs As Brush = New SolidBrush(Me.Button1.ForeColor) e.Graphics.DrawString(Me.Button1.Text, Me.Button1.Font, Brs, Me.Button1.ClientRectangle, Sfrm) 'ブラシの解放 Brs.Dispose() 'StringFormatの解放 Sfrm.Dispose() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox("イメージボタンをクリック") End Sub End Class
これを実行すると以下の様な表示になります。関連する記事
⇒標準コントロールのパネルの使い方について(Panel)
⇒標準コントロールのパネルの使い方について2(複数Panelの表示切替)
⇒パネル上にピクチャボックスを貼付て画像スクロールさせる方法ついて(Panel、PictureBox)
-
フォーム上に各種のコントロールを配置する場合に、パネルを使ってグループ分けを行うことはよくあります。
そこで今回は、の使い方について順を追って説明したいと思います。■パネル上のコントロールを一括 Enabled/Disabled 設定
フォーム上にパネルを張り付けて、そのパネルの上に5個のテキストボックスを張り付けています。 更にパネルへの処理を行う為に1個のボタンを配置します。
以下のソースを見て下さい。 ボタンのクリックイベントでパネルの Enabled の値を反転しています。
パネルへの Enabled 値を設定することで、パネルの上のコントロールを全て不可設定にできます。 これは結構便利だと思います。Public Class frmPanel1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'パネルの「Enabled」を反転設定 Me.Panel1.Enabled = Not (Me.Panel1.Enabled) End Sub End Classこれを実行すると以下の様な表示になります。右側はボタンをクリックしてパネルを Disabled にした状態です。
■パネル上の個別のコントロールの Enabled/Disabled 設定との関係
次は、パネルのテキストボックスの直前にチェックボックスを配置して、デフォルトとして Checked の状態にします。 それぞれのチェックボックスの変化でテキストボックスの許可を設定してやります。
Public Class frmPanel2 'パネルの「Enabled」を反転 Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click Me.Panel1.Enabled = Not (Me.Panel1.Enabled) End Sub 'チェックボックスの「Checked」をパネルの「Enabled」に設定 Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged Me.TextBox1.Enabled = Me.CheckBox1.Checked End Sub Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged Me.TextBox2.Enabled = Me.CheckBox2.Checked End Sub Private Sub CheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox3.CheckedChanged Me.TextBox3.Enabled = Me.CheckBox3.Checked End Sub Private Sub CheckBox4_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox4.CheckedChanged Me.TextBox4.Enabled = Me.CheckBox4.Checked End Sub Private Sub CheckBox5_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox5.CheckedChanged Me.TextBox5.Enabled = Me.CheckBox5.Checked End Sub End Classこれを実行すると以下の様な表示になります。 右側は1個目と、4個目のチェックボックスをOFFにしてテキストボックスを Disabled にした後で、 ボタンをクリックしてパネルを Disabled にした状態です。
パネルの Enabled を Disable にした場合にはパネル上のコントロールの状態のまま不可状態(パネル全体に灰色)になります。 再度ボタンをクリックすれば、元の状態になることが分かります。■パネル上のテキストボックス一括クリア
上記のフォームにボタンを追加して、そのボタンクリック時の処理として、パネル上のテキストボックスを全てクリアする方法を示します。
パネルにはその上に存在するコントロールを Controls プロパティに持っているので、 それを For Each 文で順次取得し、取得されたテキストボックスに対して処理を行います。Public Class frmPanel3 'パネルの「Enabled」を反転 Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click Me.Panel1.Enabled = Not (Me.Panel1.Enabled) End Sub 'チェックボックスの「Checked」をパネルの「Enabled」に設定 Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged Me.TextBox1.Enabled = Me.CheckBox1.Checked End Sub Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged Me.TextBox2.Enabled = Me.CheckBox2.Checked End Sub Private Sub CheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox3.CheckedChanged Me.TextBox3.Enabled = Me.CheckBox3.Checked End Sub Private Sub CheckBox4_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox4.CheckedChanged Me.TextBox4.Enabled = Me.CheckBox4.Checked End Sub Private Sub CheckBox5_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox5.CheckedChanged Me.TextBox5.Enabled = Me.CheckBox5.Checked End Sub 'パネル上のテキストボックスをクリア Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'パネルに貼ってある全てのコントロールを取得 For Each obj In Me.Panel1.Controls If TypeOf obj Is TextBox Then 'コントロールが TextBox の場合、Textクリア DirectCast(obj, TextBox).Text = "" End If Next End Sub End Class
これを実行すると以下の様な表示になります。 左側は1個目と2個目、4個目のテキストボックスに値を入力した後で、ボタンをクリックしてパネルを Disabled にした状態です。
その後、「Panel 上の TextBox クリア」のボタンをクリックした様子が右側の図となります。関連する記事
⇒標準コントロールのパネルの使い方について2(複数Panelの表示切替)
⇒パネル上にピクチャボックスを貼付て画像スクロールさせる方法ついて(Panel、PictureBox)
-
通常プログラムを組んでいて計算処理を行う場合にはそこまで気にすることは無いのですが、 小数点以下の計算で誤差が生じない様にするため金額計算では Decimal 型変数を使い、 科学計算的な場合には Double 型変数を使用する様にしています。
また、ループの指標等、少ない桁の整数の場合には Integer 型変数を使い、 桁数が多い整数の計算では Long 型変数を使います。
尚、各データ型の内容ですが以下の様になっています。■各データ型について
データ型 型説明 サイズ 有効桁数 値の範囲 Integer 整数型 4バイト -2147483648 ~ 2147483647 Long 長整数型 8バイト -9223372036854775808 ~ 9223372036854775807 Single 単精度浮動小数点型 4バイト 7桁 -3.40282347E+38 ~ 3.40282347E+38 Double 倍精度浮動小数点型 8バイト 15桁 -1.7976931348623157E+308 ~ 1.7976931348623157E+308 Decimal 10進型 16バイト 28桁 -7.9228162514264337594E+28 ~ 7.9228162514264337594E+28 ■Single 型と Double 型について
浮動小数点型は内部的に符号部、指数部、仮数部に分けてデータを持っているそうです。 Single 型は符号部(1ビット)、指数部(8ビット)、仮数部(23ビット) で Double 型は符号部(1ビット)、指数部(11ビット)、仮数部(52ビット) で構成されているらしいです。 (詳しくは IEEE 754 の説明にあたって下さい。)
Single 型 Double 型の計算を行わせてどのくらいの精度があるのかを見てみます。
以下のソースでは小数「0.1」を10回加算して結果を有効桁20桁までで表示させています。 「0.1」と言う数値は2進数にすると「0.00011001100110011…」の循環小数になることはよく知られています。 これを10回加算して結果が数学的に「1」になるでしょうか?Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click '単精度数値変数 Dim sngVal As Single = 0 '倍精度数値変数 Dim dblVal As Double = 0 'それぞれ「0.1」を10回加算 For i As Integer = 1 To 10 sngVal += 0.1F 'リテラルで「F」指定は単精度数値 dblVal += 0.1D 'リテラルで「D」指定は倍精度数値 Next '結果が「1」になることを期待? Console.WriteLine("Single Data = {0}", sngVal.ToString("G20")) Console.WriteLine("Double Data = {0}", dblVal.ToString("G20")) End Sub実行結果がコンソールには以下様に表示されます。 やはり「1」にはなりません。 リテラルで加算される「0.1」は循環小数なので内部的にはどこかで丸めが発生しているからです。
Single Data = 1.00000012 Double Data = 0.99999999999999989
Single 型では有効桁数が少ないので、小数以下4桁どうしの乗算を行うと小数以下8桁まで必要になりますが、 小数以下8桁以降は信頼できない値になります。これでは科学計算には向かないので、 Double 型を使うことになります。
■Decimal 型について
上記の処理を Decimal 型に変えて処理します。
Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click '10新型数値変数 Dim decVal As Decimal = 0 '「0.1」を10回加算 For i As Integer = 1 To 10 decVal += 0.1D 'リテラルで「D」指定は10新型数値 Next '結果が「1」になることを期待? Console.WriteLine("Decimal Data = {0}", decVal.ToString("G20")) decVal = 0.1D Console.WriteLine("Decimal Data = {0}", decVal.ToString("G30")) End Sub実行結果がコンソールには以下様に表示されます。 確かにこの程度の小数以下の精度では問題無い様です。
Decimal Data = 1 Decimal Data = 0.1
Decimal 型はデータサイズも大きく内部での計算は他の型よりも時間が掛かりますが、 会計処理などでは小数点以下の精度に正確性が求められますので、この型を使います。
私が組むプログラムは OA 系の処理が多いので数値は全て Decimal 型を使っています。 まれに、工場のライン監視などで計測データが必要なときは Double 型も使いますが、 そこまで速度が要求されなければ Decimal 型を使います。
■リテラル(直値)宣言の注意
プログラム上で直接値(リテラル)を宣言する場合に注意が必要です。 値を正しく宣言しないと期せずして異なるデータ型で処理されてることがあります。
以下のソースは小数点付きで宣言した場合と、小数点無し(整数)で宣言した場合に、数値の後ろにデータ型を指示する文字を 付加する場合としない場合の例を示します。Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click '各種データ型を入れるため「Object」型 Dim objTest As Object = Nothing 'Decimal型のリテラル objTest = 0.1 Console.WriteLine("Type = {0}", objTest.GetType.ToString) 'Single型のリテラル objTest = 0.1F Console.WriteLine("Type = {0}", objTest.GetType.ToString) 'Integer型のリテラル objTest = 12345 Console.WriteLine("Type = {0}", objTest.GetType.ToString) 'Long型のリテラル objTest = 12345L Console.WriteLine("Type = {0}", objTest.GetType.ToString) End Sub実行結果がコンソールには以下様に表示されます。
Type = System.Double Type = System.Single Type = System.Int32 Type = System.Int64
■各データ型のリテラル指定について
データ型 型説明 リテラル指定 Integer 整数型 I Long 長整数型 L Single 単精度浮動小数点型 F Double 倍精度浮動小数点型 R Decimal 10進型 D 関連する記事
⇒指定した精度の桁数に数値を切り上げ :[Math.Ceiling,Math.Floor]
⇒文字列から数値型への変換(parse - tryparse)
⇒オブジェクト型から数値型への変換(TryParse)
-
バイナリファイルからのバイト配列への読込処理と、バイト配列からバイナリファイルへの書込処理について記します。 通常テキストファイルはバイナリファイルとは異なるものとして扱いますが、 ファイルの中身は文字コードのみで構成されたバイナリファイルとして取り扱いができます。 (データファイルは全てバイナリファイルであるとも言えますが)
■バイト配列からバイナリファイルへの書込処理
それではファイルを読込むためにファイルが存在しないと始まらないので、 バイナリファイルをバイト配列から書込む処理を説明します。
バイト配列は適当にデータを生成するとして、書込処理には System.IO.FileStream クラスの Write メソッドを使用します。Private Sub btnWrite_Click(sender As Object, e As EventArgs) Handles btnWrite.Click '書込むバイト型配列:Shift-JISの文字 "I" "J" "K" "L" "0" "1" "2" Dim arrByte As Byte() = New Byte() {&H49, &H4A, &H4B, &H4C, &H30, &H31, &H32} 'ファイルを作成して書込む (存在する場合は上書き) Dim fs As New System.IO.FileStream("sample.txt", System.IO.FileMode.Create, System.IO.FileAccess.Write) 'バイト型配列の内容をすべて書き込む fs.Write(arrByte, 0, arrByte.Length) '閉じる fs.Close() End Sub■バイナリファイルからバイト配列への読込処理
バイナリファイルからの読込処理では最初に System.IO.FileStream クラスを生成することで対象ファイルをオープンします。 System.IO.FileStream クラスの長さのプロパティ Length 分のバイト配列を宣言し Read メソッドで読込を行います。
Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click 'ファイルを開く Dim fs As New System.IO.FileStream("sample.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを読み込むバイト型配列を作成 Dim arrByte(fs.Length - 1) As Byte 'ファイルの内容を全て読込 fs.Read(arrByte, 0, arrByte.Length) 'ファイルを閉じる fs.Close() 'バイト配列を16進数表記の文字列で表示(各要素を「-」で連結) Console.WriteLine(BitConverter.ToString(arrByte)) End Sub実行結果がコンソールには以下様に表示されます。確かに書込み処理されたデータが読み込まれています。
49-4A-4B-4C-30-31-32
■大きなバイナリファイルの分割読込処理
上記の読込処理では System.IO.FileStream クラスでオープンした後でファイルの大きさでバイト配列を宣言しましたが、 ファイルサイズが非常に大きい場合、メモリ確保に負担が掛かります。 そのため以下の様に、固定のバイト数での読込を複数回処理することで全ての読込処理が行えます。
Read メソッドは順次読込を行いますが、ファイルの最後まで読込、更にこのメソッドを呼び出すと結果として「0」が返ります。 よって、「0」が返った時点で処理を終了します。Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click 'ファイルを開く Dim fs As New System.IO.FileStream("sample.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを16バイトずつ読み込むバイト型配列を作成 Dim arrByte(16 - 1) As Byte While True 'ファイルの内容を全て読込 Dim nRead As Integer = fs.Read(arrByte, 0, arrByte.Length) If nRead = 0 Then Exit While End If '部分読込データ処理 'バイト配列を16進数表記の文字列で表示(各要素を「-」で連結) Console.WriteLine(BitConverter.ToString(arrByte)) End While 'ファイルを閉じる fs.Close() End Sub実行結果がコンソールには以下様に表示されます。 書込まれているデータが7バイトのため、16バイト以下の読込となり1回で処理が終わることになります。
49-4A-4B-4C-30-31-32-00-00-00-00-00-00-00-00-00
■バイナリファイルのコピー処理
上記の分割読込処理を元にバイナリファイルコピーの処理を関数としてまとめてみました。
'''
''' バイナリファイルコピー ''' ''' <param name="SrcPath">コピー元のフルパスファイル名</param> ''' <param name="DesPath">コピー先のフルパスファイル名</param> ''' <param name="nSize">コピー分割処理バイト数</param> '''True:正常終了, False:NG '''エラーは詳細に処理していません Public Function CopyBinaryFile(ByVal SrcPath As String, ByVal DesPath As String, ByVal nSize As Integer) As Boolean CopyBinaryFile = True '読み書きの FileStream 宣言 Dim fsRead As System.IO.FileStream = Nothing Dim fsWrite As System.IO.FileStream = Nothing Try '読込ファイルを開く fsRead = New System.IO.FileStream(SrcPath, System.IO.FileMode.Open, System.IO.FileAccess.Read) '書込ファイルを開く fsWrite = New System.IO.FileStream(DesPath, System.IO.FileMode.Create, System.IO.FileAccess.Write) 'バイト配列宣言 Dim arrByte = New Byte(nSize - 1) {} 'コピー処理ループ While True '元のファイル読込 Dim nRead As Integer = fsRead.Read(arrByte, 0, nSize) If nRead = 0 Then Exit While End If 'コピー先に書込 fsWrite.Write(arrByte, 0, nRead) End While Catch ex As Exception 'エラー処理 Return False Finally 'ファイルクローズ If Not fsRead Is Nothing Then fsRead.Close() End If If Not fsWrite Is Nothing Then fsWrite.Close() End If End Try End Function 'バイナリファイルコピーのテスト用ボタンクリック処理 Private Sub btnCopy_Click(sender As Object, e As EventArgs) Handles btnCopy.Click Dim blnRet As Boolean = CopyBinaryFile("sample.txt", "sample2.txt", 4) Console.WriteLine("CopyBinaryFile...{0}", blnRet) End Sub関連する記事
⇒配列の使い方について(Dim, Redim)
⇒配列の使い方の注意点について(コピー, Clone)