-
フォーム上に複数のパネルを配置して、ある条件のもとで各パネルを表示することで異なる処理が行えます。
今回は2個のパネルをフォーム上に貼り、それぞれのパネルは異なるコントロールを配置します。
1個目はテキストボックスを5個配置し、2個目のパネルはチェックボックスを5個配置します。
更に、パネルの切り替え用にラジオボタンを2個設置します。 デザイン画面では以下の様になります。
尚、ソースは以下の様になります。
フォームロード時にフォームの幅を1個のパネルのみを表示する幅に設定し、パネル2の座標位置をパネル1と同じにします。 また、初期のパネル切替を行う為にパネル1の状態を「ON」にします。
パネルそれぞれに対応するラジオボタンのクリック時に、対応するパネル切替を行う様にしています。2個のパネルの表示切替
Public Class frmPanelM1 ' フォームロード時処理 Private Sub frmPanelM1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'ウインドウの横幅を1個のパネルのみ表示する「300」にする Me.Width = 300 'パネル2の横位置をパネル1と同位置にする Me.Panel2.Left = Me.Panel1.Left '最初のパネル1に設定 Me.RadioButton1.Checked = True End Sub ' ラジオボタン1変化時処理 Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged If DirectCast(sender, RadioButton).Checked = True Then ' ラジオボタン1がONの場合、パネル1表示 Call Me.DisplayPanel(1) End If End Sub ' ラジオボタン2変化時処理 Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged If DirectCast(sender, RadioButton).Checked = True Then ' ラジオボタン2がONの場合、パネル2表示 Call Me.DisplayPanel(2) End If End Sub ' パネル表示切替処理 Private Sub DisplayPanel(ByVal intPanelNo As Integer) Select Case intPanelNo Case 1 Me.Panel1.Visible = True Me.Panel2.Visible = False Case 2 Me.Panel1.Visible = False Me.Panel2.Visible = True End Select End Sub End Classこれを実行すると以下の様な表示になります。右側はラジオボタン2をクリックしてパネル2を表示した状態です。
(ラジオボタンを交互にチェックすれば、パネル1⇔パネル2が交互に表示されます)関連する記事
⇒標準コントロールのパネルの使い方について(Panel)
⇒パネル上にピクチャボックスを貼付て画像スクロールさせる方法ついて(Panel、PictureBox)
PR -
文字列から数値型への変換は以下のページにありますが、今回はオブジェクト型から数値への変換を記します。
⇒文字列から数値型への変換(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)
-
標準コントロールのボタンは特によく使われると思いますが、 今回は、ボタンに画像を張付けの使い方について順を追って説明したいと思います。
■ボタン上の 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)