AGB  ·  Datenschutz  ·  Impressum  







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

ListView-Eintrag wird bei Windows 7 schwarz

Ein Thema von Deep-Sea · begonnen am 24. Jun 2010 · letzter Beitrag vom 28. Jun 2014
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#21

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 5. Jul 2010, 08:10
So, noch mal ein kleiner push ...
Vielleicht hat ja heute jemand einen Geistesblitz?!
Denn der Fehler ist doof und alles selber Zeichnen ist auch net schön ...
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#22

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 5. Jul 2010, 09:19
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#23

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 5. Jul 2010, 09:50
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
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 27. Sep 2011, 10:45
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.
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#25

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 27. Sep 2011, 10:51
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?

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.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#26

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 27. Sep 2011, 14:25
Hallo,

danke, das hat geklappt.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#27

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 1. Nov 2011, 11:14
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.
Sender.Canvas.Brush.Style := bsClear;
Dieser kleine Code - vor allen anderen Zeichenaktionen ausgeführt - hat mein Problem behoben DoubleBuffered ist ebenfalls wie gewohnt nutzbar.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#28

AW: ListView-Eintrag wird bei Windows 7 schwarz

  Alt 28. Jun 2014, 10:13
Hallo,

ich habe bei einer Software das gleiche Problem.

Den Vorschlag mit 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 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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 03:06 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