C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: VB6でのリストボックスの境界線について


(過去ログ 22 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■9542 / inTopicNo.1)  VB6でのリストボックスの境界線について
  
□投稿者/ かな (3回)-(2007/10/30(Tue) 18:00:48)

分類:[VB6 以前] 

はじめまして。
早速質問なのですがよろしいでしょうか。
VB6にてフォーム上にリストボックスを1つ作っています。
そしてカラムを3列使うと指定しておきます。(ColumnCount = 3)
ここで質問ですが、この列の境界にラインを引くのは可能でしょうか?
つまり、かんたんな作表をしたいのです。
ちなみに、行の境界線は必要ありません。

すいませんがよろしくお願いします。
引用返信 編集キー/
■9543 / inTopicNo.2)  Re[1]: VB6でのリストボックスの境界線について
□投稿者/ まどか (387回)-(2007/10/30(Tue) 18:17:02)
標準ではできませんので、WindowsAPIを駆使してオーナードローする必要があります。
オーナードローとはすべてユーザーが描画するということですので、中身(文字や背景など)も含めてすべて自力でおこなうことになります。
次のようなキーワードで検索してみるとよいでしょう。
「オーナードロー」「サブクラス化」「WindowProc」「SetWindowLong」「WM_DRAWITEM」「アイコンメニュー」

当然ながらWindowsメッセージやAPIの呼び出し方、リソースやハンドルの取得と解放などについての知識が不可欠です。

と言いながら、一番簡単なのは標準のFlexGrid(Windows Common Controls x)を使うことだと思います。

引用返信 編集キー/
■9544 / inTopicNo.3)  Re[2]: VB6でのリストボックスの境界線について
□投稿者/ 魔界の仮面弁士 (501回)-(2007/10/30(Tue) 18:48:42)
No9543 (まどか さん) に返信
> と言いながら、一番簡単なのは標準のFlexGrid(Windows Common Controls x)を使うことだと思います。

MSFlexGrid や MSHFlexGrid は、Windows Common Controls ではありません。
VideoSoft 社から OEM 提供されている「機能限定版 VSFlexGrid」です。


また、標準の MSFlexGrid / MSHFlexGrid では、「列境界あり/行境界無し」は対応できません。
無理にやるとすれば、こんな方法ぐらいしか…。

ColCount = 3
RowCount = 4
With MSHFlexGrid1
 .Rows = RowCount
 .Cols = ColCount * 2 - 1
 .FixedRows = 0
 .FixedCols = 0
 .GridLines = flexGridNone
 .HighLight = flexHighlightNever
 
 .FillStyle = flexFillRepeat
 For c = 1 To .Cols - 1 Step 2
  .Row = 0
  .Col = c
  .RowSel = .Rows - 1
  .ColSel = c
  .ColWidth(c) = Screen.TwipsPerPixelX
  .CellBackColor = vbBlack
 Next
 
 .FillStyle = flexFillSingle
 n = 0
 For r = 0 To .Rows - 1
  For c = 0 To .Cols - 1 Step 2
   n = n + 1
   .TextMatrix(r, c) = CStr(n)
  Next
 Next
 .Row = 0
 .Col = 0
End With



■No9542 (かな さん) に返信
> そしてカラムを3列使うと指定しておきます。(ColumnCount = 3)

ListBox の高さが 4 行分だったとし、項目が 19 個あったとします。
その場合、ColumnCount = 3 とは、

 ┏━━━━━━━━━┳━┓
 ┃  1   2   3 ┃△┃
 ┃  4   5   6 ┃ ┃可視領域
 ┃  7   8   9 ┃ ┃
 ┃ 10  11  12 ┃▽┃
 ┗━━━━━━━━━┻━┛
 │ 13  14  15 │ │
 │ 16  17  18 │ │スクロール領域
 │ 19       │ │
 └─────────┴─┘

という縦スクロール配置ではなく、

 ┏━━━━━━━━━┓──────┐
 ┃  1   5   9 ┃ 13  17 │
 ┃  2   6  10 ┃ 14  18 │
 ┃  3   7  11 ┃ 15  19 │
 ┃  4   8  12 ┃ 16    │
 ┣━━━━━━━━━┫──────┤
 ┃≪       ≫┃      │
 ┗━━━━━━━━━┛──────┘
   可視領域      スクロール領域

という横スクロール配置になりますが、その点は問題ないですか?

引用返信 編集キー/
■9545 / inTopicNo.4)  Re[3]: VB6でのリストボックスの境界線について
□投稿者/ まどか (388回)-(2007/10/30(Tue) 19:01:09)
> MSFlexGrid や MSHFlexGrid は、Windows Common Controls ではありません。

言われてみなければわからない頭になってしまった。

> また、標準の MSFlexGrid / MSHFlexGrid では、「列境界あり/行境界無し」は対応できません。

これも軽はずみな発言。。。m(_ _)m

失礼しました。
引用返信 編集キー/
■9586 / inTopicNo.5)  Re[4]: VB6でのリストボックスの境界線について
□投稿者/ かな (4回)-(2007/10/31(Wed) 11:51:50)
みなさま早速のお返事ありがとうございます。&発言者のレスが一番遅くてすいません。

魔界さんへのご返答ですが、おっしゃるとおり縦スクロールでないと困ります。
これについては、なんらかの対処法があるのでしょうか?
また、VB2005を使えば、リストボックスの縦ラインは可能となるのでしょうか?

まどかさんのおっしゃるとおりGridを使うとかんたんなのですが、これは最後の手段として取っておきます。
引用返信 編集キー/
■9589 / inTopicNo.6)  Re[5]: VB6でのリストボックスの境界線について
□投稿者/ 魔界の仮面弁士 (507回)-(2007/10/31(Wed) 13:24:42)
No9586 (かな さん) に返信
> 魔界さんへのご返答ですが、
妙な略し方は止めていただけると。m(_ _)m

> おっしゃるとおり縦スクロールでないと困ります。
となると、ListBox では無理でしょう。
もし、グリッドでいうところの「セル」単位の選択が不要であれば(行単位の選択でよければ)、
List1.AddItem Replace("1|2|3", "|", vbTab)
のように、タブで区切って表示させることで代用はできますけれども。

ただし ListBox を使うなら、縦線の表示については、まどかさんが書かれたように、
API によるオーナドローを行うほかありません。行境界線まで表示されて良いなら、
ListView を詳細モード/枠線付き/ヘッダ無しで運用する手はありますけれども。


> また、VB2005を使えば、リストボックスの縦ラインは可能となるのでしょうか?
標準でオーナードローモードをサポートしているので、ラインを引くだけなら簡単ですが、
列方向のならびについては、VB6 と同一の制限を受けます。(OS 標準の ListBox がそういう仕様なので)

もし使うなら、DataGridView ですかね。こちらならある程度の融通は利きます。
引用返信 編集キー/
■9594 / inTopicNo.7)  Re[6]: VB6でのリストボックスの境界線について
□投稿者/ かな (5回)-(2007/10/31(Wed) 13:54:27)
内容、理解しました。
結論として、リストボックスは諦めます。費用対効果の面から有効となりそうもありませんから。
ただ、Replaceを使う件は一度試してみます。

みなさま、ありがとうございました。

略し方について・・・ ブログ見ました。大変失礼しました。
解決済み
引用返信 編集キー/
■9596 / inTopicNo.8)  Re[7]: VB6でのリストボックスの境界線について
□投稿者/ 魔界の仮面弁士 (508回)-(2007/10/31(Wed) 14:27:40)
No9594 (かな さん) に返信
> ただ、Replaceを使う件は一度試してみます。

という事は、行単位の表示だけで良いのでしょうか?
だとすれば、こういう逃げ方とか。


Private Sub Form_Load()
    List1.Font.Name = "MS ゴシック"
    List1.Font.Size = 12

    Dim L As Long
    For L = 1 To 99 Step 3
        Dim S As String
        S = Format(CStr(L), "@@@") & "|" & vbTab
        S = S & Format(CStr(L + 1), "@@@") & "|" & vbTab
        S = S & Format(CStr(L + 2), "@@@")
        List1.AddItem S
    Next
End Sub

引用返信 編集キー/
■9645 / inTopicNo.9)  Re[8]: VB6でのリストボックスの境界線について
□投稿者/ かな (6回)-(2007/11/01(Thu) 16:11:01)
なるほど!

"|"を使うのは試したんですけど、データの文字列の長さがまちまちだったので"|"の位置がうごいちゃって・・・
Formatを使えば良いんですね。

解決しました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -