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;
Смена картинки в TImage по событию
Пишу программу для платежного терминала :) Появился возможно суперламерский вопрос))
И так) задача в том, чтобы быстро сменить картинку в компоненте TImage по нажатию на нем. До чего-то более умного, чем это:
Код:
вот. но при нажатии еще где-то 1,5 секнды проходит при загрузке самой картинки из файла...
Я бы хотел узнать, есть ли способ держать эти картинки в памяти? или придецца создавать два обекта TImage и работать со свойствами .Visible xD
Зарание спасибо...
Возможно есть какие-то другие способы. но лично мой совет: держать два объекта TImage при наступлении события одно скрывать, а другое показывать и не париться.
Хорошо... спасибо... нарыл только хранение пикселов в массиве, но это для BitMap только... на них памяти не напасешься :)
если нужна альтернатива: довольно-таки быстро должно получиться через DIB
На счет хранения в памяти нашел способ с ТРЕМЯ объектам 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;
sleep(5000);
PaymentButton.Picture := PaymentButtonReleaseEvent.Picture;
При выполнении этого ничего не происходит кроме задержки :(
Заккоментировав последнюю срочку, увидел что картинка меняется после задержки в пять секунд и меня это повергло в шок. Сделал трассировку:
- Первая строчка - ничего не происходит
- Вторая строчка - задержка
- Третья строчка - закомментирована
- Интерпретатор наткнулся на end; и о чудо! картинка сменилась!
Вот сижу теперь ломаю голову над непоследовательностью такого привередлевого компилятора...
Код:
PaymentButton.Picture.Assign(PaymentButtonClickEvent.Picture);
2. После обновления картинок выполняй процедуру
Код:
Application.ProcessMessages;
FrostFX, картинки перерисовываются по событию WM_PAINT, поскольку ты меняешь картинки в одном методе - обработчике события, то контролы на форме не могут получить сообщения о перерисовке до тех пор, пока этот метод не завершиться. Поэтому, как уже и посоветовал ToRNaDo, после первой смены картинки сделай вызов Application.ProcessMessages. В этом случае все сообщения из очереди (в том числе и WM_PAINT) дойдут до получателей.
makbeth, спасибо за то, что обьяснил как это работает :)
Это действительно работает точно так как нужно мне/заказчику :)
Так что всем спасибо :)