Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bestimmte Spalten in ListView bemalen (https://www.delphipraxis.net/117231-bestimmte-spalten-listview-bemalen.html)

Alfonso3 14. Jul 2008 16:12


Bestimmte Spalten in ListView bemalen
 
Hallo!

bin zwar erst neu registriert, lese aber schon länger hilfreiche Themen in eurem Forum mit.

Nun zu meinem Problem:

Ich möchte in einer Listview eine gewisse Spalte abhängig vom Wert färben.

Ich habe zware eine Lösung, nur finde ich diese nicht zufriedenstellend, anbei der Code:

Delphi-Quellcode:
procedure TfmLohnartB.lvDataAdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
 posPlan  : TPoint;
 indItem  : integer;
 subIt    : TStrings;
 oldColor : TColor;
 r        : TRect;
begin
  inherited;
  if (sender.Column[SubItem].Caption = 'Plan') then begin

    //DefaultDraw := False;
    r := Item.DisplayRect(drBounds);
    r.Left := r.Left + ListView_GetColumnWidth(lvData.Handle, 0) +
              ListView_GetColumnWidth(lvData.Handle, 1) +
              ListView_GetColumnWidth(lvData.Handle, 2) +
              ListView_GetColumnWidth(lvData.Handle, 3) +
              ListView_GetColumnWidth(lvData.Handle, 4) +
              ListView_GetColumnWidth(lvData.Handle, 5) +
              ListView_GetColumnWidth(lvData.Handle, 6);

    r.Right := r.Left + ListView_GetColumnWidth(lvData.Handle, 7);
    try
      oldColor := Sender.Canvas.Brush.Color;
      Sender.Canvas.Brush.Color := clRed;


      Sender.Canvas.Rectangle(r);
    finally
      Sender.Canvas.Brush.Color := oldColor;
    end;
  end;
geht das nicht irgendwie eleganter...so möchte ich es eigentlich nicht lassen, da es leicht flimmert usw..!

lg,
thorsten

Helmi 14. Jul 2008 17:12

Re: Bestimmte Spalten in ListView bemalen
 
Hallo,

ich kann dir zwar nicht so ganz helfen, aber für diesen Teil
Delphi-Quellcode:
    r := Item.DisplayRect(drBounds);
    r.Left := r.Left + ListView_GetColumnWidth(lvData.Handle, 0) + 
              ListView_GetColumnWidth(lvData.Handle, 1) + 
              ListView_GetColumnWidth(lvData.Handle, 2) + 
              ListView_GetColumnWidth(lvData.Handle, 3) + 
              ListView_GetColumnWidth(lvData.Handle, 4) + 
              ListView_GetColumnWidth(lvData.Handle, 5) + 
              ListView_GetColumnWidth(lvData.Handle, 6);

    r.Right := r.Left + ListView_GetColumnWidth(lvData.Handle, 7);
könntes du auch dies hier verwenden, so erzählst du die einzelne Zelle
Delphi-Quellcode:
  //Rect der Zelle erhalten
  ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @Rect);
Und du könntest mal
Delphi-Quellcode:
lvData.DoubleBuffered := true
ausprobieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz