2010-09-25 7 views
13

Ho un modulo con 50 o più controlli che creo e aggiungo in fase di esecuzione. Non voglio vedere poi apparire uno per uno; Preferisco disabilitare il disegno/avviare il buffering all'inizio & quindi vederli tutti visualizzati contemporaneamente.Come posso disabilitare l'aggiornamento dello schermo che aggiorna molti controlli?

Mi sembra di ricordare di fare qualcosa di simile in BCB circa 10 anni fa, ma dimentica come.

+3

È possibile posizionare tutti questi controlli su un TPanel e mostrarlo/nasconderlo. Ma sei sicuro di aver davvero bisogno di 50 controlli? Forse staresti meglio con un unico controllo personalizzato composto da 50 parti? Non ho idea di quale sia la tua situazione, ma nella mia esperienza, quando qualcuno aggiunge un numero enorme di controlli simili a un modulo, lui/lei dovrebbe davvero costruirsi un nuovo controllo con un numero enorme di parti simili! –

+0

Buon punto (+1), ma non sempre gli stessi controlli. Vengono creati dinamicamente da determinate scelte dell'utente, quindi li posiziona. C'è un'opzione Salva ed è il ridisegno su Carica che mi riguarda. – Mawg

risposta

36

Non sono sicuro se esiste un metodo specifico Delphi per farlo, ma utilizzando l'API Win32, ciò avviene tramite il messaggio WM_SETREDRAW.

Modifica: Grazie a Ken White e Sertac Akyuz per il seguente codice di esempio.

begin 
    // Defer updates 
    SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0); 
    try 
    // Create all your controls here 
    finally 
    // Make sure updates are re-enabled 
    SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0); 
    // Invalidate; // Might be required to reflect the changes 
    end; 
end; 
+9

+1, spero che la tua risposta abbia un sacco di upvotes abbastanza velocemente da impedire risposte con ['LockWindowUpdate'] (http://msdn.microsoft.com/en-us/library/dd145034%28VS.85%29.aspx). –

+2

solo per curiosità, perché? – Mawg

+5

LockWindowUpdate è stato progettato per interrompere il disegno per il trascinamento della selezione, va un po 'oltre WM_SETREDRAW perché potrebbe fare supposizioni su ciò che l'utente stava facendo. Un presupposto era che dal momento in cui si verificava un trascinamento, il movimento della finestra poteva essere disabilitato/ignorato. È ancora possibile trascinare una finestra intorno a WM_SETREDRAW impostata su false. –

9

Mantengo semplicemente Visible = False finché tutto è bello e pronto.

+0

+1 Questa è anche una possibilità (ci avevo pensato, volevo solo vedere se non c'era un altro modo) – Mawg

+5

@Mawg, per la creazione del componente di runtime sembra che mantenere Visible = False "si senta" meglio, mentre si usa WM_SETREDRAW " si sente "meglio per aggiornare un controllo già esistente e già visibile. –

+0

+1 grazie. Ho provato entrambi ed è 50/50 (ymmv) – Mawg

Problemi correlati