Quando si ridimensiona un modulo con molti controlli, il modulo sembra danneggiato a causa dello sfarfallio. Quali sono alcuni suggerimenti per avere un ridimensionamento del modulo più fluido?Come posso ridimensionare il mio modulo in modo più fluido?
risposta
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
Provare a utilizzare WM_SETREDRAW (not LockWindowUpdate).
Si potrebbe anche dare un'occhiata a DeferWindowPos.
+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
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:
- disattivare la proprietà
FullRepaint
sui pannelli. - Abilitare la proprietà
DoubleBuffered
sul modulo. Non troverai questa proprietà sull'ispettore dell'oggetto, quindi inserisciDoubleBuffered := true;
in FormCreate.
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
DoubleBuffered rende praticamente inutilizzabile l'app su Citrix e Terminal Server. –
>>> "DoubleBuffered rende praticamente inutilizzabile la tua app su Citrix e Terminal Server" Puoi specificare perché? – Alex
ho avuto intorno a questo come segue:
- 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 .
- 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
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
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.
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
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