Я написал эту маленькую процедурку, т.к. однажды столкнулся с багом то ли компилятора, то ли системы, когда при использовании Application.ProcessMessages возникала непредвиденная ошибка. Советую попробовать воспользоваться этим куском кода, т.к. он не только более "Апишный" (для его работы нужен только модуль windows), но и более быстрый (сравните его с кодом Application.ProcessMessages), да и к тому же позволяет кустомизировать действия при получении и обработке сообщений. В общем, всем на рассмотрение и в случае чего, на исправление
Wnd можно не указывать, если процедура вызывается той формой, для которой нужно очистить и обработать очередь сообщений.
Код:
procedure Delay(Wnd: HWND = 0);
var
Msg: TMsg;
begin
while True do
begin
if not PeekMessage(Msg,Wnd,0,0,PM_REMOVE) then Break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;