リストボックスの指定位置に複数のタブストップ位置を設定 (3個) (SNo.106) 表示した項目を個別に取り出す 配列データの表示方法 |
|
使用コントロール | Button1 ListBox1 |
その他条件 | WindowsXP(Vista) Visual Basic 2005(VB2008) |
★ リストボックスの指定位置に複数のタブストップ位置を設定
'Win32 API 関数の宣言 '指定のウィンドウにメッセージを送る(P750)
<System.Runtime.InteropServices.DllImport("user32", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function SendMessage( _ ByVal hWnd As IntPtr, _ ByVal wMsg As Int32, _ ByVal wParam As Int32, _ ByVal lParam() As Int32) As Int32 End Function 'システムフォントの平均文字サイズを取得する(P149) <System.Runtime.InteropServices.DllImport("user32")> _ Private Shared Function GetDialogBaseUnits( _ ) As Integer End Function 'リストボックスのタブストップ位置を設定する(P828) Private Const LB_SETTABSTOPS As Integer = &H192 'ListBox に任意の個数のタブストップを設定するプロシージャ Private Sub sSetListBoxTabStop(ByRef myControl As System.Windows.Forms.ListBox, _ ByVal ParamArray TabPos() As Integer) 'ListBox に任意の個数のタブストップを設定する Dim i, DUnit, LowWord, TabCount As Integer TabCount = UBound(TabPos) 'タブ設定の数( - 1) Dim TabStop(TabCount) As Integer 'タブストップ位置の配列 'ダイアログボックスベース単位を取得(ピクセル) DUnit = GetDialogBaseUnits() LowWord = (GetDialogBaseUnits() And &HFFFF) \ 2 '下位ワードで幅を取得 For i = 0 To TabCount TabStop(i) = CInt(TabPos(i) * LowWord) ' 32 =全角で4文字(標準) Debug.WriteLine(TabStop(i)) Next i 'タブ位置を設定(TabCount + 1 が1の場合すべて同じ間隔になる) SendMessage(myControl.Handle, LB_SETTABSTOPS, TabCount + 1, TabStop) myControl.Refresh() End Sub '半角換算での12文字目と32文字目にタブを設定 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 'MS Pゴシックでも OK です。 ListBox1.Font = New Font("MS ゴシック", 12) '半角換算での12文字目と32文字目にタブを設定 sSetListBoxTabStop(ListBox1, 12, 32) End Sub '選択した項目のデータを個別に取り出し Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged '結合したデータを取り出す場合 Dim myData() As String Dim sTmp As String sTmp = ListBox1.SelectedItem 'String.Split メソッドで TAB 位置でのデータの分割(Split関数でも可) myData = sTmp.Split(ControlChars.Tab) Dim i As Integer For i = myData.GetLowerBound(0) To myData.GetUpperBound(0) Debug.WriteLine(myData(i)) Next i End Sub 'テスト用データの表示 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'テスト用データの表示 With ListBox1 .Items.Add("12345678901234567890123") .Items.Add("〒527-0011" & ControlChars.Tab & "八日市市 12-12" & _ ControlChars.Tab & "蚊取 新語") .Items.Add("〒547" & ControlChars.Tab & "大津市 12-1" & _ ControlChars.Tab & "木邑 多来也") '配列等のデータの場合は、String.Join メソッドを使って結合すれば便利かと思います Dim myData() As String = {"〒555-0011", "彦根市 城町 1-15", "草柳 強"} Dim sTmp As String sTmp = String.Join(ControlChars.Tab, myData) .Items.Add(sTmp) End With End Sub |
|
実行結果 (12文字目と 32文字目にタブ位置を設定) 又、下記のような方法もあります。 HOW TO: Set Tab Stops in a List Box by Using Visual Basic .NET |