ListView在vsReport模式着色的项目和行 [英] ListView in vsReport mode colouring of Items and rows

查看:201
本文介绍了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;
结束
结束

屏幕截图http://privat.rejbrand.se/listviewrowcolors.png



在上面的例子中,第一列是左对齐的,另外两列是居中的



如果您只有一列,那就是没有子项:

  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模式着色的项目和行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆