列の頭をそろえてリストボックスに複数列表示するには?

解決


COTA  2007-02-22 22:51:25  No: 135416

アクセスのデータをリストボックスに複数列、列の先頭をそれぞれ揃えて表示したいのですが。。。

2列目の「かな」が1文字または2文字だとあとの3列目、4列目がずれてしまいます。
コードが問題なのでしょうか?
それとも他に考えられる原因があるのでしょうか?

ID      かな        保険種類        証券番号

-----------------------------------------------
1       たけだ      自動車保険      1111-1111    |
2       こやま      自動車保険      2222-2222    |  ←リストボックス
3       わだ   自動車保険    3333-3333           |
4       たけおか    自動車保険      4444-4444    |
                        :                      |
                        :                      |
-----------------------------------------------

  <コード>

Private Sub Command1_Click()

List1.Clear

Dim mdb As Database
Dim SQL As String
Dim mrs As Recordset
Dim textID As Integer

  textID = Val(Text1.Text)
  
  'データベースをオープン
  Set mdb = OpenDatabase("顧客契約2.mdb")
  
    
'text1が入力されていたら
 If Text1.Text <> "" And Text2.Text = "" And Text3.Text = "" And Text4.Text = "" Then
  
  
  '選択クエリーを取得
 SQL = "select 顧客TBL.顧客ID,顧客TBL.顧客かな,契約TBL.保険種類,契約TBL.証券番号 from 顧客TBL  left join 契約TBL on 顧客TBL.顧客ID = 契約TBL.顧客ID where 顧客TBL.顧客ID = " & textID & " "
                                                                                                                                                  
   
'条件に一致するレコードを取得
 Set mrs = mdb.OpenRecordset(SQL, dbOpenDynaset)
      
     
               'データがなければ
                If mrs.RecordCount = 0 Then
                   MsgBox "データがみつかりません"
                End If
            
             
           i = 0
           With List1
           Do Until mrs.EOF
           
 'リストボックスに取得したレコードを追加
 List1.AddItem Left(mrs.Fields("顧客ID") & Space(3), 3) + vbTab + Left(mrs.Fields("顧客かな") & Space(10), 10) + vbTab + Left(mrs.Fields("保険種類") & Space(10), 10) & "" + vbTab + mrs.Fields("証券番号") & ""
      
           
           
           i = i + 1
           mrs.MoveNext
           Loop
           End With
           mrs.Close
           
                    
    End If

どんな原因が考えられるのでしょうか?
よろしくお願いします。


魔界の仮面弁士  2007-02-22 23:01:40  No: 135417

ListBox ではなく、ListView では駄目なのでしょうか?

詳細表示にして、列ヘッダ無しの行全体選択モードに指定しておけば、
列数を指定可能なリストボックスとして利用できますけど。


通ってみた  2007-02-22 23:03:15  No: 135418

かなが全角なのに対し、空白が半角だからではないでしょうか


COTA  2007-02-23 18:34:10  No: 135419

魔界の仮面弁士様  
ありがとうございます。
>ListBox ではなく、ListView では駄目なのでしょうか?
listviewでもいいのですが、今回の原因が知りたくて。。。

通ってみた様
ありがとうございます。
>かなが全角なのに対し、空白が半角だからではないでしょうか
入力している文字を確認しましたが半角の空白が原因ではないようです。。


大吉末吉  2007-02-23 20:00:08  No: 135420

おそらく、ListBoxのTabの動作によるのでしょうね。

「LB_SETTABSTOPS Message」
http://msdn2.microsoft.com/en-us/library/ms671443.aspx
にあるように、
----------------------------------------------------------
(略)the number of quarters of the average character width(略)
(略)the default tab stop is two dialog template units(略)
----------------------------------------------------------

どこでTabが動作するかは、「フォントの平均幅」を基準によって決まります。
つまり、「(平均フォント幅より)幅の狭い文字」を多用するとTab位置に届かないということになります。
#逆に「(平均フォント幅より)幅の広い文字」を多用する1つ次のTab位置まで言ってしまうことも・・・

固定幅のフォントを使ってみてはどうでしょう?


大吉末吉  2007-02-23 20:08:56  No: 135421

> 固定幅のフォントを使ってみてはどうでしょう?

あ!  これで実際にやってみると、逆に文字数が多い場合、ずれてしまいますね。

となると、Spaceの付加は止めて、前述の「LB_SETTABSTOPS Message」で、
Tab位置を指定するのが確実かも。


COTA  2007-03-03 00:23:26  No: 135422

みなさんたくさんアドバイスありがとうございます。
大吉末吉様 
<となると、Spaceの付加は止めて、前述の「LB_SETTABSTOPS Message」で、
<Tab位置を指定するのが確実かも。
教えていただいたところ
を読んでみたのですがわからなかったのでいろいろ試したところ、

<列の位置がずれてしまっていたときのコード>
List1.AddItem Left(mrs4.Fields("顧客ID") & Space(3), 3) _
+ vbtab + Left(mrs4.Fields("顧客かな") & Space(10), 10) _  ←10から11にかえた。
+ vbtab + Left(mrs4.Fields("保険種類") & Space(10), 10) & "" _
+ vbtab + mrs4.Fields("証券番号") & ""

               ↓ ↓

<列の位置が揃ったときのコード>
List1.AddItem Left(mrs4.Fields("顧客ID") & Space(3), 3) _
+ vbtab + Left(mrs4.Fields("顧客かな") & Space(10), 11) _    ←
+ vbtab + Left(mrs4.Fields("保険種類") & Space(10), 10) & "" _
+ vbtab + mrs4.Fields("証券番号") & ""

2列目(顧客かな)の left関数の取り出す文字列の文字数を変えたところ
2列目が2文字のときも他の行と揃いました!
これは11文字の他に、取り出す文字数を変えると列が揃ったり揃わなかったりいろいろ変わってしまって
11文字がきれいにそろったので11にしたのです。

しかし、原因がわかりません。
だれかわかる方教えてくださ〜い・・


大吉末吉  2007-03-03 00:51:46  No: 135423

> 2列目が2文字のときも他の行と揃いました!
1文字の時もちゃんと揃いますか?

> しかし、原因がわかりません。
・・・原因は、既に言いましたけど・・・

ためしに、
-----------------------------------------------------------
Private Sub Form_Load()
Dim i As Long

For i = 1 To 10
    List1.AddItem Left(i & Space(3), 3) _
    + vbTab + Left(String(i, "あ") & Space(10), 10) + "." _
    + vbTab + "3列目"
Next
For i = 1 To 10
    List1.AddItem Left(i & Space(3), 3) _
    + vbTab + Left(String(i, "あ") & Space(10), 9) + "." _
    + vbTab + "3列目"
Next

End Sub

-----------------------------------------------------------
こういうプログラムを実行してみてください。
#最後のSpaceを"."に変えたものです。

「.」の位置がそろっていないですよね?


COTA  2007-03-03 03:19:44  No: 135424

大吉末吉様
ありがとうございます。

1文字の時、ずれてしまいました・・・・

教えていただいたコードでためしたところ
おっしゃるとおり"."がずれていました。

tabの位置を指定すればいいのでしょうか?
どうしたらいいのかわかりません(><)


大吉末吉  2007-03-03 03:53:11  No: 135425

> tabの位置を指定すればいいのでしょうか?

既に返答済みですので、改めて言うまでも無いですね。

> となると、Spaceの付加は止めて、前述の「LB_SETTABSTOPS Message」で、
> Tab位置を指定するのが確実かも。

それから、
> どうしたらいいのかわかりません(><)
って、

> >ListBox ではなく、ListView では駄目なのでしょうか?
> listviewでもいいのですが、今回の原因が知りたくて。。。

「理由が知りたい」だけなんじゃなかったんですか?

#「ListView」にすれば済むんですよね?


大吉末吉  2007-03-03 05:38:29  No: 135426

念の為、
LB_SETTABSTOPS のサンプルが載っているページを紹介しておきます。

「PRB: Cannot Set TabStops in ListBox Using SendMessage API」
http://support.microsoft.com/kb/183518/en-us

#「Styleを『チェックボックス』にすると『LB_SETTABSTOPS』が使えないよ」という趣旨のページですが・・・

タブ位置&個数は調整してください。


COTA  2007-03-05 18:26:40  No: 135427

大吉末吉様
ほんとにありがとうございます。
お手数かけさせてすみませんでした・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加