2013-03-25 13 views
7

Sto usando Delphi XE3.
Quando creo un nuovo progetto VCL e inserisco uno TToolbar, tutto funziona correttamente, tranne quando si attiva Form1.DoubleBuffered.
Da quel momento in poi, il disegno della barra degli strumenti è rotto - in fase di progettazione, è nero, trasparente, o parti dell'IDE (barra di stato, barra degli strumenti, ecc.) Vengono copiati in esso. Cambia tra queste opzioni quando faccio clic su di esso e quando cambio codice sorgente (F12) e ritorno.
In fase di esecuzione, è sempre nero.TToolbar incompatibile con TForm.DoubleBuffered?

Con DrawingStyle=dsGradient, tutto funziona come previsto. Passando a dsNormal si interrompe nuovamente.

La disattivazione di Form1.DoubleBuffered la ripara.

Qualche suggerimento su come risolvere questo problema?

+2

Sede [ 'Quando non usare DoubleBuffered'] (http://chee-yang.blogspot.se/2010/02/when-not-to-use-doublebuffered.html). Ecco una soluzione per mettere il 'TToolBar' su un' TPanel'. –

+0

Grazie a LU RD: funziona perfettamente. Se pubblichi questa risposta come risposta, la contrassegnerò come risolta. – Pharaoh

+0

Oppure si potrebbe riempire il rettangolo client della barra degli strumenti nell'evento 'OnAdvancedCustomDraw' nella fase di disegno' cdPrePaint' (piuttosto un ['sporco workaround'] (http://pastebin.com/b9yXE5Su)). – TLama

risposta

4

A mio parere la soluzione è quella di impostare TForm.DoubleBuffered-False. L'utilizzo di un valore di True causa tutti i tipi di altri problemi. Questa proprietà funzionava abbastanza bene prima dei temi XP, ma dal loro arrivo, usando TForm.DoubleBuffered non è stato praticabile, a mio avviso.

Oltre ai problemi che avete incontrato, ho incontrato un sacco di difetti di verniciatura quando si utilizza il tema di Windows di base. So che non è mainstream, ma mi capita di vederlo molto con l'accesso remoto. E c'è di più. Quando si raddoppia il buffer di un modulo, si interrompe il funzionamento dell'animazione del tema. Ad esempio, un pulsante predefinito pulsa per indicare che si tratta del pulsante predefinito.

Se si ottiene ridimensionare lo sfarfallio, senza il doppio buffering la forma, utilizzare il ideas from my answer to another question. Dai commenti sembra che lo sfarfallio che desideri combattere sia in una scatola di colori. Ovviamente non conosco i dettagli, ma la mia esperienza e il mio istinto dicono che dovresti essere in grado di affrontare abbastanza facilmente questo sfarfallio a livello locale. Non ci dovrebbe essere sicuramente bisogno di un doppio buffering a livello globale.

+0

Grazie per i tuoi suggerimenti. Come ho postato per il tuo commento sulla mia domanda, per ora userò la soluzione 'TPanel' - ma terrò conto delle tue osservazioni e esaminerò sicuramente i problemi che hai menzionato; Probabilmente farò quello che hai detto. Grazie ancora. – Pharaoh

+0

Dissanguare la tua scatola di colori è molto semplice. Il doppio buffering del modulo è grossolanamente esagerato. Influenza così tanto altro. È una soluzione globale per un problema locale. Dovrebbe essere evitato. –

+0

Sì, non posso negare quello che dici. Non sapevo che 'TForm.DoubleBuffered' causasse molti problemi; Penso che andrò a disattivarlo ovunque io abbia usato fino ad ora. Quindi grazie ancora una volta;) – Pharaoh

4

Come riportato in questo articolo, When not to use DoubleBuffered, alcuni controlli come TToolBar e TRichEdit non funzionano bene con il DoubleBuffered proprietà impostata su true.

Il motivo si trova nella documentazione, TWinControl.DoubleBuffered, dove alcuni WinControls non possono disegnarsi su una bitmap temporanea (come accade quando DoubleBuffered è true).

Una soluzione alternativa può essere quella di inserire TToolBar su un TPanel.