In TListView jede zweite Zeile farbig setzen.

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

In TListView jede zweite Zeile farbig setzen.

Beitrag von Ally »

Hallo zusammen,

In einer TListView setze ich jede zweite Zeile, mit folgendem Code, farbig.

Code: Alles auswählen

procedure TfrmMain.lvListeCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: boolean);
begin
  // jede zweite Zeile farbig setzen.
  if not Odd(Item.Index) then
    lvListe.Canvas.Brush.Color := $00E3F9FF;
end;


Das funktioniert unter Windows einwandfrei.
Unter Linux Mint wird das Ganze zwar auch ausgeführt, die entsprechenden Zeilen aber nicht farbig gezeichnet. :( :?:

Gruß Roland

PS: Lazarus 2.0.2 - fpc-3.0.4

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von fliegermichl »

Ist evtl. die Property OwnerDraw false?

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von six1 »

Bei Option OwnerDraw muss aber auch der Text gezeichnet werden...
Gruß, Michael

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von BeniBela »

Mit meinem TreeListView ginge das, das ist vollständig "ownerdrawn"

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von six1 »

...ja eben, meinte ich ja.
Bei Ownerdraw muss man dann alles selbst zeichnen:
-Clientrect in Hintergrundfarbe neu zeichnen
-Text ausgeben
Gruß, Michael

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von Ally »

Hallo fliegermichl, Hallo six1,

ja OwnerDraw ist false.
Wenn ich es auf true setze, passiert das was six1 sagt: es wird nichts mehr gezeichnet, auch nicht der Hintergrund.

Gruß Roland

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von wp_xyz »

Leider hat jedes Widgetset sein Eigenleben... Bei Windows wird die Vorbereitung des Canvas, die man in OnCustomDrawitem mit gesetztem Parameter Defaultdraw = true gemacht hat, beibehalten und für die Ausgabe verwendet - ähnlich wie beim Grid im OnPrepareCanvas-Ereignis. Bei gtk2/qt wird das verworfen, hier wird offenbar zwingend DefaultDraw=true vorausgesetzt, und der User darf alles selber zeichnen, nach dem Motto: "Wenn es dir nicht passt, wie wir es wir tun, dann mach es gefälligst selbst (aber dann bitte auch alles)". Auch eine (verständliche) Ansicht.

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von Ally »

Hallo wp_xyz,

ja die Widgetsets verhalten sich recht unterschiedlich.
Ich habe nochmal einige Kombinationen durchprobiert:

Windows: Defaultdraw = true, alles wird gezeichnet, auch jede zweite Zeile farbig.
Windows: Defaultdraw = false, die Liste bleibt leer, nichts wird gezeichnet.
Windows: Ownerdraw = false, alles wird gezeichnet, auch jede zweite Zeile farbig.
Windows: Ownerdraw = true, die Liste bleibt leer, nichts wird gezeichnet.

Linux: Defaultdraw = true, alles wird gezeichnet, aber jede zweite Zeile farbig zu setzen funktioniert nicht.
Linux: Defaultdraw = false, alles wird gezeichnet, aber jede zweite Zeile farbig zu setzen funktioniert nicht.
Linux: Ownerdraw = false, alles wird gezeichnet, aber jede zweite Zeile farbig zu setzen funktioniert nicht.
Linux: Ownerdraw = true, der Text wird nicht gezeichnet, die aktive Zeile aber farblich hinterlegt, jede zweite Zeile farbig zu setzen funktioniert auch hier nicht.

Das heißt dann wohl, wenn ich das Ganze unter Linux realisieren möchte, muss ich alles selbst zeichnen.

Danke für eure Tipps, Gruß Roland

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von fliegermichl »

Unter anderem das war ein Grund, daß ich es mit MSEGUI probiert hatte. Da sieht das Programm auf jedem System exakt gleich aus und verhält sich auch gleich. Durch die fehlende Dokumentation und den Tod von Martin bin ich aber auch wieder zu Lazarus zurück.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von mschnell »

fliegermichl hat geschrieben: Da sieht das Programm auf jedem System exakt gleich aus und verhält sich auch gleich.

Genau das sollten bei Lazarus die Widget Types "CustomDrawn" und "FPGUI" machen.
-Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von wp_xyz »

fliegermichl hat geschrieben:Da sieht das Programm auf jedem System exakt gleich aus und verhält sich auch gleich.

Klar, da hat man mühsam ein Programm geschrieben, und die Eigenwilligkeiten der Betriebssystem-Themes machen das schönste Layout zunichte!

Der Wunsch, das Programm überall gleich aussehen zu lassen, ist in Ordnung für ein Programm, das nur man selbst verwendet. Aber allgemein vom Standpunkt des Benutzers aus empfinde ich das als Bevormundung. Woher weiß der Programmierer, dass ich seine Vorliebe für rote Schrift auf grünem Untergrund teile? Weniger sarkastisch: Ich hatte einen Virenscanner, bei dem sich die Benutzeroberfläche in der heute üblich großen Schrift präsentiert hat - so schlecht sehe ich doch noch nicht, und noch dazu ließ sich das Fenster in der Größe nicht verändern, so dass längere Texte ständig mit '...' abgekürzt werden mussten.

Wenn der Benutzer nicht mit dem Aussehen der Programme zufrieden ist, kann er heutzutage zwischen einer Vielzahl von Themes auswählen - gerade unter Linux kann man sich da in der Einstellungsvielfalt verlieren. Das betrifft dann aber alle Programme (die sich daran halten), und das eigene Programm reiht sich vom Aussehen her nahtlos in die Reihe der anderen Programme ein. So wie es der User wünscht und vielleicht selbst konfiguriert hat. Lazarus folgt diesem Ansatz, indem es durch die Widgetsets das Betriebssystem die Detailarbeit machen lässt, so dass sich die Lazarus-Programme in ihre Umgebung integrieren. Als Folge sehen sie natürlich je nach Betriebssystem unterschiedlich aus.

Wie von mschnell schon erwähnt, gibt es das CustomDrawn bzw.fpgui Widgetset, mit denen man plattformunabhängig dasselbe Aussehen erreichen kann. Leider werden diese z.Zt von niemandem weiterentwickelt.

relocate
Beiträge: 61
Registriert: Di 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
CPU-Target: 32Bit

Re: In TListView jede zweite Zeile farbig setzen.

Beitrag von relocate »

wp_xyz hat geschrieben:
fliegermichl hat geschrieben:Da sieht das Programm auf jedem System exakt gleich aus und verhält sich auch gleich.

Klar, da hat man mühsam ein Programm geschrieben, und die Eigenwilligkeiten der Betriebssystem-Themes machen das schönste Layout zunichte!

Der Wunsch, das Programm überall gleich aussehen zu lassen, ist in Ordnung für ein Programm, das nur man selbst verwendet. Aber allgemein vom Standpunkt des Benutzers aus empfinde ich das als Bevormundung. Woher weiß der Programmierer, dass ich seine Vorliebe für rote Schrift auf grünem Untergrund teile? Weniger sarkastisch: Ich hatte einen Virenscanner, bei dem sich die Benutzeroberfläche in der heute üblich großen Schrift präsentiert hat - so schlecht sehe ich doch noch nicht, und noch dazu ließ sich das Fenster in der Größe nicht verändern, so dass längere Texte ständig mit '...' abgekürzt werden mussten.


Da muss man ein wenig differenzieren. Wenn ein Button gezeichnet wird, dann würde ich sagen, ja, der soll erst einmal entsprechend des Systems aussehen (und wenn nicht, mach' es selbst). Was hier aber erreicht werden soll ist das einfärben von Zeilen in Tabellen, was allgemein gemacht wird, damit man die Werte einer Zeile in der Tabelle besser überblicken kann. Da sollte ein gleichartiges Verhalten vorausgesetzt werden können. In gewisserweise könnte man auch den Programmanwender das einstellen lassen, aber dann hätte der Programmierer dasselbe Problem, unter Windows geht es unter Linux nicht.

wp_xyz hat geschrieben:Wenn der Benutzer nicht mit dem Aussehen der Programme zufrieden ist, kann er heutzutage zwischen einer Vielzahl von Themes auswählen - gerade unter Linux kann man sich da in der Einstellungsvielfalt verlieren. Das betrifft dann aber alle Programme (die sich daran halten), und das eigene Programm reiht sich vom Aussehen her nahtlos in die Reihe der anderen Programme ein. So wie es der User wünscht und vielleicht selbst konfiguriert hat. Lazarus folgt diesem Ansatz, indem es durch die Widgetsets das Betriebssystem die Detailarbeit machen lässt, so dass sich die Lazarus-Programme in ihre Umgebung integrieren. Als Folge sehen sie natürlich je nach Betriebssystem unterschiedlich aus.


Wie gesagt, für das allgemeine Erscheinungsbild ist das auch gut so.

wp_xyz hat geschrieben:Wie von mschnell schon erwähnt, gibt es das CustomDrawn bzw.fpgui Widgetset, mit denen man plattformunabhängig dasselbe Aussehen erreichen kann. Leider werden diese z.Zt von niemandem weiterentwickelt.


Das ist bei FPGui nicht ganz richtig (bislang) der letzte Commit war am 6. Juli 2019, aber intensiv wird dort glaube ich wirklich nicht gearbeitet. Die letzte Stable Version ist in der Tat schon länger her. Da ich auf FPGui setzen möchte (nicht damit alles überall gleich aussieht, sondern weil mir Lazarus zu überfrachtet ist) wäre es schön, wenn sich da mehr täte. Wenn ich mehr Zeit und auch Wissen darüber hätte, würde ich mich schon beteiligen.
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.

Aber das wäre langweilig.

Antworten