нехорошо ставить слип на основной поток :<
там вместо do ; должно было быть do Application.ProcessMessages;
альтернатива делаю, только будут обрабатываться ProcessMessages...
Код:
procedure Delay(ATimeout: Integer);
var
t: Cardinal;
begin
while ATimeout > 0 do
begin
t := GetTickCount;
if MsgWaitForMultipleObjects(0, nil^, False, ATimeOut, QS_ALLINPUT) = WAIT_TIMEOUT then
Exit;
Application.ProcessMessages;
dec(ATimeout, GetTickCount - t);
end;
end;