AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte VCL Flicker Reduce Unit
Thema durchsuchen
Ansicht
Themen-Optionen

VCL Flicker Reduce Unit

Ein Thema von jbg · begonnen am 1. Okt 2006 · letzter Beitrag vom 19. Okt 2010
Antwort Antwort
Seite 2 von 3     12 3      
jbg
Registriert seit: 12. Jun 2002
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
Angehängte Dateien
Dateityp: zip vclflickerreduce_147.zip (3,7 KB, 371x aufgerufen)
 
Benutzerbild von stahli
stahli

 
Delphi 11 Alexandria
 
#11
  Alt 6. Aug 2007, 18:33
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#12
  Alt 6. Aug 2007, 18:41
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
David F.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi 11 Alexandria
 
#13
  Alt 6. Aug 2007, 18:48
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
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#14
  Alt 6. Aug 2007, 21:13
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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#15
  Alt 6. Aug 2007, 21:32
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
David F.
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#16
  Alt 7. Aug 2007, 16:46
Ich habe es zwar jetzt nicht getestet, aber wenn du den gesamten Code von InvalidateSyncPaintControls() durch ein "Control.Invalidate;" ersetzt, könnte es funktionieren.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#17
  Alt 7. Aug 2007, 16:55
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

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#18
  Alt 7. Aug 2007, 17:21
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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#19
  Alt 7. Aug 2007, 17:48
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
David F.
  Mit Zitat antworten Zitat
Yheeky
 
#20
  Alt 7. Aug 2007, 18:10
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 21:01 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