Delphi-PRAXiS

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 Extremes flimmern (auch mit Doublebuffered) bei PageControls (https://www.delphipraxis.net/105364-extremes-flimmern-auch-mit-doublebuffered-bei-pagecontrols.html)

Deep-Sea 20. Dez 2007 14:25


Extremes flimmern (auch mit Doublebuffered) bei PageControls
 
Und gleich noch was hinterher :roll:

Seit ich D2006 benutze (davor nur D5-D7) flimmern PageControls mit dem Style tsTabs und XP-Style extrem beim wechseln zwischen den Tabs. Doublebuffered hilft hierbei nichts. Ich habe schon vor fast einem Jahr versucht, diesem Problem auf die Schliche zu kommen, schaffte es dann aber nicht, es zu reproduzieren. Nun tritt es bei einem anderen Projekt auf, das ich von D5 auf D2006 bringen wollte (aua). Wenn ich den Style auf tsFlatButtons stellt läuft alles wunderbar :shock:
Kennt jemand das Problem bzw. weiß, wie es zu lösen wäre? ...


(Langsam aber sicher treibt Borland mich in den Wahnsinn ... vlt. ist das eine Verschwörung?! :mrgreen:)

jbg 20. Dez 2007 17:29

Re: Extremes flimmern (auch mit Doublebuffered) bei PageCont
 
In der VCL wird einfach zu viel über einen Kamm geschert. Das TTabSheet besitzt keine eigenen WM_ERASEBKGND Message-Handler. Somit wird der von TWinControl aufgerufen, der über die Funktion DrawParentBackground zu erst mal ein FillRect(clBtnFace) durchführt und dieses dann mit dem TabBody-Theme übermalt. Dieses doppelte Malen kostet nicht nur Zeit sondern präsentiert sich dem Benutzer als Flackern.

Folgendes ist eine mögliche Implementierung, wie ich sie auch in meinen QualityCentral-Report eingetragen habe.
Delphi-Quellcode:
procedure TTabSheet.WMEraseBkgnd(var Message: TWMEraseBkgnd);
var
  R: TRect;
begin
  if (PageControl.Style = tsTabs) and ThemeServices.ThemesEnabled and
     (csParentBackground in ControlStyle) then
  begin
    GetWindowRect(Handle, R);
    OffsetRect(R, -R.Left, -R.Top);
    ThemeServices.DrawElement(Message.DC, ThemeServices.GetElementDetails(ttBody), R);
    Message.Result := 1;
  end
  else
    inherited;
end;

Deep-Sea 21. Dez 2007 08:34

Re: Extremes flimmern (auch mit Doublebuffered) bei PageCont
 
Uii, es hilft *freude*
Danke :thumb:

Und auf sowas muss man nun kommen :wall: Naja, hoffentlich behebt Borland das schnell, denn mit selbst geänderten Delphi-Sources ist das immer so 'ne Sache ^^ ...

RavenIV 29. Jan 2008 12:58

Re: Extremes flimmern (auch mit Doublebuffered) bei PageCont
 
Und wie bekomme ich Delphi dazu, die ComCtrls.dcu neu zu erstellen?

Habe die Änderung eingebaut, das Projekt neu erstellt.
Aber die ComCtrls.dcu hat immernoch das alte Datum.

Wenn ich die ComCtrls.dcu lösche (damit sie neu erstellt wird), dann meckert der Compiler, dass sie nicht vorhanden ist.

Bernhard Geyer 29. Jan 2008 12:59

Re: Extremes flimmern (auch mit Doublebuffered) bei PageCont
 
Zitat:

Zitat von RavenIV
Und wie bekomme ich Delphi dazu, die ComCtrls.dcu neu zu erstellen?

Habe die Änderung eingebaut, das Projekt neu erstellt.
Aber die ComCtrls.dcu hat immernoch das alte Datum.

Wenn ich die ComCtrls.dcu lösche (damit sie neu erstellt wird), dann meckert der Compiler, dass sie nicht vorhanden ist.

Kopier die neue ComCtrls.pas in dein Projektverzeichnis bzw. in ein eigenes Verzeichnis das du per Suchpfad aufnimmst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 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