Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView-Eintrag wird bei Windows 7 schwarz (https://www.delphipraxis.net/152493-listview-eintrag-wird-bei-windows-7-schwarz.html)

Deep-Sea 5. Jul 2010 08:10

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 ...

ChrisE 5. Jul 2010 09:19

AW: ListView-Eintrag wird bei Windows 7 schwarz
 
Hallo,

versuch doch mal bitte folgendes:
Delphi-Quellcode:
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;
Funktioniert bei mir. Aber eben nur unter D2007 und Vista ohne Groups.

Greez, Chris

Deep-Sea 5. Jul 2010 09:50

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:

ChrisE 27. Sep 2011 10:45

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

CCRDude 27. Sep 2011 10:51

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 Embarcadero-Forum gefunden :)

Auch wenn der Schwarz-Effekt dort nicht explizit steht, mit SetBkMode plus Font-Anpassung waren bei mir beide Probleme verschwunden.

ChrisE 27. Sep 2011 14:25

AW: ListView-Eintrag wird bei Windows 7 schwarz
 
Hallo,

danke, das hat geklappt. :thumb:

Gruß, Chris

Deep-Sea 1. Nov 2011 11:14

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.

Helmi 28. Jun 2014 10:13

AW: ListView-Eintrag wird bei Windows 7 schwarz
 
Hallo,

ich habe bei einer Software das gleiche Problem.

Den Vorschlag mit
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsClear;
hab ich ausprobiert, nur leider ohne Erfolg.
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:
Sender.Canvas.Brush.Style := bsClear;
an der falschen Stelle drin oder generell einen
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 07:19 Uhr.
Seite 3 von 3     123   

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