AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListView.Color Bug?

Ein Thema von BigAl · begonnen am 19. Aug 2022 · letzter Beitrag vom 22. Aug 2022
Antwort Antwort
Seite 1 von 2  1 2      
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#1

TListView.Color Bug?

  Alt 19. Aug 2022, 10:54
Hallo zusammen,

ich habe ein TListView in einer Applikation welche zu Laufzeit den Skin ändern kann. Damit das Teil nicht flackert habe ich StyleElements.seClient deaktiviert und setze den Hintergund mit "ListView.Color := StyleServices.GetSystemColor(clWindow);" manuell. Funktioniert beim Öffnen des Formulars hervorragend.

Nun versuche ich auf den Wechsel des Skins zu reagieren:
Delphi-Quellcode:
procedure TscrDiagnostic.WMStyleChanged(var Msg: TMessage);
begin
  inherited;
  lvJobs.Color := StyleServices.GetSystemColor(clWindow);
end;
Leider hat das keinen Effekt. In der VCL habe ich folgendes gefunden:
Delphi-Quellcode:
procedure TCustomListView.SetTextBkColor(Value: TColor);
begin
  ListView_SetTextBkColor(Handle, ColorToRGB(Color));
  ListView_SetBkColor(Handle, ColorToRGB(Color));
end;
Sollte da nicht "Value" zugewiesen werden? Ist das ein Bug?

Oder warum interessiert es das TListView nicht wenn ich die Farbe neu zuweise?

Any idea?

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 11:08
WM_STYLECHANGED ist von Windows und hat nichts mit dem VCL-Styling zu tun. Versuch es mal mit CM_STYLECHANGED.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#3

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 11:17
WM_STYLECHANGED ist von Windows und hat nichts mit dem VCL-Styling zu tun. Versuch es mal mit CM_STYLECHANGED.
Oups. Ja, vertippt. Aber gehen tut es trotzdem nicht.

Die ListView nimmt die Farbe beim ersten mal (wenn das Formular erzeugt wird) an, dann immer irgendwie einmal verzögert. Beim Umschalten auf den System Style (Windows) geht es immer. Beim Umschalten auf einen anderen Style bleibt die Farbe des vorhergehenden Styles erhalten (Windows -> Style A = Windows, Style A -> Style B = Style A usw.). Invalidates, Repaint, Updates... Hilft alles nichts. Weird,...

Beim setzen der Farbe (ListView.Color := ...) stimmt die Farbe von der ListView noch. Später steht da wieder die alte Farbe (des vorherigen Styles) drin.
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 11:20
Kannst du ein Minimalbeispiel machen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#5

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 11:35
Kannst du ein Minimalbeispiel machen?
Habe ich gerade versucht. Da funktioniert es allerdings. Ich muss dazu sagen, dass es sich bei der Form um eine eingebettete Form handelt. Diese hat als Owner und als Parent die Hauptform. Vermutlich bügelt das Hauptformular später nochmal drüber. Muss ich mal verfolgen. Melde mich wieder...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#6

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 11:51
Ich habe die Zuweisung der Farbe jetzt im OnShow des Formulars. Da geht es.

Das CM_STYLECHANGED ist irgendwie zu früh. Müsste mal genau suchen wo die Farbe wieder zurück geändert wird. Das ist aber in den Tiefen der VCL nicht so trivial...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: TListView.Color Bug?

  Alt 19. Aug 2022, 12:03
Sollte da nicht "Value" zugewiesen werden? Ist das ein Bug?
Jein. Prinzipiell ist es zwar falsch, aber SetTextBkColor ist private und wird nur mit Color als Parameter aufgerufen. Daher wird es schwierig werden, dafür einen fehlschlagenden Test zu schreiben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#8

AW: TListView.Color Bug?

  Alt 20. Aug 2022, 13:15
Jupp, WM_STYLECHANGED gehört zu SetWindowLong für GWL_STYLE und GWL_EXSTYLE.

Was im Windows den Delphi-Styles ähnlich kommt, sind die Themes, also eher WM_THEMECHANGED, aber da VCL-Style eher was Eigenes ist, hilft es diesbezüglich nicht.
Diesbezüglich schaue man in die Winapi.UxTheme rein.

VCL-Style siehe Vcl.Themes und Vcl.Styles
dort mal nach Register und Notification umschauen (z.B. TStyleEngineNotification) und die "message" an Methoden dort,
oder eben da reinsehen, wo man den Style umschaltet, denn wenn/falls da was gemacht wird, dann findet man es da

Delphi-Quellcode:
procedure TStyleManager.SetStyle(Style: TCustomStyleServices);
...
begin
  ...
    for I := 0 to Screen.FormCount - 1 do
      if Screen.Forms[I].HandleAllocated then
        if IsWindowVisible(Screen.Forms[I].Handle) then
          PostMessage(Screen.Forms[I].Handle, CM_CUSTOMSTYLECHANGED, 0, 0)
        else
          SendMessage(Screen.Forms[I].Handle, CM_CUSTOMSTYLECHANGED, 0, 0);

Und natürlich kannst du auch die WndProc deiner Komponente und der Form überschreiben und schauen, welche Messages beim Ändern des Styles dort ankommen.

TApplicationEvents.OnMessage liefert nur PostMessage und PostThreadMessage. SendMessage wird direkt verarbeitet und nicht rausgegeben. (bissl blöd, denn siehe den Code da oben )
Dafür muß man die gewünschte Klasse hooken (z.B. indem man sich in WndProc reinhängt), oder einen globalen MessageHook registrieren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Aug 2022 um 13:25 Uhr)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#9

AW: TListView.Color Bug?

  Alt 20. Aug 2022, 14:39
Hallo himutsu,

danke für Deine ausführliche Antwort. Das hilft mir auf jeden Fall und ich werde da bei Gelegenheit nochmal forschen!

Mit den Styles hatte / habe ich noch Kämpfe an anderen Fronten. Z.B. sorge ich dafür, dass ActiveControl des Hauptformulars nil ist ehe ich den Style wechsle. Ansonsten gibt's manchmal Exceptions. Dann habe ich ein paar Styles die auch nicht so stabil sind wie andere (alle original Emba). Aber optisch finde ich sie halt schon recht cool...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#10

AW: TListView.Color Bug?

  Alt 20. Aug 2022, 19:17
Was bedeutet nicht so stabil? Abstürze oder Darstellungsfehler? Und die Exception wenn MainForm.ActiveControl nicht nil ist, hast du da Mal in QP nachgeschaut ob das schon erfasst ist? Falls nicht bitte erfassen und hier die Report Nummer melden, ich bin an dem Absturz auch interessiert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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