Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   VCL Flicker Reduce Unit (https://www.delphipraxis.net/78231-vcl-flicker-reduce-unit.html)

jbg 1. Okt 2006 13:04


VCL Flicker Reduce Unit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wer schon mal auf ein TabSheet, dass Anchors oder Align=alClient hat, Controls gelegt hat, wird sicherlich nicht so begeistert von dem Geflacker sein, dass beim Vergrößern/Verkleinern des Formulars dabei ensteht. Da dieses Geflacker teilweise zu einer immensen Verlangsamung des Resize-Vorgangs kommt und auch nicht gerade schön anzusehen ist, bin ich auf Ursachenforschung gegangen. Und dabei musste ich festetellen, dass Borland beim WM_ERASEBKGND für alle TWinControls den kompletten Inhalt übermalt, also auch den von Child-Controls, die csOpaque im ControlStyle haben.

Damit dieses Geflackere aufhört habe ich nun eine kleine Unit geschrieben, die durch ihre bloses Aufnahme in ein Projekt, das Flackern stark reduziert.

Hier mal ein Screen-Recording (1.3MB), dass den Unterschied zeigt.


Zitat:

History:
2006-11-21:
- fixed region bugs
- fixed wrong DefaultHandler call
- fixed parent background painting
- added region exclusion for sub-controls of transparent control children
2006-10-03:
- fixed RangeChecks disabled

toms 1. Okt 2006 14:37

Re: VCL Flicker Reduce Unit
 
Hallo jbg,

Habe deine Unit kurz in einem aktuellen Projekt ausprobiert.

Folgende Probleme sind aufgetreten:

Der VirtualStringTree wird z.T nicht mehr richtig gezeichnet. (nur schwarzer Hintergrund)
Der EmbeddedWB wird dauern Range Check Errors hervor.

Ansonsten sieht's aber vielbersprechend aus!

jbg 1. Okt 2006 14:46

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von toms
Der VirtualStringTree wird z.T nicht mehr richtig gezeichnet. (nur schwarzer Hintergrund)

Kann ich nicht reproduzieren. Vor allem ändert sich für den VT eigentlich gar nichts (solange er keine Child-Controls hat).

Zitat:

Der EmbeddedWB wird dauern Range Check Errors hervor.
Der wirft noch ganz andere Sachen. Was ich mich mit dem IE schon beruflich geärgert habe. Und der IE 7 lässt noch schlimmeres erwarten.

jbg 1. Okt 2006 15:09

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von toms
Der EmbeddedWB wird dauern Range Check Errors hervor.

Auch das kann ich nicht nachvollziehen.

VT 4.4.3
EWB 14.57

jbg 3. Okt 2006 19:19

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von toms
Folgende Probleme sind aufgetreten:

Der VirtualStringTree wird z.T nicht mehr richtig gezeichnet. (nur schwarzer Hintergrund)
Der EmbeddedWB wird dauern Range Check Errors hervor.

Das kommt, wenn der Ersteller der Unit (ich) mit den Vorgabewerten für die Breichsüberprüfung und Überlaufprüfung arbeitet, aber die Benutzer dies nicht machen.

Ich habe jetzt zum einen die Übergabe von Cardinals an Integer Parameter mit einem Typecast behoben und zum anderen für die Unit die Bereichs- und Überlaufprüfung abgeschaltet. Einfach nochmal herunterladen (ggf. Browsercache leeren).

jbg 21. Nov 2006 20:31

Re: VCL Flicker Reduce Unit
 
Es gibt eine neue, überarbeitete Version der VCLFlickerReduce Unit.

Zitat:

Änderungen:
2006-11-21:
- fixed region bugs
- fixed wrong DefaultHandler call
- fixed parent background painting
- added region exclusion for sub-controls of transparent control children
2006-10-03:
- fixed RangeChecks disabled

Ich gebe keine Garantie, dass die Unit zu 100% funktioniert, da es immer einen Fall geben kann in dem eine abgeleitete Klasse mit WM_ERASEBKGND herumtrickst.

xaromz 21. Nov 2006 21:19

Re: VCL Flicker Reduce Unit
 
Hallo,

mal eine Frage: tritt das Flackern unter Vista immer noch auf? Da wird schließlich jedes Fenster erst mal in ein Offscreen-Bitmap gemalt. Die Performance sollte dadurch aber nicht unbedingt besser werden...

Gruß
xaromz

jbg 21. Nov 2006 22:14

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von xaromz
Mal eine Frage: tritt das Flackern unter Vista immer noch auf?

Das kann ich im Moment nicht testen, da mir letztes Wochenende die Graka abgeraucht ist und ich noch nicht dazu gekommen bin, mir eine gescheite neue zu kaufen. Und mit der, die ich im Augenblick drinnen habe, kann ich gerade mal Spiele anno 1999 spielen. Also vollkommen ungeeignet für Vista (da sieht nun alles dunkelgrau aus. So müssen sich wohl dann die Illegal-Vista-Kopierer fühlen).

Die Unit verringert das flackern hauptsächlich dadurch, dass nicht mehrmals auf der selben Stelle mit unterschiedlichen Farbwerten/Hintergrund-Themes gemalt wird. Das beschleunigt das ganze natürlich ein Stück, was Vista auch zugute kommen sollte.

Gandalfus 22. Nov 2006 11:33

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von xaromz
Hallo,

mal eine Frage: tritt das Flackern unter Vista immer noch auf? Da wird schließlich jedes Fenster erst mal in ein Offscreen-Bitmap gemalt. Die Performance sollte dadurch aber nicht unbedingt besser werden...

Gruß
xaromz

Ich würde sagen, dass dadurch die Performance sogar besser wird.

Dash 4. Jan 2007 19:10

Re: VCL Flicker Reduce Unit
 
Also bei mir macht die Unit auch einige Probleme. In meiner ListView werden einige Einträge einfach schwarz wenn ich das Fenster maximiere! Ansonsten habe ich eigentlich nichts auszusetzen, klasse Unit :thumb:

stahli 6. Aug 2007 18:33

Re: VCL Flicker Reduce Unit
 
Hallo jbg,

großes Lob und vielen Dank von mir :-)

Wenn das wirklich an Borland liegt, solltest Du vielleicht einmal in Fragen und Anregungen etwas zu dem Problem schreiben...

Deine Unit funktioniert bei mir bis dahin anscheinend erst einmal wunderbar.

Gruß
Stahli

mirage228 6. Aug 2007 18:41

Re: VCL Flicker Reduce Unit
 
Hi,

Habe die Unit auch mal ausprobiert.
Als allerstes muss ich sagen, dass die Unit wirklich toll ist :)
Einen "Fehler" habe ich allerdings. Ich habe mehrere Panels mit ParentBackground = True. Das führt aber zu einer Fehlerdarstellung. Der Hintergrund kann durch Fenster die ich darüberziehe übermalt werden (Sprich das Fenster ist dann im Hintergrund, wie wenn ein Programm nicht mehr reagiert und es nicht mehr richtig neugezeichnet wird).

Lässt sich das evtl. beheben?

mfG
mirage228

stahli 6. Aug 2007 18:48

Re: VCL Flicker Reduce Unit
 
noch ein Nachtrag:

Das Flackern trat bei meinem Programm nur unter XP auf - unter NT nicht.
Muss morgen mal sehen, wie die Unit-Auswirkungen unter NT sind...

Mit der Unit flackern bei mir noch die Einträge der RadioGroup (der Rahmen und die Beschriftung allerdings nicht mehr).

Stahli

jbg 6. Aug 2007 21:13

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von mirage228
Einen "Fehler" habe ich allerdings. Ich habe mehrere Panels mit ParentBackground = True. Das führt aber zu einer Fehlerdarstellung.

Das ist mir auch letztens aufgefallen. Jedoch habe ich im Moment keine Zeit diesen Fehler zu suchen und eine Möglichkeit zu finden, die das Flackern nicht wieder verstärkt. Ein einfaches "InvaldiateRect(handle, nil, True (statt False)) würde nämlich das Problem beheben. Jedoch kann man sich dann gleich vom Arzt ein Atest auf Augenkrebs verschreiben lassen.

mirage228 6. Aug 2007 21:32

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von jbg
Das ist mir auch letztens aufgefallen. Jedoch habe ich im Moment keine Zeit diesen Fehler zu suchen und eine Möglichkeit zu finden, die das Flackern nicht wieder verstärkt. Ein einfaches "InvaldiateRect(handle, nil, True (statt False)) würde nämlich das Problem beheben. Jedoch kann man sich dann gleich vom Arzt ein Atest auf Augenkrebs verschreiben lassen.

Also wenn es nur um Panels geht, könnte ich das Flackern wohl verschmerzen, weil ich in der Anwendung in der ich die Unit einsetzen will eh nicht viele Panels habe (aber halt zwei, drei kleine wo es auffält.).
Wo in Deiner Unit kann ich den InvalidateRect-Code einfügen oder muss der ganz woanders hin?

mfG
mirage228

jbg 7. Aug 2007 16:46

Re: VCL Flicker Reduce Unit
 
Ich habe es zwar jetzt nicht getestet, aber wenn du den gesamten Code von InvalidateSyncPaintControls() durch ein "Control.Invalidate;" ersetzt, könnte es funktionieren.

mirage228 7. Aug 2007 16:55

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von jbg
InvalidateSyncPaintControls()

Also entweder bin ich blöd oder es gibt diese Funktion einfach nirgends.
Habe in der Datei, die in Deinem ersten Beitrag angehängt ist und in allen VCL Source Units suchen lassen... kein Ergebnis zu einer solchen Funktion :gruebel:

mfG
mirage228

jbg 7. Aug 2007 17:21

Re: VCL Flicker Reduce Unit
 
Das liegt wohl daran, dass ich mich auf den "neuesten" Code beziehe. Vielleicht tritt dort auch nicht mehr der Fehler auf, den du hast, da ich die gesamte Unit neu geschrieben habe.

mirage228 7. Aug 2007 17:48

Re: VCL Flicker Reduce Unit
 
Zitat:

Zitat von jbg
Das liegt wohl daran, dass ich mich auf den "neuesten" Code beziehe. Vielleicht tritt dort auch nicht mehr der Fehler auf, den du hast, da ich die gesamte Unit neu geschrieben habe.

Achso, hm mit der aktuellen Unit aber habe ich wieder das Flickern das mit der Version hier aus der DP eigentlich behoben (TImage auf TTabSheet) war...

mfG
mirage228

Yheeky 7. Aug 2007 18:10

Re: VCL Flicker Reduce Unit
 
Hi,

also ich habe noch einen Fehler bei mir im Programm und zwar lasse ich die Form nach folgendem Prinzip zeichnen:
[UpdateLayeredWindow] Vergrößerbare Form realisieren

Wenn ich nun deine Komponente in mein Programm einbinde, dann ist es mir nicht möglich, nach dem Verändern der Formgröße, ein Memo zu fokussieren. Weisst du, woran das liegt?

Hier ist mein Post, welchen in vor ein paar Tagen erstellt hatte:
Komponenten werden bei Form.Resize langsam neu gezeichnet

stahli 26. Aug 2007 12:12

Re: VCL Flicker Reduce Unit
 
Hallo jbg,

ich hatte gerade festgestellt, dass mit Deiner alten Unit ein TImage direkt auf einem TabSheet nach dem Bild-Löschen das Bild sichtbar bleibt:
Image1.Picture:=nil;
Das Bild verschwand erst nach dem Minimieren oder Übderdecken meiner Form und anschließendem Neuzeichen der Form.

Deine neue Unit reduziert bei mir kein Fackern mehr (kein Effekt erkennbar).

Mein Problem mit dem Image konnte ich mit Deiner alten Unit klären, indem ich mein Image einfach auf ein Panel setze und dieses dann auf das TabSheet.

Stahli

xZise 3. Okt 2007 10:27

Re: VCL Flicker Reduce Unit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Cool Unit :) und effektiv xD
Allerdings habe ich zwei Bugs:
Und zwar wird das TreeView nicht immer komplett neugezeichnet (im Expand) und zum anderen zeichnest du den Hintergrund der Tableiste nicht durchsichtig sondern in cBtnFace ;)
Das sieht mit Tabs auf Tabs ziemlich schlecht aus :(

Ich habe im Anhang mal ein Screenshot von den beiden Fehlern.
Kommentiere ich die Zeile aus, funktioniert alles wunderbar!

MfG
xZise

jbg 3. Okt 2007 10:52

Re: VCL Flicker Reduce Unit
 
Dieses Projekt ist tot, da ich für jede Komponente auf der Welt eine Ausnahme programmieren müsste. Also mehr Ausnahmen als Regelfälle.

xZise 3. Okt 2007 11:30

Re: VCL Flicker Reduce Unit
 
Schade :(

Gebhard 19. Okt 2010 11:27

AW: VCL Flicker Reduce Unit
 
Hallo,

vielen Dank für Eure Antworten und Eure Hilfe.

Die Kompination aus der "VCLFlickerReduce" und "...FormResize... Invalidate;..."
haben mein Problem gelöst.

Danke und Tschüs

Gebhard


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