delphi listview colors row brush

delphi - ListView en el modo vsReport para colorear elementos y filas



colors row (1)

Quiero colorear una fila en gris y la otra en blanco.
Tengo el siguiente código, pero hay un espacio en blanco de líneas verticales de columnas en Windows 7.
¿Cómo coloreo todas las filas?

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;


Establezca OwnerDraw en true y agregue

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;

Captura de pantalla http://privat.rejbrand.se/listviewrowcolors.png

En el ejemplo anterior, la primera columna está alineada a la izquierda y las otras dos están centradas.

Si solo tiene una columna, es decir, no subelementos:

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;