C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Смена картинки на кнопке?  (Прочитано 2166 раз)
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Смена картинки на кнопке?
« : 13 Май 2015, 16:58:57 »

Есть кнопка типа TImage. Кнопка запускает подвижку на COM порте, я хочу, чтобы во время движения стрелка на кнопке затенялась, то есть меняю изображение вначале, а в конце присваиваю старое

Код
 
Unit1.h ////////////////////////////////////////////
TImage *RightArrow;
Graphics::TBitmap *Rstop, *Rmove;
 
Unit1.cpp //////////////////////////////////////////
 
__fastcall TApp::TApp(TComponent* Owner)
{
...
Rstop = new Graphics::TBitmap();
Rmove = new Graphics::TBitmap();
 
Rstop->LoadFromResourceName((int)HInstance,"Right_yellow");
Rmove->LoadFromResourceName((int)HInstance,"Right_grey");
 
RightArrow->Picture->Bitmap->Assign(Rstop);
.....
}
//---------------------------------------------------------------------------
void __fastcall TApp::RightArrowClick(TObject *Sender)
{
char buffer[16] = {0};
 
amp = StepAmpEdit->Text.ToInt();
nSteps = NumStepsEdit->Text.ToInt();
 
if( ((amp>=1)&&(amp50)) && (nSteps>0))
 {
RightArrow->Picture->Bitmap->Assign(Rmove);
 
sprintf(buffer,"1SU%d\r",amp);
comp->WriteCOM(buffer);
Sleep(20);
 
for(int k = 0; k nSteps; k++)
{
comp->WriteCOM("1PR1\r");
Sleep(10);
}
 
RightArrow->Picture->Bitmap->Assign(Rstop);
}
}
 

Проблема в том, что изображение не меняется, хотя движение (цикл) продолжается достаточно долго, несколько секунд.
« Последнее редактирование: 13 Май 2015, 17:05:15 от DimaKor » Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Смена картинки на кнопке?
« Ответ #1 : 13 Май 2015, 20:18:36 »

Осваивайте работу с отдельными потоками. В билдере пример был, с сортировкой.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Смена картинки на кнопке?
« Ответ #2 : 13 Май 2015, 21:27:30 »

А когда ей перерисовываться? Поставь для проверки рабочести кода хотя бы внутри цикла - возле Sleep
Код
Application->ProcessMessage();
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Re: Смена картинки на кнопке?
« Ответ #3 : 14 Май 2015, 09:08:35 »

А так работает действительно

Спасибо
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Смена картинки на кнопке?
« Ответ #4 : 14 Май 2015, 09:14:13 »

Этот костыль только для проверки.
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Re: Смена картинки на кнопке?
« Ответ #5 : 14 Май 2015, 09:15:04 »

А что будет, если оставить?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Смена картинки на кнопке?
« Ответ #6 : 14 Май 2015, 09:30:31 »

Привыкните. И будет получаться ***окод, с необъяснимыми (для вас) ошибками.
По уму используются потоки. А ProcessMessages() - костыль, ломающий взаимодействие потоков и очередей сообщений в GUI.
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Re: Смена картинки на кнопке?
« Ответ #7 : 14 Май 2015, 09:32:34 »

Не знаю. Использовать потоки в подобной ситуации - это никак не по уму, а как раз и есть через самую ж...

Потоки предназначены совсем не для того
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Смена картинки на кнопке?
« Ответ #8 : 14 Май 2015, 09:35:56 »

Потоки предназначены именно для вот этого:
Код
comp->WriteCOM(buffer);
То, что тормозит поток GUI, программист обязан выполнять асинхронно, вне потока GUI. Есть несколько методов, и потоки - один из них.
« Последнее редактирование: 14 Май 2015, 09:42:15 от Rius » Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Смена картинки на кнопке?
« Ответ #9 : 14 Май 2015, 10:13:13 »

Ни к чему поток, накрученный на потоконебезопасный VCL.
В поток только работу с портом. Я себе для этого много лет назад писал стек команд, которые отрабатывались в потоке. Тогда по кнопке забрасываешь данные для отправки, а ответ смотришь таймером или в событии этого стека.

Но всегда смотря что за прога. Если это какой-то отладочный софт для себя любимого, то чего же не сделать ProcessMessage()?
Зашел в обработчик кнопки, задизаблил ее (чтобы еще раз не нажать), ждёшь в цикле ответа по порту вместе с ProcessMessage, затем покидаешь обработчик не забыв Enabled=true.
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Смена картинки на кнопке?
« Ответ #10 : 14 Май 2015, 11:19:07 »

Руки надо выпрямлять с детства Для себя любимого тоже надо делать как для себя.
Потом добавится ещё кнопочка с отдельной такой же задачей, и будет новый вопрос на форуме "почему оно так бесподобно глючит?"
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #11 : 14 Май 2015, 11:32:01 »

Без походов по граблям руки не выпрямляются )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.063 секунд. Запросов: 22.