为什么DrawGrid1.Canvas.Pixels[x,y]返回值为-1?(60分)

  • 主题发起人 主题发起人 hqh79
  • 开始时间 开始时间
H

hqh79

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在DrawGrid1中实现,点击一下DrawGrid1,所选中的cell的原来颜色是Clwindows则让其变为红色,否则让其变为Clwindows。
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
x,y:integer;
begin
ARow:=DrawGrid1.Row;
ACol:=DrawGrid1.Col;
x:=ACol*DrawGrid1.DefaultColWidth+3;
y:=ARow*DrawGrid1.DefaultRowHeight+3;

if DrawGrid1.Canvas.Pixels[x,y]=Clred then
DrawGrid1.Canvas.Brush.Color:=clWindow
else
DrawGrid1.Canvas.Brush.Color:=Clred;
DrawGrid1.Canvas.FillRect(DrawGrid1.CellRect(ACol,ARow));
end;
但DrawGrid1.Canvas.Pixels[x,y]总返回-1?
有什么其它更好的办法实现?
 
这样的代码可以实现你的要求啊,你管她返回值是多少呢
 
to 来如风:
不行啊:(因为返回值是-1,所以if DrawGrid1.Canvas.Pixels[x,y]=Clred then
DrawGrid1.Canvas.Brush.Color:=clWindow 就不会执行。
 
以上的代码运行以后,窗体变成了黑色的
要知道,在delphi中,颜色是这样定义的
type TColor = -$7FFFFFFF-1..$7FFFFFFF;
所以呢,返回值并不是-1,而是一种颜色
我实验了一下,是黑颜色
在你的程序中,我增加了一个标签,用来看你到底返回的是什么颜色,如下:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
x,y:integer;
begin
ARow:=DrawGrid1.Row;
ACol:=DrawGrid1.Col;
x:=ACol*DrawGrid1.DefaultColWidth+3;
y:=ARow*DrawGrid1.DefaultRowHeight+3;

Label1.Color := Tcolor(DrawGrid1.Canvas.Pixels[x,y]);

if Tcolor(DrawGrid1.Canvas.Pixels[x,y])=Clred then
DrawGrid1.Canvas.Brush.Color:=clWindow
else
DrawGrid1.Canvas.Brush.Color:=Clred;
DrawGrid1.Canvas.FillRect(DrawGrid1.CellRect(ACol,ARow));
end;
发现这样一个现象,DrawGrid显示的颜色比在系统中表示的颜色眼晚半拍
不信,可以去看看
屏蔽掉DrawCell事件,在MouseDown 事件中增加这样的代码
procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
self.Label1.Color := self.DrawGrid1.Canvas.Pixels[x,y];
caption := IntTostr(DrawGrid1.Canvas.Pixels[x,y]);
if Tcolor(DrawGrid1.Canvas.Pixels[x,y])=Clred then
Color:=clWindow
else
Color:=Clred;
end;
可以看见DrawGrid1.Canvas.Pixels[x,y]返回的是什么,可是要是
在代码中增加断点以后,caption又是-1了,
现在看来,这个控件不听话的原因是vcl对于一些消息的处理,很麻
烦的一个话题,好在楼主的代码已经能实现把当前点击的cell变成
需要的颜色了,
 
楼主:
你的代码可以实现你的功能的,你的返回值是-1 ,这是正确的,她的返回值只有-1或者是没有
你可以看canvas的Pixels的帮助说明,上面说的很清楚的;
你如果没有实现的可能是其他问题,我帮你测试过的
 
我的本意是DrawGrid1中每个cell的颜色确定后,循环所有的cell,若cell的颜色是红色则对应数组的元素为1,否则为0。
我用if DrawGrid1.Canvas.Pixels[x,y]=Clred then
这样的代码不行[:(]
不过我现在已用StringGrid1实现了。
谢谢两位兄弟的帮忙:)
 
后退
顶部