如何快速设置DBGrid中每一个单元格的字体颜色?(100分)

  • 主题发起人 主题发起人 lingb
  • 开始时间 开始时间
L

lingb

Unregistered / Unconfirmed
GUEST, unregistred user!
如何快速设置DBGrid中每一个单元格的字体颜色?不是整行、整列改变而是改变具体某一单元格的字体颜色?实现的效果是每个单元格颜色不同。
是要整体设置,而不是点击每一个单元格进行改变,发现drawcell方法速度很慢啊!
 
draw方法不慢,看你的算法是否得当
 
请赐教啊,我觉得怎么很慢?
 
把你的贴出来看看....
 
OnDrawCell事件里面应该还是很快的啊。
 
OnDrawCell不在这写,还能哪写
 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure ChangeColor(sColor,sBall:string;iCol:integer;cColor:TColor);
begin
qryadd.Close;
qryadd.SQL.Clear;
qryadd.SQL.Text:='select ball,color from Ballset where color='+#39+sColor+#39;
qryadd.Open;
qryadd.First;
while not qryadd.Eof do
begin
if (query1.FieldByName(sBall).AsInteger=qryadd.FieldByName('ball').AsInteger)and(DataCol=iCol) then
begin
DBGrid1.Canvas.Font.Color := cColor;
// DBGrid1.Canvas.Brush.Color := clBlue;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
qryadd.Next;
end;
qryadd.Close;
end;

begin
ChangeColor('蓝','FirstBall',1,clBlue);
ChangeColor('蓝','SecondBall',2,clBlue);
ChangeColor('蓝','ThirdBall',3,clBlue);
ChangeColor('蓝','ForthBall',4,clBlue);
ChangeColor('蓝','FifthBall',5,clBlue);
ChangeColor('蓝','SixthBall',6,clBlue);
ChangeColor('蓝','LastBall',7,clBlue);
ChangeColor('红','FirstBall',1,clRed);
ChangeColor('红','SecondBall',2,clRed);
ChangeColor('红','ThirdBall',3,clRed);
ChangeColor('红','ForthBall',4,clRed);
ChangeColor('红','FifthBall',5,clRed);
ChangeColor('红','SixthBall',6,clRed);
ChangeColor('红','LastBall',7,clRed);
ChangeColor('绿','FirstBall',1,clGreen);
ChangeColor('绿','SecondBall',2,clGreen);
ChangeColor('绿','ThirdBall',3,clGreen);
ChangeColor('绿','ForthBall',4,clGreen);
ChangeColor('绿','FifthBall',5,clGreen);
ChangeColor('绿','SixthBall',6,clGreen);
ChangeColor('绿','LastBall',7,clGreen);
end;
 
楼主,你的做法有很大的问题,为什么要在ondrawcolumncell里打开表呢?
ondraw事件的执行频率是很高的,不断的open数据当然会很慢,你要想办法把open放到draw外面去执行一次就行了
 
他打开了这么多次数据集,难怪。
 
改成这样拉,效果还是不理想:(
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure ChangeColor(sBall:string;iCol:integer;cColor:TColor;qry:TQuery);
begin
qry.First;
while not qry.Eof do
begin
if (query1.FieldByName(sBall).AsInteger=qry.FieldByName('ball').AsInteger)and(DataCol=iCol) then
begin
DBGrid1.Canvas.Font.Color := cColor;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
qry.Next;
end;
end;

begin
ChangeColor('FirstBall',1,clBlue,query5);
ChangeColor('SecondBall',2,clBlue,query5);
ChangeColor('ThirdBall',3,clBlue,query5);
ChangeColor('ForthBall',4,clBlue,query5);
ChangeColor('FifthBall',5,clBlue,query5);
ChangeColor('SixthBall',6,clBlue,query5);
ChangeColor('LastBall',7,clBlue,query5);

ChangeColor('FirstBall',1,clRed,query6);
ChangeColor('SecondBall',2,clRed,query6);
ChangeColor('ThirdBall',3,clRed,query6);
ChangeColor('ForthBall',4,clRed,query6);
ChangeColor('FifthBall',5,clRed,query6);
ChangeColor('SixthBall',6,clRed,query6);
ChangeColor('LastBall',7,clRed,query6);

ChangeColor('FirstBall',1,clGreen,query7);
ChangeColor('SecondBall',2,clGreen,query7);
ChangeColor('ThirdBall',3,clGreen,query7);
ChangeColor('ForthBall',4,clGreen,query7);
ChangeColor('FifthBall',5,clGreen,query7);
ChangeColor('SixthBall',6,clGreen,query7);
ChangeColor('LastBall',7,clGreen,query7);
end;
 
不要循环的,这样试试应该就快了.一样可以设到每一个单元格
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure ChangeColor(sBall:string;iCol:integer;cColor:TColor;qry:TQuery);
begin
// qry.First;
// while not qry.Eof do
// begin
if (query1.FieldByName(sBall).AsInteger=qry.FieldByName('ball').AsInteger)and(DataCol=iCol) then
begin
DBGrid1.Canvas.Font.Color := cColor;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
// qry.Next;
// end;
end;

begin
ChangeColor('FirstBall',1,clBlue,query5);
ChangeColor('SecondBall',2,clBlue,query5);
ChangeColor('ThirdBall',3,clBlue,query5);
ChangeColor('ForthBall',4,clBlue,query5);
ChangeColor('FifthBall',5,clBlue,query5);
ChangeColor('SixthBall',6,clBlue,query5);
ChangeColor('LastBall',7,clBlue,query5);

ChangeColor('FirstBall',1,clRed,query6);
ChangeColor('SecondBall',2,clRed,query6);
ChangeColor('ThirdBall',3,clRed,query6);
ChangeColor('ForthBall',4,clRed,query6);
ChangeColor('FifthBall',5,clRed,query6);
ChangeColor('SixthBall',6,clRed,query6);
ChangeColor('LastBall',7,clRed,query6);

ChangeColor('FirstBall',1,clGreen,query7);
ChangeColor('SecondBall',2,clGreen,query7);
ChangeColor('ThirdBall',3,clGreen,query7);
ChangeColor('ForthBall',4,clGreen,query7);
ChangeColor('FifthBall',5,clGreen,query7);
ChangeColor('SixthBall',6,clGreen,query7);
ChangeColor('LastBall',7,clGreen,query7);
end;
 
多人接受答案了。
 
后退
顶部