-
Здравствуйте!!! Не могу понять - почему не срабатывает комманда для отображения анимации?
есть таймер (работающий постоянно) и картинка (анимированная - gif) -
в теле программы при нажатии на кнопку Button5 анимация не отображается:
procedure TForm1.Button5Click(Sender: TObject);
..........................
Screen.Cursor:=crHourGlass; //работает
StatusBarPro1.Panels.Items[0].Text:='!!!!!!!!!!!!!'; //работает
Image1.Visible:=true; // не работает
.........................
//сдесь идет цикл работы с файлами ( может занимать до 15 сек) //работает
........................
Image1.Visible:=false; //работает
StatusBarPro1.Panels.Items[0].Text:='!!!!!!!!!222222222'; //работает
Screen.Cursor:=crDefault; //работает
А если я нажму отдельно кнопку - то работает:
procedure TForm1.Button10Click(Sender: TObject);
begin
image1.Visible:=true;
end;
Пробовал добавлять перед циклом sleep(5000); и button10.click; вместо image1.Visible:=true; и не чего не вышло!
Буду благодарен за помощь или подсказку. Заранее спасибо!
-
Пробовал добавлять перед циклом sleep(5000)
а перед слипом еще добавь Image1.Repaint или рефреш, или что там у него есть
-
если не поможет RePaint
Application.ProcessMessage или RePaint всей форме
-
ВладОшин © (10.09.17 09:19) [1]
Никогда ты не будешь майором.
Dima21 (10.09.17 08:50)
Не надо писать такой код. Картинка не успевает показаться, потому что приложение занято работой с файлами.
Можно принудительно обновить картинку, сказав ей Image1.Update и Application.ProcessMessages сразу после того, как изменяется ее видимость, но это костыли. Правильно делать длинную обработку в отдельных потоках, чтобы не подвисал интерфейс пользователя.
-
Огромное спасибо всем!!!! Буду пробовать.
-
> Игорь Шевченко © (10.09.17 10:54) [3]
> длинную обработку в отдельных потоках,
угу, автор уже это пошел делать, так и "видю"
майора мне не надо
или солдат или фельдмаршал )
-
Мне все таки подошел вариант с одним потоком - использовать Application.ProcessMessages. Этого мне достаточно. Всем еще раз - Огромное спасибо!!!
-
> Dima21 (11.09.17 14:42) [6]
>
> Мне все таки подошел вариант с одним потоком - использовать
> Application.ProcessMessages.
Имхо, как всегда идём по пути Черномырдина.
А вызвать Image1.Repaint сразу после
Image1.Visible:=true; // не работает
не работает?
Зачем бить из пушки по всем воробьям, если достаточно поразить только одного, коонкретного?