[gelöst] ListView unter Linux nicht komplett?

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] ListView unter Linux nicht komplett?

Beitrag von catweasel »

Moin

Ist es möglich das die ListView Komponente noch nicht komplett für Linux umgesetzt ist?

Ich habe ein kleines Programm geschrieben das unter Windows und Linux laufen soll
Unter anderem werden dort auch die Spalten vom ListView unterschiedlich eingefärbt.

Bei Windows funktioniert es, bei dem gleichen Quelltext unter Linux bleiben alle Spalten weiß.
Muß ich das unter Linux anders lösen, oder geht das schlichtweg nicht weil die Komponente noch nicht fertig ist?

Code: Alles auswählen

 
{TODO: Farben setzen funktionieren nicht für Linux}
// ListView Farbe erste Spalte
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
   ListView1.Canvas.Brush.color := $00C9FEFD;
end;
 
{TODO: Farben setzen funktionieren nicht für Linux}
// ListView Farbe alle weiteren Spalten
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  case SubItem of
       1,2 : ListView1.Canvas.Brush.color := $00C9FEFD;
         3 : ListView1.Canvas.Brush.color := $00B1E6FE;
         4 : ListView1.Canvas.Brush.color := $00E6D6C8;
         5 : ListView1.Canvas.Brush.color := $00B7B7FF;
  end;
end;
Zuletzt geändert von catweasel am Mo 30. Dez 2019, 17:14, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView unter Linux nicht komplett?

Beitrag von theo »

Probier doch mal explizit zu zeichnen, nach dem setzen der Farbe:

Code: Alles auswählen

ListView1.Canvas.FillRect(Item.DisplayRect(drBounds));   

Und:

Code: Alles auswählen

ListView1.Canvas.FillRect(Item.DisplayRectSubItem(SubItem,drBounds))


Achtung: State: TCustomDrawState gibt es auch noch!

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView unter Linux nicht komplett?

Beitrag von catweasel »

theo hat geschrieben:Probier doch mal explizit zu zeichnen, nach dem setzen der Farbe:!


So ganz bringt es mich noch nicht zum Ziel.
Unter Windows hat es zur Folge das der Inhalt mit der Hintergrundfarbe überschrieben wird, das kann ich aber mit {$IFDEF UNIX} umgehen, so daß der Eintrag nur für Linux gilt.

Was aber noch stört ist, daß die Schriftfarbe bei der markierten Zeile weiß ist. Bei einem hellen Hintergrund ist das kaum zu lesen.
Ist vielleicht zweite Klasse Wissen, aber ich weis nicht wie ich die Schriftfarbe bei der markierten Zeile ändere.
Pen.color oder Font.Color führen nicht zum Ziel die Schriftfarbe bei der markierten Zeile zu ändern.

Code: Alles auswählen

{TODO: Farben setzen funktionieren nicht für Linux}
// ListView Farbe erste Spalte
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
   ListView1.Canvas.Brush.color := $00C9FEFD;
   ListView1.Canvas.Font.Color:=clBlack;
   {$IFDEF UNIX}
     ListView1.Canvas.FillRect(Item.DisplayRect(drBounds));
   {$ENDIF}
end;
{TODO: Farben setzen funktionieren nicht für Linux}
// ListView Farbe alle weiteren Spalten
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  case SubItem of
       1,2 : ListView1.Canvas.Brush.color := $00C9FEFD;
         3 : ListView1.Canvas.Brush.color := $00B1E6FE;
         4 : ListView1.Canvas.Brush.color := $00E6D6C8;
         5 : ListView1.Canvas.Brush.color := $00B7B7FF;
  end;
  {$IFDEF UNIX}
    ListView1.Canvas.FillRect(Item.DisplayRectSubItem(SubItem,drBounds));
  {$ENDIF}
end;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView unter Linux nicht komplett?

Beitrag von theo »

Dann musst du halt auch noch selber den Text ausgeben, etwa so wie unten.
Musst halt ein bisschen tüfteln und googlen, das weiss ich ja auch nicht auswendig, wie das geht.


Code: Alles auswählen

  procedure TMyForm.ListViewCustomDrawItem(Sender: TCustomListView;
    Item: TListItem; State: TCustomDrawState; var DefaultDraw: boolean);
  var
    rct: TRect;
  begin
    if (cdsSelected in State) then
    begin
      Sender.Canvas.Font.Style := [fsBold];
      Sender.Canvas.Font.Color := clHighlightText;
      Sender.Canvas.Brush.color := clHighlight;
    end
    else
    begin
      Sender.Canvas.Font.Style := [];
      Sender.Canvas.Font.Color := clYellow;
      Sender.Canvas.Brush.color := clGreen;
    end;
    rct := Item.DisplayRect(drLabel);
     Sender.Canvas.FillRect(Item.DisplayRect(drBounds));
    Sender.Canvas.TextOut(rct.Left, rct.Top, Item.Caption);
    DefaultDraw := False;
  end;
 
  procedure TMyForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
    Item: TListItem; SubItem: integer; State: TCustomDrawState;
  var DefaultDraw: boolean);
  var
    rct: TRect;
  begin
    if (cdsSelected in State) then
    begin
      Sender.Canvas.Font.Style := [fsBold];
      Sender.Canvas.Font.Color := clHighlightText;
      Sender.Canvas.Brush.color := clHighlight;
    end
    else
    begin
      Sender.Canvas.Font.Style := [];
      Sender.Canvas.Font.Color := clRed;
      case SubItem of
        1, 2: Sender.Canvas.Brush.color := $00C9FEFD;
        3: Sender.Canvas.Brush.color := $00B1E6FE;
        4: Sender.Canvas.Brush.color := $00E6D6C8;
        5: Sender.Canvas.Brush.color := $00B7B7FF;
      end;
    end;
    rct := Item.DisplayRectSubItem(SubItem, drLabel);
    Sender.Canvas.FillRect(Item.DisplayRectSubItem(SubItem, drBounds));
    Sender.Canvas.TextOut(rct.Left, rct.Top, Item.Caption);
    DefaultDraw := False;
  end;
 

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView unter Linux nicht komplett?

Beitrag von catweasel »

theo hat geschrieben:Dann musst du halt auch noch selber den Text ausgeben, etwa so wie unten.
Musst halt ein bisschen tüfteln und googlen, das weiss ich ja auch nicht auswendig, wie das geht.

Danke, auf der Basis habe ich es jetzt hinbekommen. :)

Gruß
Michael

Antworten