2013-03-25 7 views
7

Używam Delphi XE3.
Kiedy tworzę nowy projekt VCL i upuszczam na nim TToolbar, wszystko działa poprawnie - z wyjątkiem sytuacji, gdy aktywuję Form1.DoubleBuffered.
Od tego momentu rysowanie paska narzędzi jest przerywane - w wyznaczonym czasie jest albo czarne, przezroczyste, albo części IDE (pasek stanu, pasek narzędzi itp.) Są do niego kopiowane. Zmienia się pomiędzy tymi opcjami, gdy je klikam i kiedy zmieniam kod źródłowy (F12) iz powrotem.
W środowisku wykonawczym zawsze jest czarny.TToolbar niekompatybilny z TForm.DoubleBuffered?

Z DrawingStyle=dsGradient wszystko działa zgodnie z oczekiwaniami. Przełączenie z powrotem na dsNormal powoduje ponowne zerwanie.

Deaktywowanie Form1.DoubleBuffered naprawy.

Jakieś wskazówki, jak obejść ten problem?

+2

Zobacz ['Kiedy nie używać DoubleBuffered'] (http://chee-yang.blogspot.se/2010/02/when-not-to-use-doublebuffered.html). Obejście polega na umieszczeniu 'TToolBar' na' TPanel'. –

+0

Dziękuję LU RD - działa idealnie. Jeśli opublikujesz to jako odpowiedź, oznaczę to jako rozwiązane. – Pharaoh

+0

Możesz też wypełnić prostokąt klienta paska narzędzi w zdarzeniu 'OnAdvancedCustomDraw' na etapie rysowania' cdPrePaint' (ale raczej ['dirty workaround'] (http://pastebin.com/b9yXE5Su)). – TLama

Odpowiedz

4

Moim zdaniem rozwiązaniem jest ustawienie TForm.DoubleBuffered na False. Używanie wartości True powoduje różnego rodzaju inne problemy. Ta właściwość działała względnie dobrze przed motywami XP, ale od ich przybycia, używanie TForm.DoubleBuffered nie było opłacalne, moim zdaniem.

Oprócz problemów, z którymi się zetknąłeś, natknąłem się na wiele wad malowania podczas korzystania z motywu Windows Basic. Wiem, że to nie jest mainstream, ale zdarza mi się, że widzę to bardzo często przy pomocy zdalnego dostępu. I jest coś więcej. Po dwukrotnym buforowaniu formularza przestajesz działać animacja motywu. Na przykład, domyślny przycisk pulsuje, aby wskazać, że jest to przycisk domyślny.

Jeśli pojawi się migotanie rozmiaru bez podwójnego buforowania formularza, skorzystaj z ideas from my answer to another question. Z komentarzy wydaje się, że migotanie, które chcesz zwalczać, znajduje się w polu malowania. Oczywiście nie znam szczegółów, ale moje doświadczenie i instynkt mówią, że powinieneś być w stanie poradzić sobie z tym migotaniem na poziomie lokalnym. Z pewnością nie powinno być potrzeby globalnego podwójnego buforowania o formie.

+0

Dziękuję za wskazówki. Jak napisałem do twojego komentarza na moje pytanie, na razie użyję rozwiązania 'TPanel' - ale będę pamiętać o twoich uwagach i na pewno zajrzę się w twoje problemy; problebly zrobię to, co powiedziałeś. Dzięki jeszcze raz. – Pharaoh

+0

Migotanie pudła malarskiego jest bardzo łatwe. Podwójne buforowanie formularza jest bardzo wysokie. Wpływa na wiele innych rzeczy. To globalne rozwiązanie lokalnego problemu. Należy tego unikać. –

+0

Tak, nie mogę zanegować tego, co mówisz. Nie wiedziałem, że 'TForm.DoubleBuffered' powoduje tak wiele problemów; Myślę, że pójdę i dezaktywuję go wszędzie, gdzie go użyłem do tej pory. Jeszcze raz dziękuję;) – Pharaoh

4

Jak podano w tym artykule, When not to use DoubleBuffered niektóre kontrole i jak TToolBarTRichEdit nie działają dobrze z nieruchomości DoubleBuffered ustawiony na true.

Powód można znaleźć w dokumentacji, TWinControl.DoubleBuffered, gdzie niektóre sterowniki WinControl nie mogą rysować na tymczasowej mapie bitowej (jak to się dzieje, gdy DoubleBuffered jest prawdą).

Jednym z rozwiązań może być umieszczenie TToolBar na TPanel.

Powiązane problemy