- 日時: 2007/09/13 05:33
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[グリッド関係][][] * * キーワード:MSHFlexGrid,CheckBox,,,, * *********************************************************************************** この手の質問が過去何度も出てきたのですがその時は、VB初心者友の会のVBテーマ掲示板2 「こんな事できます!」に投稿されていた分を紹介していたのですが、今は、閉鎖されているようなので、最近の投稿分ですが掲載する事にしました。 ----------------------------------------------------------------------------------
元質問:MSFlexGridにチェックボックスを表示するで - 7-2/1 2007/01/16-20:21 No.8112 MSFlexGridの一番左側にチェックボックスを表示しようとしています。 表示する方法は、このサイトの過去ログを検索し、作ってみました。 MSFlexGridにチェックボックスを表示することはできたのですが、MSFlexGridの最後に、どうしても、チェックボックスが1個余分に表示されてしまうのです。 ただ、MSFlexGridに表示するデータはありません。チェックボックスのみが表示されてしまうのです。 どうしてなのでしょうか。解決策などを教えて欲しいのですが。
以下に、MSFlexGridにチェックボックスを表示するソースを記載します。 ------------------------------------------------------------------ Option Explicit
Dim CheckBox_cnt As Long
Private Declare Function SetParent Lib "user32" _ (ByVal hWndChild As Long, _ ByVal hWndNewParent As Long) As Long Private Sub Form_Load() Call Grid_init Call Grid_set End Sub Private Sub Grid_init() MSFlexGrid1.CellAlignment = 1 MSFlexGrid1.HighLight = flexHighlightNever MSFlexGrid1.Clear MSFlexGrid1.Cols = 5 MSFlexGrid1.Rows = 2 MSFlexGrid1.TextMatrix(0, 0) = "X" MSFlexGrid1.ColWidth(0) = 200 MSFlexGrid1.TextMatrix(0, 1) = "番号" MSFlexGrid1.ColWidth(1) = 900 MSFlexGrid1.TextMatrix(0, 2) = "名前" MSFlexGrid1.ColWidth(2) = 2000 MSFlexGrid1.TextMatrix(0, 3) = "住所" MSFlexGrid1.ColWidth(3) = 4000 MSFlexGrid1.TextMatrix(0, 4) = "電話番号" MSFlexGrid1.ColWidth(4) = 2000 End Sub Private Sub Grid_set() Dim lng_I As Long Dim lng_J As Long Dim I As Long
'** エラートラップ開始 On Error Resume Next
'Call CheckBox_Clear CheckBox_cnt = 0 lng_I = 0 lng_J = 0 MSFlexGrid1.ColAlignment(1) = 0
For I = 0 To 10 lng_I = lng_I + 1 MSFlexGrid1.Rows = lng_I + 1
MSFlexGrid1.TextMatrix(lng_I, lng_J) = "0" Call MoveCheck
MSFlexGrid1.TextMatrix(lng_I, lng_J + 1) = "000001" MSFlexGrid1.TextMatrix(lng_I, lng_J + 2) = "山田 太郎" MSFlexGrid1.TextMatrix(lng_I, lng_J + 3) = "東京都千代田区大手町" MSFlexGrid1.TextMatrix(lng_I, lng_J + 4) = "03-0000-0000"
CheckBox_cnt = lng_I Next End Sub Private Sub MoveCheck() Const CHECK_COL = 0 Dim sngTwipsPerPixelX As Single Dim sngTwipsPerPixelY As Single Dim I As Long, j As Long
sngTwipsPerPixelX = Screen.TwipsPerPixelX sngTwipsPerPixelY = Screen.TwipsPerPixelY
j = 1 With MSFlexGrid1 If .ColIsVisible(CHECK_COL) Then I = .Rows - 1 j = .Rows - 1 If j > Check1.UBound Then Load Check1(j) Call SetParent(Check1(j).hWnd, MSFlexGrid1.hWnd) End If Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _ .RowPos(I) + sngTwipsPerPixelY, _ .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _ .RowHeight(I) - sngTwipsPerPixelY * 3 Check1(j).Caption = ""
If .TextMatrix(I, CHECK_COL) = "1" Then Check1(j).Value = 1 Else Check1(j).Value = 0 End If
Check1(j).Tag = I Check1(j).Visible = True End If .Refresh End With End Sub Private Sub CheckBox_Clear() Dim I As Long
If CheckBox_cnt >= 1 Then For I = 1 To CheckBox_cnt Check1(I).Value = False Check1(I).Visible = False Check1(I).Enabled = True Next End If End Sub
----------------------------------------------------------------------------------- 参考コード - 花ちゃん 2007/01/17-01:46 No.8121
詳しくは一連のスレッドをご覧下さい。 -----------------------------------------------------------------------------------
下記コードを追加してみたらどうでしょう。 Check1(1) から作成しているようですがそれでいいのですか? Check1(0) は まあ、後はお好きなようにして下さい。
Private Sub MSFlexGrid1_Scroll() Const CHECK_COL = 0 Dim sngTwipsPerPixelX As Single Dim sngTwipsPerPixelY As Single Dim i As Long, j As Long sngTwipsPerPixelX = Screen.TwipsPerPixelX sngTwipsPerPixelY = Screen.TwipsPerPixelY For j = MSFlexGrid1.TopRow To MSFlexGrid1.Rows - 1 With MSFlexGrid1 If .ColIsVisible(CHECK_COL) And .RowIsVisible(j) Then Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _ .RowPos(j) + sngTwipsPerPixelY, _ .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _ .RowHeight(j) - sngTwipsPerPixelY * 3 End If End With Next j MSFlexGrid1.Refresh End Sub
-------------------------------------------------------------------------------- 参考コードありがとうございます。 上手くいきました。 ----------------------------------------------------------------------------- Option Explicit
Dim CheckBox_cnt As Long
Private Declare Function SetParent Lib "user32" _ (ByVal hWndChild As Long, _ ByVal hWndNewParent As Long) As Long Private Sub Form_Load() Check1(0).Visible = False Call Grid_init Call Grid_set End Sub Private Sub Grid_init() MSFlexGrid1.CellAlignment = 1 MSFlexGrid1.HighLight = flexHighlightNever MSFlexGrid1.Clear MSFlexGrid1.Cols = 5 MSFlexGrid1.Rows = 2 MSFlexGrid1.TextMatrix(0, 0) = "X" MSFlexGrid1.ColWidth(0) = 200 MSFlexGrid1.TextMatrix(0, 1) = "番号" MSFlexGrid1.ColWidth(1) = 900 MSFlexGrid1.TextMatrix(0, 2) = "名前" MSFlexGrid1.ColWidth(2) = 2000 MSFlexGrid1.TextMatrix(0, 3) = "住所" MSFlexGrid1.ColWidth(3) = 4000 MSFlexGrid1.TextMatrix(0, 4) = "電話番号" MSFlexGrid1.ColWidth(4) = 2000 End Sub Private Sub Grid_set() Dim lng_I As Long Dim lng_J As Long Dim i As Long
'** エラートラップ開始 On Error Resume Next
'Call CheckBox_Clear CheckBox_cnt = 0 lng_I = 0 lng_J = 0 MSFlexGrid1.ColAlignment(1) = 0
For i = 1 To 10 lng_I = lng_I + 1 MSFlexGrid1.Rows = lng_I + 1
MSFlexGrid1.TextMatrix(lng_I, lng_J) = "0" Call MoveCheck
MSFlexGrid1.TextMatrix(lng_I, lng_J + 1) = Format$(i, "000000") MSFlexGrid1.TextMatrix(lng_I, lng_J + 2) = "山田 太郎" MSFlexGrid1.TextMatrix(lng_I, lng_J + 3) = "東京都千代田区大手町" MSFlexGrid1.TextMatrix(lng_I, lng_J + 4) = "03-0000-0000"
CheckBox_cnt = lng_I Next Debug.Print CheckBox_cnt End Sub Private Sub MoveCheck() Const CHECK_COL = 0 Dim sngTwipsPerPixelX As Single Dim sngTwipsPerPixelY As Single Dim i As Long, j As Long
sngTwipsPerPixelX = Screen.TwipsPerPixelX sngTwipsPerPixelY = Screen.TwipsPerPixelY
j = 1 With MSFlexGrid1 If .ColIsVisible(CHECK_COL) Then i = .Rows - 1 j = .Rows - 1 If j > Check1.UBound Then Load Check1(j) Call SetParent(Check1(j).hWnd, MSFlexGrid1.hWnd) End If Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _ .RowPos(i) + sngTwipsPerPixelY, _ .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _ .RowHeight(i) - sngTwipsPerPixelY * 3 Check1(j).Caption = ""
If .TextMatrix(i, CHECK_COL) = "1" Then Check1(j).Value = 1 Else Check1(j).Value = 0 End If
Check1(j).Tag = i Check1(j).Visible = True End If .Refresh End With End Sub Private Sub MSFlexGrid1_Scroll() Const CHECK_COL = 0 Dim sngTwipsPerPixelX As Single Dim sngTwipsPerPixelY As Single Dim i As Long, j As Long sngTwipsPerPixelX = Screen.TwipsPerPixelX sngTwipsPerPixelY = Screen.TwipsPerPixelY For j = MSFlexGrid1.TopRow To MSFlexGrid1.Rows - 1 With MSFlexGrid1 If .ColIsVisible(CHECK_COL) And .RowIsVisible(j) Then Check1(j).Move .ColPos(CHECK_COL) + sngTwipsPerPixelX, _ .RowPos(j) + sngTwipsPerPixelY, _ .ColWidth(CHECK_COL) - sngTwipsPerPixelX * 3, _ .RowHeight(j) - sngTwipsPerPixelY * 3 End If End With Next j MSFlexGrid1.Refresh End Sub
|