STringGridで色分けを行うには?

解決


ウォレス  2003-10-04 04:08:17  No: 5086

困っています。何卒よろしくお願いいます。

過去にも何度か話題になっていますが、
結局、「StringGridでセル毎に色分けを行う方法」が実現できません。

下記のようにして実験しています。
すなわち、ボタン1を押したらフォント色が赤、ボタン2なら青になるように
設定しています。(市松状に色分け)
しかし、これだと、再描画された時に、最後に設定したフォント色で全面が書き換わってしまいます。
何かよい方法はないでしょうか??

※  ccはグローバル変数

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin

    if cc =0 then begin
      StringGrid1.canvas.font.color := clRed;
    end
    else  begin
      StringGrid1.canvas.font.color := clBlue;
    end;
      StringGrid1.canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
               StringGrid1.Cells[ACol, ARow]);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
ic,ir :Integer;
begin

  cc:=0;

  for ic:= 0 to 10 do begin
    for ir:= 0 to 20 do begin
        with StringGrid1.canvas do
        begin
            if (ic+ir) mod 2 =0 then
              StringGrid1.Cells[ic,ir]:=InttoStr(ic*5+ir);
        end;

    end;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
ic,ir :Integer;
begin

  cc:=1;

  for ic:= 0 to 10 do begin
    for ir:= 0 to 20 do begin
        with StringGrid1.canvas do
        begin
            if (ic+ir) mod 2 =1 then
              StringGrid1.Cells[ic,ir]:=InttoStr(ic*5+ir);
        end;

    end;
  end;

end;


通りすがり  2003-10-04 04:27:18  No: 5087

グローバル変数 cc の使用をやめて
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  case (ACol+ARow) mod 2 of
    0: StringGrid1.canvas.font.color := clRed;
    1: StringGrid1.canvas.font.color := clBlue;
  end;
  StringGrid1.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,
    StringGrid1.Cells[ACol,ARow]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ic,ir :Integer;
begin
  for ic:= 0 to 10 do begin
    for ir:= 0 to 20 do begin
      if (ic+ir) mod 2 =0 then
        StringGrid1.Cells[ic,ir]:=InttoStr(ic*5+ir);
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
ic,ir :Integer;
begin
  for ic:= 0 to 10 do begin
    for ir:= 0 to 20 do begin
      if (ic+ir) mod 2 =1 then
        StringGrid1.Cells[ic,ir]:=InttoStr(ic*5+ir);
    end;
  end;
end;
とすればよいのでは。。。


HOota  2003-10-04 06:04:08  No: 5088

通りすがりさんのおっしゃるように、単純にボタンを押したときに、ccの値が決まってしまっているので、後の色が全て同じになってしまっています。


ウォレス  2003-10-05 07:49:29  No: 5089

成る程〜〜〜。
目から鱗、です。
ありがとうございました。やはり根本からわかってないんですね(汗


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

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






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