TStringGrid の OnDrawCell とソートを連動させるには


しろ君  2021-10-24 11:52:29  No: 149896  IP: 192.*.*.*

TStringGrid の onClickイベントでGridsortを使ってソートします。
それに連動してOnDrawCell の背景色も変更して欲しいのですが、
ソートした後、ondrawcellで作成した背景色が固定されたまま連動しません。
どのような手続きが必要なのでしょうか。

編集 削除
igy  2021-10-24 13:24:31  No: 149897  IP: 192.*.*.*

Gridsortを使ったあと、StringGridのInvalidate メソッドを使ってみたら、どうなりますか?

編集 削除
しろ君  2021-10-25 04:38:29  No: 149898  IP: 192.*.*.*

以下のようなコードで実行してみましたが、背景色固定のままで変化無しです。

******************
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
  //if (Pos.y<> 0) then Exit;
  // クリックされた列を調べる
    case Pos.x of
      1:begin
        Gridsort(stringgrid1,1);//
        stringgrid1.Invalidate;
      end;
   end;
end;

編集 削除
igy  2021-10-25 06:40:07  No: 149899  IP: 192.*.*.*

> 背景色固定のままで変化無しです。

OnDrawCellイベントのコードに関する情報がまったくないので、具体的なことは、言えないのですが、
OnDrawCellイベントのコードが、背景色固定になるように書かれている可能性は?

編集 削除
しろ君  2021-10-25 09:06:42  No: 149900  IP: 192.*.*.*

こんばんは。
OnDrawCellイベントのコードは以下のような感じです。
*****************
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
 Point:TPoint;//文字列の表示座標
 i,j,nTosu,Code:integer;
begin
  with StringGrid1.Canvas do begin//StringGrid1.Canvasの初期化
    Brush.Color := clWhite;
    Font.Color := clBlack;
    Font.Size:=9;
    Font.Style:=[];
    if gdSelected in State then
      Brush.Color:=clLime;
  end;
  with stringgrid1 do begin
    if((ARow= 0) and (ACol=1)) then
    with Canvas do begin
      font.color:=clred;
      brush.Color:=clwhite;
    end;
    if((ARow= 1) and (ACol=1)) then
    with Canvas do begin
      font.color:=clblue;
      brush.Color:=clblack;
    end;
    if((ARow= 2) and (ACol=1)) then
    with Canvas do begin
      font.color:=clyellow;
      brush.Color:=clgreen;
    end;
    if((ARow= 3) and (ACol=1)) then
    with Canvas do begin
      font.color:=claqua;
      brush.Color:=clblack;
    end;
  end;
  Point.x := Rect.Left;
  Point.y := Rect.Top;
  StringGrid1.Canvas.TextRect(Rect,
                              Point.x,
                              Point.y,
                              StringGrid1.Cells[ACol,ARow]);
end;

編集 削除
igy  2021-10-25 09:18:14  No: 149901  IP: 192.*.*.*

> OnDrawCellイベントのコードは以下のような感じです。 

詳しく見ていませんが、コード自体が、背景色固定になるように書かれている気がします。

> 連動してOnDrawCell の背景色も変更して欲しい

とのことですが、どのように変更してほしいのですか?

編集 削除
しろ君  2021-10-25 09:57:17  No: 149902  IP: 192.*.*.*

stringgrid1のonclickイベントで、Gridsortを使い数値の昇順を実行するとして

[A]のデータを[B]データのように昇順して背景色も変更したい。
現状は、Gridsortすると数値は置き換わるのですが、背景色が[A]データの背景色のまま固定された状態です。
************************************************
[A]col1をクリックする
行|背景色(brush.color)|数値
1|赤 数値3
2|青   数値4
3|黄   数値1
4|緑 数値2   
*****************
[B]では昇順になり背景色も変更される
行|背景色(brush.color)|数値
1|緑 数値1
2|黄   数値2
3|青   数値3
4|赤 数値4   
*****************

編集 削除
しろ君  2021-10-25 10:00:15  No: 149903  IP: 192.*.*.*

[★訂正]数値と背景色がリンクしていませんでした。
************************************************
[A]col1をクリックする
行|背景色(brush.color)|数値
1|赤 数値3
2|青   数値4
3|黄   数値1
4|緑 数値2   
*****************
[B]では昇順になり背景色も変更される
行|背景色(brush.color)|数値
1|黄 数値1
2|緑   数値2
3|赤   数値3
4|青 数値4 
*****************

編集 削除
AAA  2021-10-25 11:23:36  No: 149904  IP: 192.*.*.*

    if((ARow= 3) and (ACol=1)) then  <---- この条件を  font.color := claqua にする条件に変える
    with Canvas do begin
      font.color:=claqua;
      brush.Color:=clblack;
    end;

編集 削除
しろ君  2021-10-26 06:07:19  No: 149905  IP: 192.*.*.*

if((ARow= 3) and (ACol=1)) then  <---- この条件を  font.color := claqua にする条件に変える
*****************
if以外の条件分岐でソートすると背景色が変わる条件に変える。。。すみません。もう少し教えて下さい。

編集 削除
AAA  2021-10-26 10:25:30  No: 149906  IP: 192.*.*.*

1|赤 数値3 数値3は何故赤?
2|青   数値4    数値4は何故青?
3|黄   数値1 数値1は何故黄色?
4|緑 数値2   数値2は何故緑?

編集 削除
AAA  2021-10-26 10:42:07  No: 149907  IP: 192.*.*.*

StringGrid.Object に色保存してその色で描画するか

編集 削除
igy  2021-10-28 07:20:41  No: 149910  IP: 192.*.*.*

> if((ARow= 3) and (ACol=1)) then  <---- この条件を  font.color := claqua にする条件に変える
> if以外の条件分岐でソートすると背景色が変わる条件に変える。。。すみません。もう少し教えて下さい。

 ARow= 1
 ARow= 2
 ARow= 3
の箇所が、行で背景色固定しているので、
この箇所を、
 StringGrid1.Cells[数値が格納されている列,ARow] = 該当する数値
みたいな条件に書き換えれば、良さそうな気がします。

編集 削除