困っています。何卒よろしくお願いいます。
過去にも何度か話題になっていますが、
結局、「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;
グローバル変数 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;
とすればよいのでは。。。
通りすがりさんのおっしゃるように、単純にボタンを押したときに、ccの値が決まってしまっているので、後の色が全て同じになってしまっています。
成る程〜〜〜。
目から鱗、です。
ありがとうございました。やはり根本からわかってないんですね(汗
ツイート | ![]() |