// Hier ein Code für eine Komponente, welche von
TListView abgeleitet ist.
// Damit kann man
(bei ViewStyle = vsReport)
pro Spalte eine eigene Farbe
// für den Columnheader und auch dessen Schrift festlegen, sowie den
// Fontstyle für alle Header gleichzeitig ändern. Außerdem kann man Bilder
// im Header nach Wahl links oder rechts vom Text anordnen lassen. Die
// Farben für Header und deren Text werden in Strings
(ColumnColors,
// ColumnFontColors)
getrennt durch Leerzeichen hinterlegt (siehe unten bei
// "Beispielaufruf")
.
//
! Die Komponente wird erst zur Laufzeit korrekt dargestellt !
// Einen Code der ohne Komponente
(und ohne Bilder) auskommt,
// findet man auf:
Columnheader farbig darstellen


// Getestet mit D4 unter WinME

unit LV; 
 
interface 
 
uses 
  Windows, Forms, Messages, Classes, CommCtrl, Graphics, Controls, ComCtrls; 
 
type 
  adjustment = (ciaLeft, ciaRight); 
  TLV = class(TListView) 
  private 
    h: HWND; 
    dc: HDC; 
    pt: TPoint; 
    c: TCanvas; 
    ad: adjustment; 
    fs: TFontStyles; 
    AltProz: Pointer; 
    sl, fsl: TStringlist; 
    colors, fontcolors: string; 
    rand, unten: integer; 
  protected 
    procedure NeuProz(var M: TMessage); 
    procedure setfontcolors(s: string); 
    procedure setfs(f: TFontStyles); 
    procedure setcolors(s: string); 
    procedure setad(a: adjustment); 
    procedure CreateWnd; override; 
    procedure paintbuttons; 
    procedure Pnt; 
  public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
  published 
    property ColumnFontColors: string read fontcolors write setfontcolors; 
    property ColumnImageAlignment: adjustment read ad write setad; 
    property ColumnColors: string read colors write setcolors; 
    property ColumnFontStyle: TFontStyles read fs write setfs; 
  end; 
 
procedure Register; 
 
implementation 
 
procedure Register; 
begin 
  RegisterComponents('DBR', [TLV]); 
end; 
 
constructor TLV.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  sl := TStringlist.create; 
  fsl := TStringlist.create; 
  c := TCanvas.create; 
  rand := 4; 
end; 
 
destructor TLV.Destroy; 
begin 
  c.free; 
  fsl.free; 
  sl.free; 
  releasedc(h, dc); 
  inherited Destroy; 
end; 
 
procedure TLV.NeuProz(var M: TMessage); 
begin 
  if assigned(AltProz) then begin 
    M.Result := CallWindowProc(AltProz, h, M.Msg, M.WParam, M.LParam); 
    if ColumnClick then begin 
      if (M.Msg = WM_LBUTTONDOWN) 
        then begin 
        pt := point(M.LParamLo, M.LparamHi); 
        unten := 1; 
      end else if (M.Msg = WM_LBUTTONUP) 
        then begin 
        unten := 0; 
        pnt; 
      end; 
    end; 
    if M.Msg = WM_PAINT then pnt; 
  end; 
end; 
 
procedure TLV.CreateWnd; 
begin 
  inherited; 
  h := Listview_Getheader(handle); 
  SetWindowlong(h, gwl_style, GetWindowlong(h, gwl_style) 
    and not HDS_FULLDRAG); 
  dc := GetDC(h); 
  c.handle := dc; 
  AltProz := Pointer(GetWindowlong(h, GWL_WNDPROC)); 
  SetWindowlong(h, GWL_WNDPROC, Integer(MakeObjectInstance(NeuProz))); 
end; 
 
procedure TLV.Pnt; 
var x, y: integer; 
begin 
  if smallImages <> nil then begin 
    y := smallImages.width + 2 * (rand + 2); 
    for x := 0 to Columns.Count - 1 do 
      if (Columns[x].ImageIndex >= 0) and 
        (ListView_GetColumnWidth(handle, x) < y) then begin 
        ListView_SetColumnWidth(handle, x, y); 
        columns[x].width := y; 
      end; 
  end; 
  PaintButtons; 
end; 
 
procedure TLV.setad(a: adjustment); 
begin 
  if a = ad then exit; 
  ad := a; 
  refresh; 
end; 
 
procedure TLV.setfs(f: TFontStyles); 
begin 
  if f = fs then exit; 
  fs := f; 
  refresh; 
end; 
 
procedure TLV.setcolors(s: string); 
begin 
  colors := s; 
  sl.commatext := colors; 
  refresh; 
end; 
 
procedure TLV.setfontcolors(s: string); 
begin 
  fontcolors := s; 
  fsl.commatext := fontcolors; 
  refresh; 
end; 
 
procedure TLV.PaintButtons; 
var 
  m, x, y: integer; 
  r, re: TRect; 
begin 
  if (not ShowColumnHeaders) or (ViewStyle <> vsReport) then exit; 
  windows.GetClientRect(h, r); 
  y := 0; 
  c.font.size := font.size; 
  c.font.style := fs; 
  for x := 0 to Columns.Count - 1 do begin 
    re := Rect(y + 1, 1, y + ListView_GetColumnWidth(handle, x) 
      - 1, r.bottom - 2); 
    if ptinrect(re, pt) then offsetrect(re, unten, unten); 
    try 
      c.brush.color := stringtocolor(sl[x]); 
    except c.brush.color := clBtnFace; 
    end; 
    try 
      c.font.color := stringtocolor(fsl[x]); 
    except c.font.color := clWindowText; 
    end; 
    c.FillRect(re); 
    inc(re.left, rand); 
    dec(re.right, 2); 
    if smallImages <> nil then begin 
      if Columns[x].ImageIndex >= 0 then begin 
        m := 1 + (re.bottom - smallImages.height) div 2; 
        if ad = ciaLeft then begin 
          smallImages.draw(c, re.left, m, Columns[x].ImageIndex); 
          inc(re.left, smallImages.width + rand); 
        end else begin 
          smallImages.draw(c, re.right - smallImages.width, m, 
            Columns[x].ImageIndex); 
          dec(re.right, smallImages.width + rand); 
        end; 
      end; 
    end; 
    drawtext(c.handle, pchar(Columns[x].Caption), -1, re, dt_left); 
    y := y + ListView_GetColumnWidth(handle, x); 
  end; 
  try 
    c.brush.color := stringtocolor(sl[Columns.Count]); 
  except c.brush.color := clbtnface; 
  end; 
  c.FillRect(Rect(y + 1, 1, r.Right, r.Bottom - 2)); 
end; 
 
end. 
 
 
 
//--------------------------------------------------------- 
 
// Beispielaufruf 
procedure TForm1.Button1Click(Sender: TObject); 
var x: integer; 
begin 
  lv1.items.beginupdate; 
  for x := 0 to 2 do begin 
    if lv1.columns.count = x then lv1.Columns.add; 
    lv1.column[x].caption := 'Spalte ' + inttostr(x + 1); 
    lv1.column[x].width := 70; 
  end; 
  lv1.smallImages := ImageList1; 
  lv1.Column[0].ImageIndex := 0; 
  lv1.ColumnImageAlignment := ciaRight; 
  lv1.ColumnFontStyle := [fsitalic, fsbold]; 
  lv1.ColumnColors := 'clred $FF6633 clyellow clblack'; 
  lv1.ColumnFontColors := 'clwhite $00CCFF $FF6600'; 
  lv1.items.endupdate; 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke