投稿日 | : 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