![]() |
ListView-Eintrag wird bei Windows 7 schwarz
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöchen,
mich plagt seit einiger Zeit ein kleiner Grafikfehler mit der ListView unter Windows 7 - und das soll nun ein Ende haben :-D Erst einmal ein Bild, damit man sieht, was gemeint ist: Anhang 31513 Wie man sieht ist der zweite Eintrag schwarz, obwohl dort das gleiche drin steht wie in den anderen beiden. Ein Eintrag wird schwarz, wenn ich mit der Maus darüber fahre - aber auch nicht immer, keine Ahnung woran das liegt. Das passiert aber auch nur, wenn ich selbst etwas zeichne (in dem Beispiel einen Button). Hier mal der Quellcode:
Delphi-Quellcode:
Wie man sieht, nichts besonderes. Mehr ist in dem ganzen Beispielprogramm auch nicht enthalten. Der ViewStyle der ListView steht auf vsReport (wie man ja eig. sieht).
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); begin If Stage = cdPostPaint then With Sender as TListView do begin Button1.PaintTo(Canvas, Columns[0].Width, Item.DisplayRect(drBounds).Top); end; end; Es tritt nur unter Windows 7 auf (ggf. auch Vista, aber das kann ich nicht testen), unter XP aber nicht. Jemand eine Idee? :stupid: |
AW: ListView-Eintrag wird bei Windows 7 schwarz
*push*
Och kommt schon, ihr wollt mir doch net sagen, dass noch niemand mal selbst etwas in eine ListView gezeichnet hat?! :-D |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Kannst du mal das Beispielprojekt anhängen?
Und tritt es nur unter Windows 7 auf oder auch unter Vista? Greez, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Liste der Anhänge anzeigen (Anzahl: 1)
So, bitte sehr - da habt ihr das riesige Projekt :P
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Jepp, passiert unter Vista auch. Allerdings ist mir aufgefallen (ich habe 3 Testeinträge gemacht), dass dies nur passiert, wenn man "von oben", d.h. vom vorherigen Eintrag kommt. Zieht man durch bis zum letzten und geht dann wieder zurück, ist die Darstellung normal.
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Gut, dass es unter Vista ähnlich ist, war zu erwarten.
Das mit dem "von oben kommen" ist hier so, stimmt. Im eigentlich Programm um das es geht ist ein Eintrag immer schwarz, egal von wo ich komme. Allerdings nutzt dieses Programm auch Gruppen. Das Problem ist denke ich aber das gleiche ... |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
Außerdem scheint es nur der Texthintergrund zu sein. Der scheint schwarz zu werden. Ich hab mit Delphi 2007 getestet. Greez, Chris [Edit]Font.Color := clRed bei Listview1 und man sieht was ich meine[/Edit] |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Delphi-Quellcode:
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); begin If (Stage = cdPostPaint) then With Sender as TListView do begin Button1.PaintTo(Canvas, Columns[0].Width, Item.DisplayRect(drBounds).Top); Brush.Style := bsClear; end; end; |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Oh man, dass hatte ich doch auch probiert...
Sch... With-Anweisungen. Immer das selbe. Da sehe ich doch jedes mal den Kontext nicht mehr :-( Aber so geht es zumindest bei mir (Vista -> Delphi 2007) Greez, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Jap, TWinControl.Brush.Style := bsClear; löst das Problem (es reicht aber aus, wenn man es einmal aufruft, es muss nicht bei jedem Draw-Ereignis sein. Zumindest bei meinem kurzen Test eben, oder?)
Super, was für ein Schei* wieder mal ... Danke Bummi :-D Edit: Zu früh gefreut. Es geht nicht. Es ist eig. noch schlimmer. Wenn man Gruppen nutzt, geht ja nichts mehr (beim eig. Programm ist alles außer den Items schwarz, beim Test aktualisieren sich die Einträge nicht mehr beim scrollen, ...) |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Du musst schon dafür sorgen das dein Canvans mit deinen gewünschten Werten (Hintergrundfarbe, ...) belegt ist. Du weißt ja nicht für das er schon "mißbraucht" wurde. Bei Gruppierung wird ja die Gruppierungszeile auch mit dem Canvas gezeichnet so das dieser zwangsweise "verstellt" ist.
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
Edit: Selbst wenn ich immer - unabhängig von Stage - folgendes mache: Canvas.Brush.Color := clRed; tritt der Fehler weiterhin genau so in Erscheinung. |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Wobei dein Beispiel-Projekt so ja funktioniert, oder?
Delphi-Quellcode:
Greez, Chris
var
lv: TListView; begin If (Stage = cdPostPaint) and (Sender is TListView) then begin lv := Sender as TListView; Button1.PaintTo(lv.Canvas, lv.Columns[0].Width, Item.DisplayRect(drBounds).Top); lv.Brush.Style := bsClear; end; end; |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Ich nutze ListView nie, aber wenn Du auf den Hoovereffekt verzichten kannst, oder mehr zu Fuß machen willst könntest auch OwnerDraw auf true setzen?
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
Ein Tipp wäre noch, dass ganze nicht in OnAdvancedCustomDrawItem sondern in OnAdvancedCustomDrawSubItem aus zu probieren und es nur zu machen wenn SubItem = 1 ist. Greez, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
Zitat:
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
mit Deinem ursprünglichen Code und Ownerdraw=true sieht es bai mir aber halbwegs brauchbar aus, auch ohne zusätzlicuen Code. Muß los LG Bummi |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Zitat:
|
AW: ListView-Eintrag wird bei Windows 7 schwarz
So, noch mal ein kleiner push ...
Vielleicht hat ja heute jemand einen Geistesblitz?! :-D Denn der Fehler ist doof und alles selber Zeichnen ist auch net schön ... |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
versuch doch mal bitte folgendes:
Delphi-Quellcode:
Funktioniert bei mir. Aber eben nur unter D2007 und Vista ohne Groups.
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); var lv: TListView; ACanvas: TCanvas; begin if (Sender is TListView) and (Stage = cdPostPaint) then begin lv := Sender as TListView; ACanvas := TCanvas.Create; ACanvas.Handle := GetWindowDC(Item.Handle); try Button1.PaintTo(ACanvas, lv.Columns[0].Width, Item.DisplayRect(drBounds).Top); finally ReleaseDC(Item.Handle, ACanvas.Handle); ACanvas.Free; end; end; end; Greez, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Wenn man einen TControlCanvas nimmt klappt es wunderbar (sonst gibt es Grafikfehler etc.). DoubleBuffered kann man dann zwar nicht mehr benutzen aber das ist erst mal egal.
Danke :thumb: |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
ich hole diesen Thread nochmal hoch. Ich habe ganz konkret dieses Problem (also von diesem Thread) und brauch aber DoubleBuffered. Das Problem ist: Reagiert man auf OnAdvancedDrawItem und OnAdvancedDrawSubItem (OwnerDraw = FALSE) um quasi noch etwas zu ergänzen, dann bekommt man diesen Schwarz-Effekt, sobald man auf die Canvas von Listview zeichnet. Zeichnet man auf eine ACanvas deren Handle man per GetWindowDC holt, wird die Zeichenaktion nicht / selten sichtbar.:shock: Es muss irgendetwas mit dem DoubleBuffered-Mechanismus zu tun haben - aber da steig ich irgendwie nicht durch :-( Kennt jemand eine Lösung? Gruß, Chris P.S.: System Win 7 / Applikation mit Themes |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Wenn ich jetzt sage, daß ich das Problem auch schon hatte, aber irgendwie gelöst habe, ohne mich daran erinnern zu können, hilft das auch nicht weiter, oder? :shock:
Also habe ich nochmal gesucht und den von mir gefundenen Workaround im ![]() Auch wenn der Schwarz-Effekt dort nicht explizit steht, mit SetBkMode plus Font-Anpassung waren bei mir beide Probleme verschwunden. |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
danke, das hat geklappt. :thumb: Gruß, Chris |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Nebenbei gibt es von mir auch mal was neues.
Ich habe bei mir das Problem erneut aufgegriffen, um ebenfalls DoubleBuffered wieder nutzen zu können. Irgendwie erscheint mir die Lösung extrem banal. In den ganzen Posts haben wir nur versucht, den Brush-Style der ListView selbst zu ändern, aber nicht den von ihrem Canvas.
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsClear;
Dieser kleine Code - vor allen anderen Zeichenaktionen ausgeführt - hat mein Problem behoben :thumb: DoubleBuffered ist ebenfalls wie gewohnt nutzbar. |
AW: ListView-Eintrag wird bei Windows 7 schwarz
Hallo,
ich habe bei einer Software das gleiche Problem. Den Vorschlag mit
Delphi-Quellcode:
hab ich ausprobiert, nur leider ohne Erfolg.
Sender.Canvas.Brush.Style := bsClear;
Das dumme ist, dass das Problem auf meinem Win8-Rechner nicht mehr auftaucht - nur auf meinem (neuen) Win7-Rechner in der Firma (und kann es somit nicht testen) Hab ich das
Delphi-Quellcode:
an der falschen Stelle drin oder generell einen
Sender.Canvas.Brush.Style := bsClear;
Fehler diesbezüglich? Bei XP hat es bislang ohne dieser Zeile funktioniert (danach anscheinend auch wieder)
Delphi-Quellcode:
procedure TMainForm.ListView_DateienCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); var S_Text : String; Diff_Top : Integer; Rect : TRect; Textfarbe : TColor; begin //Rect der Zelle erhalten ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @Rect); Sender.Canvas.Brush.Style := bsClear; //Hintergrundfarbe Sender.Canvas.Brush.Color := clWindow; //Farbe? If ListViewTextFarbe(Textfarbe, S_Text, Item.SubItems[SubItem - 1]) then begin //Schriftfarbe Sender.Canvas.Font.Color := Textfarbe; //Hintergrundfarbe und Textfarbe setzen, wenn die Zeile markiert ist If Item.Selected then begin Sender.Canvas.Font.Color := clHighlightText; Sender.Canvas.Brush.Color := clHighlight; end; //Differenz für Top berechnen, um Text mittig darzustellen Diff_Top := (Rect.Height - Sender.Canvas.TextHeight(S_Text)) div 2; //Text ausgeben Sender.Canvas.TextRect(Rect, Rect.Left + 5, Rect.Top + Diff_Top, S_Text); DefaultDraw := False; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz