2013-03-25 12 views
7

Ich verwende Delphi XE3.
Wenn ich ein neues VCL-Projekt erstellen und eine TToolbar darauf ablegen, funktioniert alles gut - außer, wenn ich Form1.DoubleBuffered aktivieren.
Von diesem Moment an ist das Zeichnen der Werkzeugleiste abgebrochen, es ist entweder schwarz, transparent oder Teile der IDE (Statusleiste, Werkzeugleiste, etc.) werden in sie kopiert. Es wechselt zwischen diesen Optionen, wenn ich darauf klicke und wenn ich zum Quellcode (F12) und zurück wechsele.
In Laufzeit ist es immer schwarz.TToolbar inkompatibel mit TForm.DoubleBuffered?

Mit DrawingStyle=dsGradient funktioniert alles wie erwartet. Zurückschalten auf dsNormal bricht es wieder.

Deaktivieren Form1.DoubleBuffered repariert es.

Gibt es Hinweise, wie Sie dieses Problem umgehen können?

+2

Siehe ['Wann nicht DoubleBuffered' zu verwenden ist] (http://chee-yang.blogspot.se/2010/02/when-not-to-use-doublebuffered.html). Umgehung hier ist, die 'TToolBar' auf ein' TPanel' zu setzen. –

+0

Danke LU RD - funktioniert perfekt. Wenn du dies als Antwort postest, werde ich es als gelöst markieren. – Pharaoh

+0

Oder füllen Sie das Client-Rechteck der Werkzeugleiste im 'OnAdvancedCustomDraw' -Ereignis auf der' cdPrePaint'-Zeichenstufe (ein ziemlich "schmutziger Workaround") (http://pastebin.com/b9yXE5Su)). – TLama

Antwort

4

Meiner Meinung nach ist die Lösung TForm.DoubleBuffered zu False zu setzen. Die Verwendung eines Werts von True verursacht alle möglichen anderen Probleme. Diese Eigenschaft funktionierte ziemlich gut vor XP Themen, aber seit ihrer Ankunft, TForm.DoubleBuffered war meiner Meinung nach nicht lebensfähig.

Zusätzlich zu den Problemen, mit denen Sie konfrontiert wurden, habe ich bei der Verwendung des Windows Basic Theme viele Malfehler festgestellt. Ich weiß, dass das kein Mainstream ist, aber ich sehe das oft mit Fernzugriff. Und da ist noch mehr. Wenn Sie ein Formular doppelt puffern, verhindern Sie, dass die Motivanimation funktioniert. Zum Beispiel blinkt eine Standardschaltfläche, um anzuzeigen, dass es sich um die Standardschaltfläche handelt.

Wenn Sie das Flackern der Größe verwenden, ohne das Formular doppelt zu puffern, verwenden Sie ideas from my answer to another question. Aus den Kommentaren scheint es, dass das Flackern, das Sie bekämpfen möchten, in einem Malkasten ist. Ich kenne die Details natürlich nicht, aber meine Erfahrung und mein Instinkt sagen, dass man mit dem Flimmern auf lokaler Ebene recht gut umgehen kann. Es sollte sicherlich nicht notwendig sein, die globale Form doppelt zu puffern.

+0

Vielen Dank für Ihre Hinweise. Als ich auf Ihren Kommentar zu meiner Frage gepostet habe, werde ich vorläufig die 'TPanel'-Lösung verwenden - aber ich werde Ihre Bemerkungen im Hinterkopf behalten und werde auf jeden Fall die von Ihnen erwähnten Probleme untersuchen; Wahrscheinlich werde ich tun, was du gesagt hast. Danke noch einmal. – Pharaoh

+0

Entflimmern Sie Ihren Farbkasten ist sehr einfach. Doppelte Pufferung der Form ist grob übertrieben. Es beeinflusst so viel anderes. Es ist eine globale Lösung für ein lokales Problem. Es sollte vermieden werden. –

+0

Ja, ich kann nicht negieren, was du sagst. Ich wusste nicht, dass 'TForm.DoubleBuffered' so viele Probleme verursacht; Ich denke, ich werde es deaktivieren und deaktivieren, wo immer ich es bisher benutzt habe. Also noch einmal danke;) – Pharaoh

4

Wie in diesem Artikel berichtet, When not to use DoubleBuffered, einige Steuerelemente wie TToolBar und TRichEdit funktionieren nicht gut mit der DoubleBuffered Eigenschaft auf true gesetzt.

Der Grund dafür findet sich in der Dokumentation, TWinControl.DoubleBuffered, wo einige WinControls sich nicht auf eine temporäre Bitmap zeichnen können (wie es passiert, wenn DoubleBuffered ist wahr).

Eine Abhilfe kann sein, die TToolBar auf eine TPanel setzen.

Verwandte Themen