Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Смена картинки в TImage по событию

8.5K
27 марта 2009 года
FrostFX
121 / / 01.03.2007
Доброе время суток!
Пишу программу для платежного терминала :) Появился возможно суперламерский вопрос))

И так) задача в том, чтобы быстро сменить картинку в компоненте TImage по нажатию на нем. До чего-то более умного, чем это:
 
Код:
procedure TMainForm.PaymentButtonClick(Sender: TObject);
begin
PaymentButton.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'skins\winter\3.jpg'); // грузим "нажатую" картинку
sleep(500);// ждем, чтобы видно было как "нажата кнопка" ;)
PaymentButton.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'skins\winter\1.jpg');// грузим "обычную" картинку
//остальной код
end;


вот. но при нажатии еще где-то 1,5 секнды проходит при загрузке самой картинки из файла...
Я бы хотел узнать, есть ли способ держать эти картинки в памяти? или придецца создавать два обекта TImage и работать со свойствами .Visible xD
Зарание спасибо...
261
27 марта 2009 года
ahilles
1.5K / / 03.11.2005
Возможно есть какие-то другие способы. но лично мой совет: держать два объекта TImage при наступлении события одно скрывать, а другое показывать и не париться.
8.5K
27 марта 2009 года
FrostFX
121 / / 01.03.2007
Хорошо... спасибо... нарыл только хранение пикселов в массиве, но это для BitMap только... на них памяти не напасешься :)
261
28 марта 2009 года
ahilles
1.5K / / 03.11.2005
если нужна альтернатива: довольно-таки быстро должно получиться через DIB
8.5K
29 марта 2009 года
FrostFX
121 / / 01.03.2007
Спасибо, поковыряю DIB)) если честно, первый раз слышу :) так как опыта у меня в Windows-программировании мало...

На счет хранения в памяти нашел способ с ТРЕМЯ объектам TImage:
  • Первый для отображения
  • Второй хранит одну картинку
  • Третий хранит вторую картинку
Смена картинки просиходит следующим образом:
 
Код:
Imаge1.Picture := Imаge2.Picture;

может это и тупо, но на AMD 2500+/1,5 Gb RAM(DDR1)/ ОС Windows Vista грузится очень быстро, задержка минимальна и незаметна, да и запущенна прога сама в дебаггере, так что компиленый екзешнег будет бустрее работать(по крайней мере йа так думаю :) )

Столкнулся опять с проблемой...
В PaymentButton уже загруженна картинка PaymentButtonReleaseEvent.
код:

 
Код:
PaymentButton.Picture := PaymentButtonClickEvent.Picture;
sleep(5000);
PaymentButton.Picture := PaymentButtonReleaseEvent.Picture;

При выполнении этого ничего не происходит кроме задержки :(
Заккоментировав последнюю срочку, увидел что картинка меняется после задержки в пять секунд и меня это повергло в шок. Сделал трассировку:
  • Первая строчка - ничего не происходит
  • Вторая строчка - задержка
  • Третья строчка - закомментирована
  • Интерпретатор наткнулся на end; и о чудо! картинка сменилась!
Перезапуск/Ребилд/Перезагрузка/Переустановка Delphi/Переустановка системы :) ничего не дали ))
Вот сижу теперь ломаю голову над непоследовательностью такого привередлевого компилятора...
402
29 марта 2009 года
ToRNaDo
70 / / 27.01.2004
1. Попробуй использовать
 
Код:
PaymentButton.Picture.Assign(PaymentButtonClickEvent.Picture);

2. После обновления картинок выполняй процедуру
 
Код:
Application.ProcessMessages;
303
29 марта 2009 года
makbeth
1.0K / / 25.11.2004
FrostFX, картинки перерисовываются по событию WM_PAINT, поскольку ты меняешь картинки в одном методе - обработчике события, то контролы на форме не могут получить сообщения о перерисовке до тех пор, пока этот метод не завершиться. Поэтому, как уже и посоветовал ToRNaDo, после первой смены картинки сделай вызов Application.ProcessMessages. В этом случае все сообщения из очереди (в том числе и WM_PAINT) дойдут до получателей.
8.5K
29 марта 2009 года
FrostFX
121 / / 01.03.2007
ToRNaDo, спасибо за то, что показал как делать :)
makbeth, спасибо за то, что обьяснил как это работает :)

Это действительно работает точно так как нужно мне/заказчику :)
Так что всем спасибо :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог