Как перерисовать панель прогресса в FMX (Android)

#firemonkey #c builder #rad-studio

#firemonkey #конструктор c #rad-studio

Вопрос:

У меня есть индикатор выполнения и много задач, которые нужно выполнить. Я просто хочу увеличить значение индикатора выполнения, когда задача (функции bool и void) была завершена. Например:

 changeClothes();
progressBar1->Value = 20;
eatSandwich();
progressBar1->Value = 40;
if(isWeekend()){ 
 progressBar1->Value = 60;
 ShowMessage("Weekend!");
}else
 ShowMessage("Not Weekend");
haveDinner();
 progressBar1->Value = 80;
timeToSleep();
 progressBar1->Value = 100;
  

Я пытался сделать это с помощью for , но без хороших результатов. Пытался сделать так, как я упоминал, но он делает все и показывает панель уже с value в 100.

Ответ №1:

Попробуйте это:

 for(int i = 1; i <= 100; i  ){
    ProgressBar1->Value = i;
    Sleep(50);
    Application->ProcessMessages();
}
  

Хотя рекомендуется вызывать ее ProcessMessages не очень часто, так как это замедлит работу приложения. Может быть, так было бы лучше:

     if(!(i % 10))
        Application->ProcessMessages();
  

В вашем случае попробуйте сделать это следующим образом:

     changeClothes();
    progressBar1->Value = 20;
    Application->ProcessMessages();
    eatSandwich();
    progressBar1->Value = 40;
    Application->ProcessMessages();
    if(isWeekend()){ 
     progressBar1->Value = 60;
     Application->ProcessMessages();
     ShowMessage("Weekend!");
    }else
     ShowMessage("Not Weekend");
    haveDinner();
     progressBar1->Value = 80;
     Application->ProcessMessages();
    timeToSleep();
     progressBar1->Value = 100;
     Application->ProcessMessages();
  

Комментарии:

1. Не работает, я не могу вставить for весь код целиком. ProcessMessages() для этого тоже не работает. Мне просто нужен способ «задача выполнена? Итак, 20 (или 30, 40, просто пример) к значению ProgressBar , подождите 1 секунду и перейдите к другому «.

2. После увеличения значения (позиции) ProgressBar1 вам нужно вызвать ProcessMessages() и все. Это гарантирует, что положение индикатора выполнения обновляется в тот самый момент.

3. Да, я сделал это, как показано выше, но никаких хороших результатов. Я думаю, что решение не в for , просто функция или что-то в этом роде, чтобы остановиться на несколько миллисекунд (sleep()) и функция, чтобы сказать «эй, сделай это, покажи», а затем перейти к следующему шагу. Для возобновления мне нужно обновить индикатор выполнения…

4. Вам нужно вызывать ProcessMessages после каждого изменения положения панели выполнения (а не только один раз). ProcessMessages сделает именно это — позволит приложению обрабатывать все текущие сообщения, включая сообщение об обновлении индикатора выполнения.

5. Как я уже сказал: я это сделал. Я вставил for , функцию, ProgressBar->Value = i, Sleep, if condition и ProcessMessages() , но никаких результатов.