Domanda

Per esempio ho bisogno di disattivare due pulsanti in runtime. Dopo che ho disabilitato primo pulsante è bacame grigia, la seconda - è diventato anche grigia. Ma io non so come fare la simultanea riverniciatura!

Ho bisogno di qualcosa di simile:

  1. congelare il Form (disable riverniciatura)
  2. disabilitare primo pulsante
  3. disattivare secondo pulsante
  4. Attiva Modulo di riverniciatura

Come implementare questo?

È stato utile?

Soluzione

Guarda il messaggio di API Win32 WM_SETREDRAW. Ad esempio:

SendMessage(Handle, WM_SETREDRAW, False, 0);
Button1.Enabled := False;
Button2.Enabled := False;
SendMessage(Handle, WM_SETREDRAW, True, 0);
InvalidateRect(Handle, nil, True);

Altri suggerimenti

I messaggi possono non essere trattati fino a quando l'applicazione rientra un ciclo di messaggi, in modo che qualsiasi tentativo di modificare lo stato di controllo / aggiornamento che si basa sulla elaborazione di messaggi non funziona all'interno di una singola sequenza di codice che non messaggi "pompa".

Per fortuna la VCL controlli in genere forniscono un mezzo per forza di riverniciatura senza attendere i messaggi da elaborare, tramite il metodo Update:

Button1.Enabled := False;
Button2.Enabled := False;
Button1.Update;
Button2.Update;

Questo funziona indipendentemente dover disattivare forma riverniciatura. Il modulo non ridipingere fino a quando l'applicazione va in un ciclo di messaggi in ogni caso, in modo invalidante pittura forma e riattivare all'interno di una procedura unica che non si provoca l'elaborazione dei messaggi è una perdita di tempo.

Questo potrebbe non essere esattamente riverniciatura simultanea dei due pulsanti, ma la pittura veramente simultanea di due controllo separato è impossibile senza entrare nel codice di pittura grafica multi-threaded che credo sia ben oltre la portata di questo problema. Chiamata Aggiornamento su due bottoni in questo modo sarà più vicino simultanea a tutti gli effetti di cui hai bisogno comunque.

Per Elias551:

LockWindowUpdate non è probabilmente il modo migliore per gestire questa situazione in quanto esso è destinato ad operazioni di drag and drop e può introdurre bug sottili quando abusato.

http://blogs.msdn.com /b/oldnewthing/archive/2007/02/22/1742084.aspx

Invece utilizzare SendMessage(hwnd, WM_SETREDRAW, FALSE, 0)

La decisione di cui sopra con WM_SETREDRAW non aggiorna finestre figlio.

Invece, vi consiglio RedrawWindow:

RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN);

Questo potrebbe aiutare: il LockWindowUpdate API (Maniglia: HWND). Blocca disegno per la maniglia e bambini

es:

procedure TForm1.ColorButtons();
begin
  LockWindowUpdate(Self.Handle);
  // Make some stuff
  LockWindowUpdate(0);
end;

Una volta che il manico bloccato viene azzerato, il componente viene ridipinto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top