MSFlexGridの色を高速に変えるには?

解決


あき  2006-01-18 21:03:24  No: 129623

MSFlexGridで一行飛びに色を変えようと思っています。
現在↓のようにプログラムを作成したのですが、色が変わるのが
遅いのです。速く出来る方法があれば、教えて頂きたいです。
宜しくお願いします。

.Cols = 32
.Rows = 500

Private Sub Command1_Click()
    Dim co As Integer
    Dim ro As Integer

    With Form1.MSFlexGrid1
     For ro = .FixedRows To .Rows - .FixedRows Step 2
        For co = .FixedCols To .Cols - .FixedCols
            .Row = ro
            .Col = co
            If .CellBackColor = 0 Then
               .CellBackColor = RGB(255, 100, 100)
            Else
                .CellBackColor = 0
            End If
        Next co
     Next ro
    End With
End Sub


魔界の仮面弁士  2006-01-18 21:53:21  No: 129624

それぞれのセルを一つずつ設定するのではなく、複数のセルに対して
一度に設定してみてください。(ColSel, RowSel, FillStyleプロパティ)

また、Redraw プロパティも併用しておくと良いでしょう。


特攻隊長まるるう  2006-01-18 23:00:01  No: 129625

質問とは関係ないけど
>    With Form1.MSFlexGrid1
フォーム名を直接使う方法はやめた方がいいと思う。
    With Me.MSFlexGrid1

    With MSFlexGrid1
で。

魔界の仮面弁士さんの案をフルに使えばループは一重になりますね。
>    If .CellBackColor = 0 Then
の判定とか1回で良いからループの外に出せる。
同じ処理を実行してるところをしないように考える。

再描画処理が一番重いから魔界の仮面弁士さんの案をフルに使った
時点で高速化の99%は終わってそうだけど、無駄な処理は
いくつかあるようです。

Private Sub Command1_Click()
    Dim tm As Double
    tm = Timer
    Call funcO '処理
    Debug.Print Timer - tm
End Sub
で時間計測したら
 0.4秒から0.02秒まで短縮されました。
デフォルト設定のまま全画面表示で、画面上に
表示されているセル数は47×16くらい
実行マシンのスペックはCPU1.60GHz


あき  2006-01-19 00:20:40  No: 129626

魔界の仮面弁士さん特攻隊長まるるうさん
どうもありがとうございました。とても勉強になりました。

Private Sub Command1_Click()
    Dim ro As Integer
    
    With Me.MSFlexGrid1
        .Redraw = False
        For ro = .FixedRows To .Rows - .FixedRows Step 2
            .Row = ro
            .ColSel = .Cols - .FixedCols
            .FillStyle = flexFillRepeat
            .CellBackColor = RGB(255, 100, 100)
        Next ro
       .Redraw = True
    End With
End Sub


特攻隊長まるるう  2006-01-19 01:50:59  No: 129627

あれ?色を戻すのはやめたの?
だいぶ機能(エラー対応など)が足りなくなってる気がするけど…
早くレスつけるのもいいけど、もう1日くらい落ち着いて
考えたほうが良いのでは?
[VB6.0]
Private Sub Command1_Click()
    Dim co As Long  'データ型変更してあります
    Dim ro As Long
    Dim lngBackColor As Long
    Dim lngCols As Long
    
    With Me.MSFlexGrid1
        .Redraw = False
        .FillStyle = flexFillRepeat
        .col = .FixedCols
        .row = .FixedRows
        If .CellBackColor = 0 Then
            lngBackColor = RGB(255, 100, 100)
        Else
            lngBackColor = 0
        End If
        lngCols = .Cols - .FixedCols
        
        For ro = .FixedRows To .Rows - .FixedRows Step 2
           .row = ro
           .ColSel = lngCols
           .CellBackColor = lngBackColor
        Next ro
        
        .col = .FixedCols
        .row = .FixedRows
        .FillStyle = flexFillSingle
        .Redraw = True
    End With
End Sub


特攻隊長まるるう  2006-01-19 02:19:03  No: 129628

>エラー対応
…意味が違うな(汗)エラーは出ないと思うもん。正確にはバグ対応ですね。
カレントセルの制御が甘くなってます。


ひろ  2006-01-19 23:03:43  No: 129629

VsFlexGridで BackColorAlternate を設定する方が楽かもしれません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加