[2018/03/22] コントロールのTagプロパティを各種のデータ退避として使用 (No.21)
[2018/03/22] ComboBoxの簡単な拡張クラス (No.20)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
VB.NETの標準コントロールには Tag プロパティがあります。 このプロパティは Form Button TextBox など全ての標準コントロールには存在します。 (標準コントロールは System.Windows.Forms.Control から派生しているので当然なのですが) このプロパティを各種のデータの退避領域として使うのが今回の目的です。
VB.NETの「オブジェクト ブラウザ」で Tag 定義を見てみると以下の様になっています。Tag プロパティについて
Public Property Tag As Object System.Windows.Forms.Control のメンバー 概要: コントロールに関するデータを格納するオブジェクトを取得または設定します。 戻り値: コントロールに関するデータを格納している System.Object。既定値は null です。
Tag プロパティの型は System.Object なのでどんな型のデータを設定しても良いということです。 つまり、Integer型等の数値だったり、Stringだったり、はたまたクラスでもOKです。
今回の例としては、クラスデータを Tag に設定することを行います。 以下のソースをご覧ください。
1個のフォームの中にクラス宣言を行っています。 そのクラスをフォームロードイベントで、2個のボタンの Tag に別々のクラスデータを設定します。 また、ボタンのクリック時にそのクラスのメソッドを呼び出しています。コントロールのTagプロパティを各種のデータ退避として使用(クラスデータ)
Public Class frmTagTest '''
''' テストクラス ''' Class ClsTagTest Private strTest As String '文字列データ Private intTest As Integer '整数データ '''''' コンストラクタ ''' ''' <param name="astrTest">設定文字列</param> ''' <param name="aintTest">設定整数</param> Sub New(ByVal astrTest As String, ByVal aintTest As Integer) '設定値を退避する Me.strTest = astrTest Me.intTest = aintTest End Sub '''''' 表示テストメソッド ''' Public Sub TestDisp() Dim str As String = "strTest : " & Me.strTest & vbCrLf & _ "intTest : " & Me.intTest.ToString MsgBox(str) End Sub End Class '''''' フォームロード時に各ボタンのタグにクラスデータの設定 ''' Private Sub frmTagTest_Load(sender As Object, e As EventArgs) Handles Me.Load '[Button1]のタグにクラスデータ設定 Dim tagTest1 As New ClsTagTest("Test-aaa", 100) Me.Button1.Tag = tagTest1 '[Button2]のタグにクラスデータ設定 Dim tagTest2 As New ClsTagTest("Test-bbb", 200) Me.Button2.Tag = tagTest2 End Sub '''''' ボタンクリックイベント(Handles以降に複数のイベントを記述) ''' Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click 'ボタンに設定されたクラスを取得 Dim tagTest As ClsTagTest = DirectCast(sender, Button).Tag 'クラスのメソッドを呼び出す Call tagTest.TestDisp() End Sub End Classこれは初心者の方向けですが、上記のソースの中での注意点としては、 ボタンクリックのイベントを1カ所に集めて処理する様に、 Handles の所で複数のボタンクリック宣言を行っています。
あともう一つ注意点なのですが、Tag プロパティの初期値は null であることです。 何も設定しない状態で Tag を参照しても結果は何も入っていない状態ですので、 プログラム的には IsNothing か何かで判定して処理を分ける必要があります。
関連する記事
⇒コントロールを配列で処理する方法 :[AddHandler,DirectCast]
⇒コレクション「List」をコントロール配列の様に使う方法
PR -
VB.NETの ComboBox には枠線(ボーダー)を表示するプロパティが標準ではありません。
ComboBox の FlatStyle を Flat に設定すると、 枠線が白色になりよく見えなくなります。 そこで、 ComboBox の簡単な拡張クラスをとして枠線の色を追加のプロパティとして作成しました。
クラス名は名前は ComboBoxEx とします。
ウインドウメッセージの処理の中で、 WM_PAINT のメッセージの処理でコンボボックスコントロールの枠を描画します。 枠線を指定する為のプロパティを BorderColor として定義しています。ComboBoxの簡単な拡張クラス
Imports System Imports System.ComponentModel Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms '''
''' 拡張コンボボックスコントロール ''' '''Public Class ComboBoxEx Inherits System.Windows.Forms.ComboBox Private Const WM_PAINT As Integer = &HF ''' ''' コンストラクタ ''' Sub New() 'ComboBoxのコンストラクタを呼ぶ MyBase.New() End Sub '''''' Windowsメッセージ処理 ''' ''' Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Select Case m.Msg Case WM_PAINT 'ペイントイベントでデフォルトの処理をさせる MyBase.WndProc(m) 'その後で強制的に枠描画 Call DrawRectangle() Case Else MyBase.WndProc(m) End Select End Sub '''''' 枠描画関数 ''' '''再定義可能関数 Protected Overridable Sub DrawRectangle() 'グラフィッククラスの参照取得 Dim g As Graphics = Me.CreateGraphics() '枠の四角い領域 Dim rect As Rectangle = Me.ClientRectangle '描画用のペン生成 Dim framePen As New Pen(Me.BorderColor) Try '枠描画 g.DrawRectangle(framePen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1) Catch ex As Exception Finally 'ペンの解放 framePen.Dispose() End Try End Sub 'ボーダー色退避 Private _BorderColor As Color = System.Drawing.SystemColors.ControlText '''''' ボーダー色プロパティ ''' '''Color値 '''Color値 Public Property BorderColor() As Color Get Return Me._BorderColor End Get Set(ByVal value As Color) Me._BorderColor = value End Set End Property End Class
このクラスを clsComboBoxEx.vb の様な名前で保存し、一度コンパイルすると、ツールボックスの中に ComboBoxExが現れるので、それをフォームに貼り付けます。 フォームに張り付けた時のプロパティウインドウに BorderColor があることがわかります。
フォームにComboBoxExを2個貼り付け、それぞれのボーダーを赤と青に設定した例を示します。
関連する記事
⇒コンボボックスの基本的な使い方(項目に文字列のみを設定)
⇒コンボボックスのItemsプロパティにクラスデータを設定する方法(コードと文字列をセットで設定)