2009-09-21 22 views

risposta

13
procedure TForm1.WMEnterSizeMove(var Message:TWMMove); 
begin 
    Self.DisableAlign; 
end; 

procedure TForm1.WMExitSizeMove(var Message:TWMMove); 
begin 
    Self.EnableAlign; 
end; 
+0

Va bene per prevenire lo sfarfallio, ma sembra anche impedire completamente l'allineamento. Ho aggiunto una chiamata Invalidate dopo aver abilitato l'allineamento: non perfetta, perché non puoi vedere esattamente quale effetto avrà il ridimensionamento del modulo, ma almeno eliminerà tutto lo sfarfallio su un modulo multi-pannello complesso. – frogb

+0

procedura WMEnterSizeMove (var Message: TWMMove); messaggio WM_ENTERSIZEMOVE; procedura WMExitSizeMove (var Messaggio: TWMMove); messaggio WM_EXITSIZEMOVE; non attiva gli eventi aproporiate. In realtà ho dimenticato di dire che è una cornice e non una forma, ma ho indovinato che sarebbe stato lo stesso. – zz1433

4

Provare a utilizzare WM_SETREDRAW (not LockWindowUpdate).

Si potrebbe anche dare un'occhiata a DeferWindowPos.

+1

+1, entrambi ottimi consigli in sé. Questi probabilmente non saranno di aiuto con un modulo VCL complesso che usa allineamento, controlli annidati e così via, comunque. 'DeferWindowPos()' vale la pena provare per il posizionamento manuale nel gestore 'OnResize'. – mghie

4

I moduli complessi sono spesso costituiti da pannelli nidificati e il processo di ridisegno può causare sfarfallio. Se questo è il caso con il vostro progetto ci sono due semplici soluzioni che potrebbero aiuto:

  1. disattivare la proprietà FullRepaint sui pannelli.
  2. Abilitare la proprietà DoubleBuffered sul modulo. Non troverai questa proprietà sull'ispettore dell'oggetto, quindi inserisci DoubleBuffered := true; in FormCreate.
+1

Si noti che 'DoubleBuffered' scambia meno sfarfallio per una più lenta velocità di aggiornamento, un effetto che può essere percepibile su schermi di grandi dimensioni, dove il ridimensionamento può diventare" saltuario "con dimensioni di finestra più grandi. – mghie

+1

DoubleBuffered rende praticamente inutilizzabile l'app su Citrix e Terminal Server. –

+1

>>> "DoubleBuffered rende praticamente inutilizzabile la tua app su Citrix e Terminal Server" Puoi specificare perché? – Alex

1

ho avuto intorno a questo come segue:

  1. In caso 'OnResize' della forma, avere una routine per nascondere tutti i controlli figlio e quindi avviare un timer con un segno di spunta di circa 500ms .
  2. Quando il timer scocca, disattivarlo e quindi impostare tutti i controlli figlio su visibili.

Giocando con questa attività si ottiene un modulo che diventa vuoto mentre lo si dimensiona, ma poi si popola ordinatamente quando si "lascia andare".

Bri

+1

Penso che troveresti che gestire i messaggi di spostamento delle dimensioni di entrata/uscita (con la modifica annotata nel mio commento sopra) produce un'esperienza utente migliore perché puoi almeno vedere il modulo (non adattato) mentre ridimensiona la finestra. – frogb

0

evito sfarfallio allineando non più di 1 non alClient componente per ogni genitore, sempre in coppia con alClient (ad esempio a TPanel) per contenere tutti gli altri componenti. Raggruppali in pannelli senza bordi.

Dire di voler assegnare tre cose: alLeft, alTop e alClient per la vista principale. Non fare questo: Form alTop alLeft alClient // your main view

Ma invece incorporare questi come segue: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view

Stessa storia per l'incorporamento diversi alTop elementi.

Problemi correlati