stringgridがdrawcell時にスクロールしないようにするには?


やまだ  2014-02-18 01:21:52  No: 46056  IP: [192.*.*.*]

こんにちは。
開発環境は、delphiXE3 enterprise(update2適用)、win7(sp1)です。

いつもお世話になっております。

stringgridにDrawFrameControlを使ってチェックボックスを描画しています。
チェックボックスはstringgridの一番右端に描画しています。

スクロールして一番右端に行って、チェックをするとdrawcellが機能してセルが左端になってしまいます。
(cellに1または0を書き込むようになっていて、それを見てチェックのONOFFを判断しています)

この勝手にスクロールしてしまうのを止めることは可能でしょうか。

チェックをする度に、左端にスクロールしてしまっていたら、非常に使い難いと客先から思われてしまうような気がしています。

縦スクロールも同じで、行数が多い時の、勝手に先頭行になってしまうのも何とか制御したいと考えています。

よろしくお願いします。

編集    削除
igy  2014-02-18 06:34:22  No: 46057  IP: [192.*.*.*]

>チェックをするとdrawcellが機能してセルが左端になってしまいます。

どのようなコードを書かれているのか不明なので、わからないのですが、
“drawcellが機能してセルが左端になって”しまったことはないですね。

>縦スクロールも同じで、行数が多い時の、勝手に先頭行になってしまう

これも、どのようなコードが書かれているのか不明なので、わからないのですが、
このような現象になったこともないですね。

編集    削除
やまだ  2014-02-18 21:03:02  No: 46058  IP: [192.*.*.*]

こんにちは。

stringgridのrowselectをチェックしていたのが原因っぽいです。

rowselectのチェックを外したらチェック時も列が移動しませんでした。

ただ、行選択の代わりをするようなコードを書かなくてはいけません。

あたかも行選択しているように行を反転させるにはどうしたら良いのでしょうか。

よろしくお願いします。

編集    削除
igy  2014-02-18 21:39:47  No: 46059  IP: [192.*.*.*]

>あたかも行選択しているように行を反転させるにはどうしたら良いのでしょうか。

OnDrawCellイベントで、
行が選択行の場合、背景の色をclHighlightで、文字の色をclHightlightTextで描画するのは、いかがですか?

編集    削除
やまだ  2014-02-18 22:20:32  No: 46060  IP: [192.*.*.*]

すみません。
質問の仕方が悪すぎました。

drawcellイベントに以下のようなコードを書いています。

  with (Sender as TStringGrid) do
  begin
    if not (gdFixed in State) then
    begin
      if gdSelected in State then
      begin
        Canvas.Brush.Color:=clHighlight;
        Canvas.FillRect(Rect);
        Canvas.Font.Color:=clHighlightText;
        Canvas.Rectangle(Rect);
      end
      else
      begin
        Canvas.Brush.Color:=clWindow;
        Canvas.FillRect(Rect);
        Canvas.Font.Color:=clWindowText;
      end;
    end;
  end;

これだと、選択行の全ての列選択ではないです。
rectはleft、top、right、bottomの指定ということで、どうすれば良いか分かりません。

どなたかご存知でないでしょうか。

よろしくお願いします。

編集    削除
igy  2014-02-19 00:02:01  No: 46061  IP: [192.*.*.*]

行が選択行かどうかの判定は、
StringGridのRowプロパティとOnDrawCellの引数のARowと比較して、一致したら、選択行・・・では、だめですか?

編集    削除
tor  2014-02-19 00:35:59  No: 46062  IP: [192.*.*.*]



やまださんは、判定部分はそのままにして描画処理の部分を一行まるごと描画するように変えようとしている気がします
……がトテイベントではあくまでそのセル一つだけ描画するのが作法です。
さんが言っているのはそうじゃなくて

ヲサヲサヲサモヲサヲサモヲサヲサッッヲサこのセルが選択されていたらョョョ
ヲサヲサ
ヲサヲサヲサヲサ(選択色で描画する)
ヲサヲサ
ヲサヲサ
ヲサヲサ
ヲサヲサヲサヲサ(通常の色で描画する)
ヲサヲササ

となっているのを

ヲサヲサヲサチメヲサスヲサメヲサヲサッッヲサこの行が今選択されている行だったらョョョ
ヲサヲサ(後はそのまま)

と変えるということですね。
ただ実際にはこれだけだと不十分で、状態の変化したセルしか描画が更新されないため
他の列のセルが取り残されて虫食いのようになってしまうと思います。
ちゃんと行選択に見せるには、他のセルにも再描画をかける必要があります。

安直な方法は、選択状態が変化したタイミング(例えばモテなど)でモヌョノしてしまうことですね。
ただこれだとグリッド全体が再描画されるのでチカチカした感じになるかもしれません。
気になるようなら、必要な範囲(選択前と後の行全体)を計算してその範囲だけ更新をかけるようにしてください。
必要な道具立てはテメメソッドとノメ関数かな。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーイッアクィ火ゥ アキコアイコアオ  書込者ノト:ロ 」 ァ」ハノ

 ン

言いっぱなしも無責任かと思ったのでちょいと実験。まず一行更新するためのメソッドを作ります。

ヲサヲサヲサヤニアョノメィチヌコヲサヤテトヌサヲサチテャヲサチメコヲサノゥサ
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサコヲサヤメサ
ヲサヲサ
ヲサヲサヲサヲサッッヲサチテは必要ないじゃんと思うかもしれませんが
ヲサヲサヲサヲサッッヲサ一応今見えているセルを渡す必要があるので……
ヲサヲサヲサヲサヲサコスヲサチヌョテメィチテャヲサチメゥサヲサッッヲサセルの範囲を求めてョョョ
ヲサヲサヲサヲサョフヲサコスヲサチヌョテメョフサヲサッッヲサ左端とョョョ
ヲサヲサヲサヲサョメヲサコスヲサチヌョテメョメサヲサッッヲサ右端をいっぱいまで伸ばして
ヲサヲサヲサヲサノメィチヌョネャヲサタャヲサゥサヲサッッヲサ更新。
ヲサヲササ

変更前後の行を再描画する必要があるので、前の行を覚えておく変数を用意します。
ヲサヲサョョョ
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサモヌアテメコヲサノサ
ヲサヲサョョョ

ヲサヲサヲサヤニアョニモィモコヲサヤマゥサ
ヲサヲサ
ヲサヲサヲサヲサッッヲサどこでもいいから適当なところで初期化
ヲサヲサヲサヲサモヌアテメヲサコスヲサモヌアョメサ
ヲサヲサョョョ

後はこれを必要なところで呼ぶだけ。

ヲサヲサヲサヤニアョモヌアモティモコヲサヤマサヲサチテャヲサチメコヲサノサヲサヲサテモコヲサツゥサ
ヲサヲサ
ヲサヲサヲサヲサヲサチメヲサヲサヲサヲサモヌアテメヲサ
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサノメィモヌアャヲサチテャヲサモヌアテメゥサ
ヲサヲサヲサヲサヲサヲサノメィモヌアャヲサチテャヲサチメゥサ
ヲサヲサヲサヲササ
ヲサヲサヲサヲサモヌアテメヲサコスヲサチメサ
ヲサヲササ
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアエッーイッアクィ火ゥ アキコイイコエエ  書込者ノト:ロ 「。「 「「 ン

何とか上手くできました。

本当いろいろ教えていただき有難うございました。

ただ、ひとつ気になることがあって。

ではが走りますが、ではが走りません。

そのため、下矢印キーを押したとき、カーソルがあるセルの行が変わり、カーソルがないセルは残ったままになってしまいます。

でのしましたがダメでした。

何か良い方法はあるのでしょうか。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーイッアクィ火ゥ アクコイキコイカ  書込者ノト:ロ 」 ァ」ハノ

 ン

マウスだろうがキーだろうがセルの選択が変わればマモテは発生するはずですが、そこじゃ駄目なんですか?
と言うか提示したコードのとおりにマモテでやれば十分で、他のイベントを使う必要はないと思うんですが……
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアエッーイッアクィ火ゥ イーコウイコエー  書込者ノト:ロ 「。「 「「 ン

すみません。

投稿中にご返答をいただいていたみたいで。。。

教えていただいたコードを動かしていたんですが、行選択にならずセル選択になってしまいます。

ヲサコスヲサチヌョテメィチテャヲサチメゥサ
これは、選択したセルを取得して

ョフヲサコスヲサチヌョテメョフサ
ョメヲサコスヲサチヌョテメョメサ
これで、行選択しているように見せて

ノメィチヌョネャヲサタャヲサゥサ
これで描画

僕の理解が乏しいのかと思っているんですが。

では

ヲサヲサヲサヲサヲサヲサヲサモヲサヲサモヲサ
ヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョツョテコスネサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョニメィメゥサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョニョテコスネヤサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョメィメゥサ
ヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョツョテコスラサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョニメィメゥサ
ヲサヲサヲサヲサヲサヲサヲサヲサテョニョテコスラヤサ
ヲサヲサヲサヲサヲサヲササ

と書いています。

が悪さをしているのでしょうか。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーイッアクィ火ゥ イーコエキコアク  書込者ノト:ロ 」 ァ」ハノ

 ン

ヲサヲサヲサモヲサヲサモヲサヲサッッヲサこのセルが選択されていたらョョョ
ヲサヲサ
ヲサヲサヲサヲサ(選択色で描画する)
ヲサヲサ
ヲサヲサ
ヲサヲサ
ヲサヲサヲサヲサ(通常の色で描画する)
ヲサヲササ

となっているのを

ヲサヲサヲサチメヲサスヲサメヲサヲサッッヲサこの行が今選択されている行だったらョョョ
ヲサヲサ(後はそのまま)

と変えてください。
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアエッーイッアクィ火ゥ イアコアーコイウ  書込者ノト:ロ 「。「 「「 ン
モコ 

ありがとうございます。

思ってた通りになりました。

助かりました。

本当にありがとうございました。

編集    削除