その他の小技集(その1) |
********** 目 次 ********** 1.データの読み込み表示を高速にする 2.行/列のサイズの設定 3.表示しているデータを消去する 4.セルを1行全体に選択反転表示する 5.スクロールを制御する 6.セルに色をつける 7.カレントセルの取得設定他行・列管理 8.セルに縦書き文字を表示 9.その他の小技集(その2)へ移動 サンプルNo(039)はクリック毎に動作が反転するように作成しています。 |
|||||||||||||
データの読み込み表示を高速にする (039) | |||||||||||||
データをセルに読み込んで表示した場合、表示に時間がかかると感じた方は、次を試して下さい。 データを読み込み、表示する前にMSFlexGridを一旦非表示にする 次にデータをセルにセットし終った時点で再度表示する。 これは、リストボックスやエクセル上でも同じく有効です。 セルへの書き込みは .TextMatrix(i, j) = n を使用します。(こちらの効果の方が 大きい) 参考 私のマシンで下記を試した結果(5万セルへの書き込み) 遅い方法 14.04秒 早い方法 0.35秒 最大表示件数 2.3秒(35万セル) ちなみに、MSFlexGridへの最大表示件数はメモリに関係なく総セル数が35万セル迄です。 (ヘルプの記載は間違っております。) 従って、私のサンプルで遅い方法で表示設定してある場合は、実際の使用場面では早い 方法に変更してお使い下さい。 簡単なテスト例 '宣言セクションに記入して下さい
Private Sub Command7_Click()Private MSFGShowFlag As Boolean 'システムを立ち上げてからの経過時間を高精度に取得する Private Declare Function timeGetTime Lib "winmm.dll" () As Long 'Private MSFGShowFlag As Boolean '宣言セクションに記入して下さい Dim i As Long Dim j As Long Dim n As Long Dim st As Long Me.MousePointer = vbHourglass 'vbDefault MSFGShowFlag = Not MSFGShowFlag st = timeGetTime 'ダミーのデータを表示 With MSFlexGrid1 .Rows = 6250 .Cols = 8 '表示を早くするために一旦非表示に設定 If MSFGShowFlag = False Then .Visible = False Else .Visible = True '表示状態の場合 End If .RowHeight(-1) = 350 '固定行は除く For i = .FixedRows To .Rows - .FixedRows '固定列は除く For j = .FixedCols To .Cols - .FixedCols If MSFGShowFlag = False Then n = n + 1 .TextMatrix(i, j) = n 'こちらの方が高速 Else .Col = j 'こちらは遅い(この部分の差の方が大きい) .Row = i n = n + 1 .Text = n End If Next j Next i Me.MousePointer = vbDefault .Visible = True .Refresh End With Label2.Caption = "読み込み表示に " & _ (timeGetTime - st) / 1000 & " 秒かかりました" st = Timer Do While Timer - st < 3 DoEvents Loop MSFlexGrid1.Clear Label2.Caption = "" End Sub |
|||||||||||||
行/列のサイズの設定 | |||||||||||||
行と列の指定に「-1」を使用するとすべての行・列の意味になります 使用例 MSFlexGrid1.RowHeight(1) = 350 '1行目の高さを350に設定 MSFlexGrid1.RowHeight(-1) = 350 'すべての行の高さを350に MSFlexGrid1.ColWidth(1) = 550 '1列目の幅を550に設定 MSFlexGrid1.ColWidth(-1) = 550 'すべての列の幅を550に |
|||||||||||||
表示しているデータを消去する (042) | |||||||||||||
Option Explicit 'SampleNo=042 WindowsXP VB6.0(SP5) 2002.05.03 Private Sub Command1_Click() 'セル個別に表示をクリア Dim i As Integer Dim j As Integer '表示を早くするために一旦非表示に設定 With MSFlexGrid1 .Visible = False '固定列は除く(列・行を選択して) For i = 3 To .Cols - .FixedCols '.FixedCols To .Cols - .FixedCols '固定行は除く For j = .FixedRows To _ .Rows - .FixedRows .Col = i .Row = j .Text = "" Next j Next i .Visible = True End With End Sub 特定の列や行に違った初期値(0 or ”” 他)を入れたい場合上記の方法が便利だが全セル同じ初期値を入れるなら下記の方が簡単高速に処理が出来る。 Private Sub
Command2_Click()
'範囲を選択して表示をクリア With MSFlexGrid1 .Visible = False '表示を非表示に .Row = .FixedRows '選択範囲の行のスタート位置 .Col = 3 ' .FixedCols '選択範囲の列のスタート位置 .RowSel = .Rows - .FixedRows '行のエンド位置 .ColSel = .Cols - .FixedCols '列のエンド位置 '選択されているすべてのセルに反映されます。 .FillStyle = flexFillRepeat .Text = "" .Row = .FixedRows '左上のセルに移動 .Col = .FixedCols .Visible = True End With End Sub 件数が多い場合 MSFlexGrid1.Clear で一旦全部消し固定行と列のタイトル等を再度表示する。 |
|||||||||||||
セルを1行全体に選択反転表示する (041) | |||||||||||||
簡単な方法 通常下記の設定で固定行・列をクリックすると1行選択・反転表示される Private Sub Command1_Click() MSFlexGrid1.FocusRect = flexFocusNone MSFlexGrid1.HighLight = flexHighlightAlways End Sub どのセルをクリックしても1行選択・表示されるようにするには 簡単な方法 Private Sub Command2_Click() MSFlexGrid1.SelectionMode = flexSelectionByRow '列単位の定数= flexSelectionByColumn End Sub 違った方法 Private Sub Command3_Click() MSFlexGrid1.FocusRect = flexFocusNone MSFlexGrid1.HighLight = flexHighlightAlways MSFlexGrid1.Col = MSFlexGrid1.FixedCols MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 End Sub その他このような方法も (デザインモードで) 1.グリッド上で右クリック 2.プロパティを選択 3.選択モードを [1-By Row] 4.適用(OK) 又このような方法も Private Sub Grid_Click() Grid.Col = 0 Grid.ColSel = Grid.Cols - 1 End Sub いずれにしろ簡単な方法は1長1短があるようです。 少し複雑になるが別の方法として 宣言セクションに Option Explicit 'SampleNo=041 WindowsXP VB6.0(SP5) 2002.05.03 Dim i As Integer Dim Ro1 As Integer Dim Ro2 As Integer Dim Frg As Integer Private Sub MSFlexGrid1_DblClick() '変数 i, Ro1 , Ro2,Frg ,は宣言セクションに宣言する '今の行の位置を取得 If Ro2 = 0 Then Ro2 = MSFlexGrid1.Row End If If Frg = 1 Then kesu '反転解除のルーチンへ '今の行の位置に戻る MSFlexGrid1.Row = Ro2 Ro1 = Ro2 '今の行の位置を取得 '反転表示を設定 For i = MSFlexGrid1.FixedCols To MSFlexGrid1.Cols - 1 MSFlexGrid1.Col = i MSFlexGrid1.CellBackColor = QBColor(1) MSFlexGrid1.CellForeColor = QBColor(15) Next i Frg = 1 End If End Sub Private Sub MSFlexGrid1_Click() If Frg = 1 Then kesu End Sub Private Sub kesu() If Frg = 0 Then Exit Sub Ro2 = MSFlexGrid1.Row MSFlexGrid1.Row = Ro1 '反転表示を元に戻す For i = MSFlexGrid1.FixedCols To MSFlexGrid1.Cols - 1 MSFlexGrid1.Col = i MSFlexGrid1.CellBackColor = QBColor(15) MSFlexGrid1.CellForeColor = QBColor(0) Next i Frg = 0 End Sub |
|||||||||||||
スクロールを制御する (024) | |||||||||||||
行のスクロールを制御するにはTopRowの値を変化させます。 列のスクロールを制御するにはLeftColの値を変化させます。 行のスクロール制御例 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'カーソル移動キーでのセル移動設定 With MSFlexGrid1 Select Case KeyCode Case vbKeyUp '↑キーが押されたら行を1行上に移動 If .Row > 1 Then .Row = .Row - 1 '↑ 'グリッドの表示行数以下になった場合 If .Row < 8 Then 'スクロールを元に .TopRow = 1 End If .SetFocus Case vbKeyDown '↓キーが押されたら行を1行下に移動 If .Row < 10 Then .Row = .Row + 1 '↓ 'グリッドの表示行数以上になった場合 If .Row >= 8 Then '行のスクロール .TopRow = .TopRow + 1 End If .SetFocus Case vbKeyLeft '←キーが押されたらセルを1列左に移動 If .Col > 1 Then .Col = .Col - 1 '← .SetFocus Case vbKeyRight '→キーが押されたらセルを1列右に移動 If .Col < 5 Then .Col = .Col + 1 '→ .SetFocus End Select End With End Sub 列の場合は行の所を列に変更して下さい。 スクロールに合せてカレントセルを移動したい場合は Private Sub MSFlexGrid1_Scroll() MSFlexGrid1.Row = MSFlexGrid1.TopRow End Sub |
|||||||||||||
セルに色をつける (039) | |||||||||||||
1.選択されたセルを強調表示するかどうかを指定する 例 MSFlexGrid1.HighLight = flexHighlightAlways MSFlexGrid1.FocusRect = flexFocusNone 定数
2.セル個別に色をつける Private Sub Command2_Click() MSFlexGrid1.Row = 3 MSFlexGrid1.Col = 5 '3行目の5列目に色をつける If MSFlexGrid1.CellBackColor <> QBColor(11) Then '明るいシアンに設定する MSFlexGrid1.CellBackColor = QBColor(11) MSFlexGrid1.CellForeColor = QBColor(12) Else '色を非表示 MSFlexGrid1.CellBackColor = 0 MSFlexGrid1.CellForeColor = QBColor(0) End If MSFlexGrid1.Row = 1 MSFlexGrid1.Col = 1 End Sub 3.1行飛びに色をつける Private Sub Command1_Click() Dim Co As Integer Dim Ro As Integer '1行飛びに色をつける(再度クリックすると解除される) For Ro = MSFlexGrid1.FixedRows To MSFlexGrid1.Rows - _ MSFlexGrid1.FixedRows Step 2 '1行全体を For Co = MSFlexGrid1.FixedCols To _ MSFlexGrid1.Cols - MSFlexGrid1.FixedCols MSFlexGrid1.Row = Ro MSFlexGrid1.Col = Co If MSFlexGrid1.CellBackColor = 0 Then '明るいシアンに設定する MSFlexGrid1.CellBackColor = QBColor(11) Else '色を非表示 MSFlexGrid1.CellBackColor = 0 End If Next Co Next Ro End Sub |
|||||||||||||
カレントセルの取得設定他行・列管理 (039) | |||||||||||||
行列関係の主なプロパティ Row カレントセルの行を設定・取得 Col カレントセルの列を設定・取得 Rows 総行数を設定・取得(固定行含む) Cols 総列数を設定・取得(固定行含む) FixedRows 固定行の数を設定・取得 FixedCols 固定列の数を設定・取得 TopRow 一番上に表示されている行の行番号を設定・取得 LeftCol 一番左に表示されている列の列番号を設定・取得 RowSel 選択範囲の開始・終了行を設定・取得 ColSel 選択範囲の開始・終了列を設定・取得 又下記の役目を兼用しています。 Row 選択範囲の上端行番号 RowSel 選択範囲の下端行番号 Col 選択範囲の左端列番号 ColSel 選択範囲の右端列番号 Private Sub Command6_Click()
With MSFlexGrid1 MsgBox "カレントセルは" & .Row & "行目の" & .Col & "列目です" MsgBox "カレントセルを3行目の5列目に設定します" 'カレントセルの設定(3行目の5列目に) .Row = 3 .Col = 5 End With End Sub |
|||||||||||||
セルに縦書き文字を表示 (039) | |||||||||||||
説明するよりもフォームにMSFlexGridを貼付け下記を試してみて下さい。 ポイントはワードラップの設定です。 Private Sub Command4_Click() If MSFlexGrid1.WordWrap = False Then MSFlexGrid1.WordWrap = True '複数行の入力可 MSFlexGrid1.Col = 0 MSFlexGrid1.Row = 1 MSFlexGrid1.ColWidth(0) = 300 MSFlexGrid1.ColWidth(1) = 500 MSFlexGrid1.RowHeight(1) = 800 MSFlexGrid1.RowHeight(2) = 800 MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _ vbCrLf & "ん" MSFlexGrid1.Row = 2 MSFlexGrid1.Text = "花ちゃん" MSFlexGrid1.Col = 1 MSFlexGrid1.Row = 1 MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _ vbCrLf & "ん" MSFlexGrid1.Row = 2 MSFlexGrid1.Text = "花ちゃん" MSFlexGrid1.Col = 2 MSFlexGrid1.Row = 1 MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _ vbCrLf & "ん" MSFlexGrid1.Row = 2 MSFlexGrid1.Text = "花ちゃん" Else MSFlexGrid1.WordWrap = False '複数行の入力可 MSFlexGrid1.Clear Dim lngCountI As Long 'ループ用カウンター Form1.Move 0, 0, 11280, 4950 'MSFlexGrid の初期設定 With MSFlexGrid1 .Move 150, 150, 8170, 3180 .Rows = 10 '行の総数(固定行含む) .Cols = 8 '列の総数(固定列含む) .FixedRows = 1 '固定行の数 Rowsより1以上少ない事 .FixedCols = 1 '固定列の数 Colsより1以上少ない事 .Row = 0 .ColWidth(0) = 430 '列幅 .ColWidth(1) = 550 .ColWidth(2) = 1800 For lngCountI = 3 To 7 .ColWidth(lngCountI) = 1000 Next lngCountI .RowHeight(0) = 350 '行の高さ .Col = 1: .Text = "No" '該当セルを 中寄/中寄 表示 .CellAlignment = flexAlignCenterCenter .Col = 2: .Text = "氏 名" .CellAlignment = flexAlignCenterCenter .Col = 3: .Text = "国 語" .CellAlignment = flexAlignCenterCenter .Col = 4: .Text = "数 学" .CellAlignment = flexAlignCenterCenter .Col = 5: .Text = "英 語" .CellAlignment = flexAlignCenterCenter .Col = 6: .Text = "合 計" .CellAlignment = flexAlignCenterCenter .Col = 7: .Text = "平均点" .CellAlignment = flexAlignCenterCenter .Col = 0 For lngCountI = 1 To .Rows - 1 .RowHeight(lngCountI) = 350 '行の高さ .Row = lngCountI .Text = lngCountI '行番号を表示 Next lngCountI .Col = 1: .Row = 1 .FocusRect = flexFocusNone .HighLight = flexHighlightAlways End With With Text1 .BackColor = &H80FFFF '動きが分かりやすいように .Text = "" .Visible = False End With End If End Sub |
2002/05/03