本文介绍了ListView在vsReport模式着色的项目和行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想要灰色的一行,而另一列是白色的。我有以下代码,但Windows 7中有垂直列列的空格。
如何对所有行进行颜色?
程序TForm2.Update_ListBoxCustomDrawItem(发件人:TCustomListView;
项目:TListItem;状态: TCustomDrawState; var DefaultDraw:Boolean);
begin
如果Item.Index mod 2 = 0
then
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= $ F6F6F6;
end
else
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= clWhite;
结束
结束
解决方案
设置 OwnerDraw
to true
并添加
procedure TForm1.ListView1DrawItem(发件人:TCustomListView;项目:TListItem;
Rect:TRect;状态:TOwnerDrawState);
var
i:整数;
x1,x2:integer;
r:TRect;
S:string;
const
DT_ALIGN:整数的数组[TAlignment] =(DT_LEFT,DT_RIGHT,DT_CENTER);
begin
如果Odd(Item.Index)然后
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= $ F6F6F6;
end
else
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= clWhite;
结束
Sender.Canvas.Brush.Style:= bsSolid;
Sender.Canvas.FillRect(Rect);
x1 = = 0;
x2:= 0;
r:= Rect;
Sender.Canvas.Brush.Style:= bsClear;
for i:= 0 to ListView1.Columns.Count - 1 do
begin
inc(x2,ListView1.Columns [i] .Width);
r.Left:= x1;
r.Right:= x2;
如果i = 0,那么
S:= Item.Caption
else
S:= Item.SubItems [i];
DrawText(Sender.Canvas.Handle,
S,
length(S),
r,
DT_SINGLELINE或DT_ALIGN [ListView1.Columns [i] .Alignment]或
DT_VCENTER或DT_END_ELLIPSIS);
x1:= x2;
结束
结束
在上面的例子中,第一列是左对齐的,另外两列是居中的
如果您只有一列,那就是没有子项:
procedure TForm1.ListView1DrawItem(Sender:TCustomListView; Item:TListItem;
Rect:TRect; State:TOwnerDrawState);
var
r:TRect;
S:string;
const
DT_ALIGN:整数的数组[TAlignment] =(DT_LEFT,DT_RIGHT,DT_CENTER);
begin
如果奇数(Item.Index)然后
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= $ F6F6F6;
end
else
begin
Sender.Canvas.Font.Color:= clBlack;
Sender.Canvas.Brush.Color:= clWhite;
结束
Sender.Canvas.Brush.Style:= bsSolid;
Sender.Canvas.FillRect(Rect);
r:= Rect;
Sender.Canvas.Brush.Style:= bsClear;
S:= Item.Caption;
DrawText(Sender.Canvas.Handle,
S,
length(S),
r,
DT_SINGLELINE或DT_ALIGN [ListView1.Columns [0] .Alignment]或DT_VCENTER或DT_END_ELLIPSIS);
结束
I want to color one row in gray and the other in white.
I have the following code but there is white space of vertical lines of columns in Windows 7.
How do I color all rows?
procedure TForm2.Update_ListBoxCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Item.Index mod 2=0
then
begin
Sender.Canvas.Font.Color:=clBlack;
Sender.Canvas.Brush.Color:=$F6F6F6;
end
else
begin
Sender.Canvas.Font.Color:=clBlack;
Sender.Canvas.Brush.Color:=clWhite;
end;
end;
解决方案
Set OwnerDraw
to true
and add
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
var
i: Integer;
x1, x2: integer;
r: TRect;
S: string;
const
DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
if Odd(Item.Index) then
begin
Sender.Canvas.Font.Color := clBlack;
Sender.Canvas.Brush.Color := $F6F6F6;
end
else
begin
Sender.Canvas.Font.Color := clBlack;
Sender.Canvas.Brush.Color := clWhite;
end;
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.FillRect(Rect);
x1 := 0;
x2 := 0;
r := Rect;
Sender.Canvas.Brush.Style := bsClear;
for i := 0 to ListView1.Columns.Count - 1 do
begin
inc(x2, ListView1.Columns[i].Width);
r.Left := x1;
r.Right := x2;
if i = 0 then
S := Item.Caption
else
S := Item.SubItems[i];
DrawText(Sender.Canvas.Handle,
S,
length(S),
r,
DT_SINGLELINE or DT_ALIGN[ListView1.Columns[i].Alignment] or
DT_VCENTER or DT_END_ELLIPSIS);
x1 := x2;
end;
end;
Screenshot http://privat.rejbrand.se/listviewrowcolors.png
In the above example, the first column is left-aligned and the two other are centered.
If you only have one column, that is, no subitems:
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
var
r: TRect;
S: string;
const
DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
if odd(Item.Index) then
begin
Sender.Canvas.Font.Color:=clBlack;
Sender.Canvas.Brush.Color:=$F6F6F6;
end
else
begin
Sender.Canvas.Font.Color:=clBlack;
Sender.Canvas.Brush.Color:=clWhite;
end;
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.FillRect(Rect);
r := Rect;
Sender.Canvas.Brush.Style := bsClear;
S := Item.Caption;
DrawText(Sender.Canvas.Handle,
S,
length(S),
r,
DT_SINGLELINE or DT_ALIGN[ListView1.Columns[0].Alignment] or DT_VCENTER or DT_END_ELLIPSIS);
end;
这篇关于ListView在vsReport模式着色的项目和行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!