我用TStringGrid的OnDrawCell事件来给网格中的字体改变颜色,每个单元格的数据和stringlist中的数据比较,不同就将单元格字体显示蓝色,相同显示红色,当写入单元格中的数据较少时,一般少于100多时运行显示都很正常,当大于200时显示就不正常,有时应该部分显示红色但全部显示红色,有时还一直在动态显示中稳定不小来也停止不了运行。求解。
procedure TFrmDataAnalyse.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
x,y,m,n:integer;
s:string;
begin
//下面是绘制单元格颜色,相同时为红色
with StringGrid1 do
begin
n:=StringGrid1.RowCount;
m:=StringGrid1.ColCount;
for y:=1 to m-1 do
begin
for x:=1 to n-1 do
begin
rect:= StringGrid1.CellRect(y,x);
s:= StringGrid1.Cells[y,x];
if pos(s,emptyaddr.CommaText)=0 then //emptyaddr.CommaText 内容为其他过程获得一般数据比较多
begin
StringGrid1.Canvas.Font.Color:=clBlue;
StringGrid1.Canvas.FillRect(rect);
end
else
begin
StringGrid1.Canvas.Font.Color:=clRed;
StringGrid1.Canvas.FillRect(rect);
end;
drawtext(StringGrid1.Canvas.Handle,pchar(s),length(s),rect, DT_CENTER);
//StringGrid1.Canvas.TextOut(rect.Left+2,rect.Right+2,Top+2,s);
if s = inttostr(last) then break;
end;
end;
end;
end;
procedure TFrmDataAnalyse.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
x,y,m,n:integer;
s:string;
begin
//下面是绘制单元格颜色,相同时为红色
with StringGrid1 do
begin
n:=StringGrid1.RowCount;
m:=StringGrid1.ColCount;
for y:=1 to m-1 do
begin
for x:=1 to n-1 do
begin
rect:= StringGrid1.CellRect(y,x);
s:= StringGrid1.Cells[y,x];
if pos(s,emptyaddr.CommaText)=0 then //emptyaddr.CommaText 内容为其他过程获得一般数据比较多
begin
StringGrid1.Canvas.Font.Color:=clBlue;
StringGrid1.Canvas.FillRect(rect);
end
else
begin
StringGrid1.Canvas.Font.Color:=clRed;
StringGrid1.Canvas.FillRect(rect);
end;
drawtext(StringGrid1.Canvas.Handle,pchar(s),length(s),rect, DT_CENTER);
//StringGrid1.Canvas.TextOut(rect.Left+2,rect.Right+2,Top+2,s);
if s = inttostr(last) then break;
end;
end;
end;
end;
解决方案 »
- Delphi2006中如何加载TShockwaveFlash控件?
- 关于程序打包的问题
- Indy10中IDHTTP控件OnWorkBegin事件的疑问?
- 哪位兄台有做过类似于QQ的东西啊?小弟急需帮助!
- 请大家帮忙看一下下面这段程序,为什么老是通不过啊!!
- 怎样用IDTCPClient下载文件?
- 想开发一个基于触摸屏的程序
- delphi fastreport 交叉报表 是否可以在行Grand Tota下边在加几行
- 安装文件是在搞不定了,今天又要交,哪位可以帮我做一下,谢谢了!!!!分不够的话可以在加!
- 数据库简单查询问题
- DELPHI7 WEBBROWSER显示图片并实现放大与缩小
- 使用edit 往数据库存数据 判断是否有重复的
比较可以放到外面先比较好.然后用个数组先记录着
本来 string的效率就不是很高.你还循环
if pos(s,emptyaddr.CommaText)=0 then //emptyaddr.CommaText 内容为其他过程获得一般数据比较多
如果单纯的画,一万个也不是问题。
procedure TFrmDataAnalyse.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
s:string;
begin
with self.StringGrid1 do
begin
StringGrid1.Canvas.FillRect(rect);
s:= StringGrid1.Cells[ACol,ARow];
drawtext(StringGrid1.Canvas.Handle,pchar(s),length(s),rect, DT_CENTER);
end;
end;
但是运行结果是所以的数据都显示蓝色,包括没有纳入比较的0行和0列数据也跟着显示蓝色,这是怎么回事呢,OnDrawCell这个事件到底是怎样一个个画的?应该怎样操作才对呀.
with Sender as TStringGrid do
begin
if ARow mod 2 =0 then
begin
Canvas.Brush.Color :=clMoneyGreen;
Canvas.Font.Color := clGreen;
end
else begin
Canvas.Brush.Color :=clwhite;
Canvas.Font.Color := clBlack;
end;
if gdSelected in State then
begin
Canvas.Brush.Color :=clHighlight;
Canvas.Font.Color := clHighlightText;
end;
Canvas.FillRect(Rect);
Canvas.TextOut (Rect.Left,Rect.Top ,Cells[ACol,ARow]);
end;画整行的