TListView Zellenformatierung mit CustomDraw

Rund um die LCL und andere Komponenten
Antworten
RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

TListView Zellenformatierung mit CustomDraw

Beitrag von RuhrPotto »

Im Rahmen einer Delphi-Portierung soll die Zelle einer TListView gesondert formatiert werden (Text-Farbe und Text-Stil). Im Ursprungsprogramm erfolgt dies problemlos so

Code: Alles auswählen

 
procedure TFrmVwJournal.lvJournalAdvancedCustomDrawSubItem(
  Sender: TCustomListView; Item: TListItem; SubItem: Integer;
  State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  C : TColor;
  wC : char;
begin
  if SubItem <> 7 then EXIT;
 
  wC := Item.Caption[1];
  case wC of
    'E' : C := clGreen;
    'A' : C := clRed;
    'U' : C := clBlue;
  end;
  Sender.Canvas.Font.Style := [fsBold];
  Sender.Canvas.Font.Color := C;
end;
 
Unter Lazarus geht es nicht. Laut Forensuche handelt sich um einen schon länger vorhandenen Bug
http://www.lazarusforum.de/viewtopic.ph ... t=ListView und http://bugs.freepascal.org/view.php?id=25397

Der beschriebene Workaround liefert leider nicht das gewünschte Ergebnis und sieht optisch nicht gerade gut aus.

Hat jemand eine andere Lösung zu diesem Problem gefunden?
Und kann es wirklich sein, dass der Bug schon so lange offen ist?

Danke
Jeder macht Fehler - viele Fehler brauchen EDV!

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: TListView Zellenformatierung mit CustomDraw

Beitrag von RuhrPotto »

:!: Also - ich habe eine Teillösung gefunden.
Folgender Code formatiert die letzte / rechte Spalte einer ListView in einer anderen Textfarbe in Abhängigkeit vom Eintrag in der ersten Spalte der Zeile:

Code: Alles auswählen

 
// Note - Objektinspektor :: lvBuch.OwnerDraw := false;
procedure TFormJournal.lvBuchAdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  C   : TColor;
  wC  : char;
begin
  if Item.SubItems.Count <> SubItem then Exit; //nur Auswahl letzte/rechte Spalte
 
  wC  := Item.Caption[1];                      //Auswahlwert: 1 Zeichen der 1. Spalte
  case wC of
    'E' : C := clGreen;
    'A' : C := clRed;
    'U' : C := clBlue;
  end;
 
  lvBuch.Canvas.Font.Style := [fsBold];        // [b]<-- BUG - wird ignoriert !!![/b]
  lvBuch.Canvas.Font.Color := c;
end;  
 
Auf das Textformat "fett" muss man bei dieser Lösung aufgrund des Bugs leider verzichten; zumindest die Farbe funktioniert.
Vielleicht hilft es ja jemandem weiter.

:arrow: Falls es eine bessere Lösung gibt, bin ich jederzeit offen dafür.
Jeder macht Fehler - viele Fehler brauchen EDV!

Antworten