Слипом вы подвешиваете главный поток, поэтому кнопка остаётся нажатой. Почему не происходит прорисовка, я точно сказать не могу, но скорее всего связано с подвешенным главным потоком.
Чтобы ваш код заработал, можно, например, использовать "Application.ProcessMessages" (кнопка будет нажата):
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Visible := True;
Application.ProcessMessages;
Sleep(3000);
Panel1.Visible := False;
Application.ProcessMessages;
end;
Или воспользоваться потоками (кнопка будет в обычном состоянии):
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize(nil,
procedure
begin
Panel1.Visible := True;
end);
TThread.Sleep(3000);
TThread.Synchronize(nil,
procedure
begin
Panel1.Visible := False;
end);
end
).Start;
end;
Можно написать вот так (без синхронизации тоже работает, это у меня уже в привычку вошло, работу с визуальными компонентами в синхронизацию запихивать): Используйте вариант описанный выше.
Возможно, есть более лучшее решение...