VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2007/01/17(Wed) 11:31
投稿者7-2/1
Eメール
URL
タイトルRe: 参考コード - MSFlexGridにチェックボックスを表示するで

>> 立てスクロールが出るぐらいの大きさです。
> スクロールした場合チェックボックスを描画し直していますか?
> 従ってスクロールさせた場合一番上に表示しているチェックボックスがCheck1(0) に
> なっているから Check1(10) まで表示するからです

> 最初のチェックボックスに1個だけチェックを入れてスクロールして見て下さい。
確かに、おかしくなります。
スクロールとかの操作での再描画し直しにつていは、表示が上手く行ったら追加
と考えていました。
実際には、チェックボックスをクリックするので、MSFlexGridの0列に格納して、
再描画するときに、チェックボックスに反映しようと考えていました。

> TopRow = Check1(TopRow) にしておかないと。
これは、どこに位置に、どのタイミングで入れればいいのですか。
MSFlexGridですよね。

> 下記コードを追加してみたらどうでしょう。
> Check1(1) から作成しているようですがそれでいいのですか? Check1(0) は
> まあ、後はお好きなようにして下さい。

参考コードありがとうございます。
上手くいきました。

Check1(1)から作成しているのは、チェックボックスのIndexとMSFlexGridの
データ行の行番号と同期を合わせたいということもあります。
また、チェックボックスコントロール配列を1個作成するために、また、MSFlexGrid
にチェックボックスを割り当てるために、「Check1(0)」をその為に利用している
からです。

「Check1(0)」とかを上手く使ってもできるのですか。
どのようにすればいいのですか。

-----------------------------------------------------------------------------
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


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -