リストボックスの表示を全角・半角を揃えるには?

解決


ドラミc  2009-01-08 18:08:13  No: 141228  IP: 192.*.*.*

質問するのは、初めてですが…。
いつもお世話になってます。

この掲示板でよく助けられています。

さっそく質問させて下さい。

画面上に、
・テキストボックス1(ファイル名)
・テキストボックス2(ファイル名)
・コンボボタン
・リストボックス

の計4つがあります。


リストボックスには以下の用に出力させたいです。
  1.テキストボックス1で入力したファイル名(拡張子無)
      テキストボックス1
      テキストボックス2

  2.リストボックスは1行表示なので、スペースをうまく使い、
      1番の値を表示させます。

例)テキストボックス1  =  test.txt
    テキストボックス2  =  テスト.txt

    リストボックス  =  test        テスト.txt            test.txt            
              桁数  =  1234567890  12345678901234567890  12345678901234567890


一応、半角のみだと動くのですが…。

テキストボックス2の"テスト"が半角同様の動きになり、表示位置がずれてしまいます。
※グリットにすれば簡単かもしれませんが、その後の処理に影響する為、どうしてもリストボックス使用になりました。

何かアドバイス頂けたら嬉しいです。
ソースは長くなるので、次に記述します。

宜しくお願い致します。

編集 削除
ドラミc  2009-01-08 18:09:23  No: 141229  IP: 192.*.*.*

■ソース■
'=====================================================================
'パスより、ファイル名のみを取得
'≪引数≫
'  sText1      = (テキストボックス)ファイル名1
'  sText2      = (テキストボックス)ファイル名2
'≪戻り値≫
'  Get_FileName    = リストボックス表示
'=====================================================================
Private Function Get_FileName(ByVal sText1 As String, ByVal sText2 As String) As String

    'FileSystemObject(FSO)の新しいインスタンスを生成します。
    Dim cFso                As FileSystemObject
    Set cFso = New FileSystemObject

    'ファイル名(ベース名,拡張子)を格納する変数
    Dim sBaseName      As String                   'ベース名格納
    Dim sTextFileName1    As String                   'テキスト1のファイル名格納
    Dim sTextFileName2    As String                   'テキスト2のファイル名格納
    
    'リストボックス表示時の間隔を格納する変数
    Dim sBaseName_sp        As String                   'ベース名 + スペース(10バイト)
    Dim sTextFileName1_sp  As String                   'テキスト1のファイル名 + スペース(20バイト)
    Dim sTextFileName2_sp  As String                   'テキスト2のファイル名 + スペース(20バイト)
    
    'リストボックス表示時の間隔を判定結果を格納する変数
    Dim sBN_Length          As Long                     'ベース名+スペースの文字長
    Dim sTF1_Length         As Long                     'テキスト1のファイル名+スペースの文字長
    Dim sTF2_Length         As Long                     'テキスト2のファイル名+スペースの文字長

    'ファイル名を取得
    sTextFileName1 = cFso.GetFileName(sText1)
    sTextFileName2 = cFso.GetFileName(sText2)

    'ベース名を取得
    sBaseName = cFso.GetBaseName(sTextFileName1)
    
    'ファイル or ベース名 + スペースを格納
    sBaseName_sp = sBaseName & Space(10)
    sTextFileName1_sp = sTextFileName1 & Space(20)
    sTextFileName2_sp = sTextFileName2 & Space(20)
    
    'ファイル or ベース名 + スペースの文字長さを取得
    sBN_Length = LenB(StrConv(sBaseName_sp, vbFromUnicode))
    sTF1_Length = LenB(StrConv(sTextFileName1_sp, vbFromUnicode))
    sTF2_Length = LenB(StrConv(sTextFileName2_sp, vbFromUnicode))
    
    If sBN_Length <> 10 Then
        sBaseName_sp = Left(sBaseName_sp, 10)
    End If
    
    If sTF1_Length <> 20 Then
        sTextFileName1_sp = Left(sTextFileName1_sp, 20)
    End If
    
    If sTF2_Length <> 32 Then
        sTextFileName2_sp = Left(sTextFileName2_sp, 20)
    End If

    Get_FileName = sBaseName_sp & Space(2) & sTextFileName2_sp & Space(2) & sTextFileName1_sp
            
    Set cFso = Nothing

End Function

編集 削除
ドラミc  2009-01-08 18:18:22  No: 141230  IP: 192.*.*.*

書き忘れました!

環境はVB6を使用しています。

すみません。

編集 削除
魔界の仮面弁士  2009-01-08 20:01:01  No: 141231  IP: 192.*.*.*

ListBox でなければならないのでしょうか?
ListView や MSHFlexGrid を使った方が良い気がしますけれども…。

たとえば、ListView コントロール(エクスプローラの右側)を
詳細表示、列ヘッダ表示無し、行全体を選択というモードで利用するとか。

Private Sub Form_Load()
    ListView1.View = lvwReport
    ListView1.LabelEdit = lvwManual
    ListView1.FullRowSelect = True
    ListView1.HideColumnHeaders = True

    '列幅決定
    ListView1.ColumnHeaders.Clear
    ListView1.ColumnHeaders.Add().Width = 720
    ListView1.ColumnHeaders.Add().Width = 1440
    ListView1.ColumnHeaders.Add().Width = 1440

    '「test」「テスト.txt」「test.txt」を登録
    With ListView1.ListItems.Add(Text:="test").ListSubItems
        .Add Text:="テスト.txt"
        .Add Text:="test.txt"
    End With
End Sub

編集 削除
ドラミc  2009-01-08 20:14:32  No: 141232  IP: 192.*.*.*

魔界の仮面弁士様
回答ありがとうございます。

私も<MSHFlexGrid>がいいと思ったのですが、
現在作成中のプログラムは私と、別の方との2人で作成していまして…。

私が画面(+大まかな動作)、別の方が中身の処理を作成しているんです。
なので、その方の強い要望により、<ListBox>限定になりました。




<ListView>は初めて聞いた単語です。
今後の為に、勉強させていただきます!!
ありがとうございます。

編集 削除
魔界の仮面弁士  2009-01-08 22:28:47  No: 141233  IP: 192.*.*.*

MSHFlexGrid の場合、ListBox とは見た目が大きく異なりますが、
> たとえば、ListView コントロール(エクスプローラの右側)を
> 詳細表示、列ヘッダ表示無し、行全体を選択というモードで利用するとか。
であれば、見た目は殆ど変わらなくなりますよ。


ListBox で行うのであれば、せめてタブ区切りにされては如何でしょう?


Option Explicit

Private Declare Function SendMessageA Lib "user32" _
   (ByVal hWnd As OLE_HANDLE, _
    Optional ByVal m As Long = &H192&, _
    Optional ByVal wParam As Long, _
    Optional ByRef lParam As Long) As Long

Private Sub Form_Load()
    SetTabPos List1, 80, 150
End Sub

Private Sub Command1_Click()
    List1.AddItem "test" & vbTab & "テスト.txt" & vbTab & "test.txt"
    List1.AddItem "試験方法" & vbTab & "評価.txt" & vbTab & "sample.txt"
    List1.AddItem "LB_SETTABSTOPS" & vbTab & "Function.txt" & vbTab & "API.txt"
End Sub


Private Sub SetTabPos(ByVal ListBox As ListBox, ParamArray tabPos() As Variant)
    Dim t() As Long, c As Long, v As Variant
    ReDim t(UBound(tabPos) + 1)
    For Each v In tabPos
        t(c) = CLng(v)
        c = c + 1
    Next
    SendMessageA ListBox.hWnd, , c, t(0)
End Sub

編集 削除
ドラミc  2009-01-20 10:28:34  No: 141234  IP: 192.*.*.*

おそくなりました!!
ありがとうございます。

なんとか、出来ました!!

魔界の仮面弁士さんが言ってたようにタブ区切りにした方が、
断然きれいでした!!

本当にありがとうございます。

編集 削除