DrawStyle设成OwnerDraw
在OnDrawCell事件中自己画.
在OnDrawCell事件中自己画.
解决方案 »
- 昨天北京港澳中心举办的XE2,大开眼界啊!!!
- 读版本号BCB下错误,delphi正常(分不够再加)
- 我是COM的初学者,请教一个COM的授权问题,老是报错‘无效的授权说明’
- 如何对一个自动创建的控件组定义事件?
- 谁爱这个。。。?
- 为什么编译时会出这种问题?请各位大侠帮忙!!
- 各位有没有VBA的相关资料或者电子书籍,或者Delphi操作WORD的相关资料,急用。。。在线等候。。。
- 请问,如何不允许关闭某程序
- 怎样在代码中判断某个Table中的那些Field 是必填的?
- 没什么在WIN2000下程序中放好的OLE控件到了WIN98中位置会变?
- Give me a answer, please.
- Windows 3.2 下直接I/O控制
对于DBGrid方法类似。
1、ListView.OwnerDraw := True;
2、挂接OnCustomDrawItem事件,自行绘制。
对于DBGrid,挂接OnDrawColumnCell事件试试。
procedure TForm1.ListView1CustomDraw(Sender: TCustomListView;
const ARect: TRect; var DefaultDraw: Boolean);
begin
With ListView1 do begin
Canvas.brush.Color :=clRed;
canvas.FillRect (Arect);
Canvas.TextOut (0,0, 'This is a test');
end;
DefaultDraw:=true;end;如果要更改DBGRID的网格颜色,方法也是类似,只是在OnDrawDataCell和OnDrawColumnCell时自己控制即可.下面我用一个DRAWRGRID做一示例,凡偶数行以一种颜色做为背景.在DRAWGRID控件下,是DRAWCELL事件.如果要改变字体等,请改变Canvas.font.name/size/color属性即可.procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
With DrawGrid1 do begin
if Arow mod 2 =0 then begin
canvas.brush.Color :=rgb(200,255,212);
canvas.FillRect (rect);
end;
end;
end;
kxy和lin: 你们俩描述的方法我知道,也在StringGrid上完成了,但在ListView和DBGrid上实现有些困难,主要是显示一格中的文字内容有些问题
Venne: 你的回答很切题,在你的启发下,我完成了DBGrid的美化,但在ListView的vsreport状态下,我还没有能解决,我想要在每一格内显示不同的颜色,希望你有帮助我
barton: 你的方法是一个办法,但我一般不用别人的控件,原因很多,在这里谢了
由于Venne的启发性回答,我决定先给他20分,
现在问题变为
ListView的vsreport状态下如何改变每一格的显示
希望大家继续支持我
begin
if Col = 0 then
ListView.Items[Row].Caption := Value
else begin
while ListView.Items[Row].SubItems.Count < Col - 2 do
ListView.Items[Row].SubItems.Add('');
ListView.Items[Row].SubItems[Col - 1] := Value;
end
end;
这不算一段好的代码,但希望对你有帮助。只要在表单上放一个LISTVIEW和一个BUTTON就可以了。另外,在LISTVIEW里预先放5个ITEM。我没做错误检测。
LISTVIEW开始的状态是普通状态,点击按钮后增加两个列并且转为REPORT状态。
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
NowListItem:TListItem;
NewColumn:TListColumn;
begin
NewColumn:=ListView1.Columns.Add;
NewColumn.Caption :='1';
NewColumn.Width :=ListView1.Width div 2;
NewColumn:=ListView1.Columns.Add;
NewColumn.Caption :='2';
NewColumn.Width :=ListView1.Width div 2; for i:=0 to 4 do begin
NowListItem:=ListView1.Items[i];
NowListItem.SubItems.Add(NowListItem.Caption +'-1');
end; ListView1.ViewStyle :=vsReport;
Button1.Enabled :=false;end;procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
Rect:Trect;
begin
DefaultDraw:=false;
Rect:=Item.DisplayRect( drBounds );
With Sender as TListView do begin
case item.Index of //行数控制
0,2,4:begin
if cdsSelected in State then begin //高亮判断
canvas.brush.Color :=clHighlight;
Canvas.font.Color :=clWhite;
end else begin
Canvas.Brush.Color :=rgb(255,222,222);
Canvas.font.Color :=clBlack;
end;
end;
1,3:begin
if cdsSelected in State then begin
canvas.brush.Color :=clHighlight;
Canvas.font.Color :=clWhite;
end else begin
Canvas.Brush.Color :=rgb(222,222,255);
Canvas.font.Color :=clBlack;
end;
end;
end;
Canvas.FillRect (Rect);
Canvas.brush.Style :=bsClear;
Canvas.TextRect (Rect,rect.left,rect.top,item.Caption);
if ListView1.ViewStyle =vsReport then begin
Canvas.TextRect (Rect,(Rect.left+(Rect.right-rect.left)div 2),rect.top,
item.SubItems.Text );
end;
end;
end;
尽管在你出第二个贴之前,我已经自己完成了的LISTVIEW的显示问题
但我还是要告诉你,你赚到了另外的30分,
你新出的贴虽然笨重了一点且不通用,但还是实现了分行换色显示和
SUBITEMS的显示,这完全达到我的要求
目前,国人在自己软件的包装上还不是很重视,我希望写的软件能在
这方面有所进步。近来我很忙,希望有时间时再和大家讨论美化界面
的问题!
本论题到圆满结束!!