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

У меня есть индикатор выполнения и много задач. Я просто хочу увеличить значение индикатора выполнения, когда задача (функции 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.


person devs121    schedule 21.08.2020    source источник


Ответы (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();
person Tracer    schedule 21.08.2020
comment
Не работает, не могу поставить for во весь код. ProcessMessages() для этого тоже не годится. Мне просто нужен способ выполнения задачи? Итак + 20(или 30, 40, просто пример) на значение ProgressBar, ждем 1 секунду и переходим к другому. - person devs121; 22.08.2020
comment
После увеличения значения (позиции) ProgressBar1 нужно вызвать ProcessMessages() и все. Это гарантирует, что положение индикатора выполнения будет обновлено в этот самый момент. - person Tracer; 22.08.2020
comment
Да, я сделал это, как вы показали выше, но без хороших результатов. Я думаю, что решение не for, а просто функция или что-то, чтобы остановиться на несколько миллисекунд (sleep()) и функция, чтобы сказать "эй, сделай это", показать и затем перейти к следующему шагу. Для резюме мне нужно обновить индикатор выполнения... - person devs121; 22.08.2020
comment
Вам нужно вызывать ProcessMessages после каждого изменения положения индикатора выполнения (не только один раз). ProcessMessages сделает именно это — разрешит приложению обрабатывать все текущие сообщения, включая сообщение для обновления индикатора выполнения. - person Tracer; 22.08.2020
comment
Как я уже сказал: я сделал это. Я поставил for, функцию, ProgressBar->Value = i, Sleep, if condition и ProcessMessages(), но никаких результатов. - person devs121; 22.08.2020
comment
Значит вы что-то делаете не так или я не понимаю чего вы пытаетесь добиться. Приведенный выше код работает без проблем на моей стороне и показывает, что индикатор выполнения медленно заполняется от 1 до 100%. - person Tracer; 22.08.2020
comment
О, хорошо, я тестировал в Windows, а вы тестировали в Android? В Windows он получает то, что я хочу, но Android быстро переходит от 0% к 100%, я не вижу, чтобы зеленая штука приближалась к 100%. - person devs121; 22.08.2020
comment
Я обновил свой ответ вашим примером. Вы не упомянули Android в своем вопросе, поэтому я не проверял его там. Вы должны быть более конкретными в своем вопросе (ах), чтобы получить правильный ответ. - person Tracer; 22.08.2020
comment
Да, мой плохой, я поставил метку firemonkey, чтобы знать, что это для устройств, но нет проблем ... Я проверил ваш отредактированный ответ, но тоже безрезультатно. - person devs121; 22.08.2020
comment
ProcessMessages не будет работать на Android: en.delphipraxis. net/topic/ Я предлагаю вам отредактировать свой вопрос с таким заголовком, как «Как перекрасить индикатор выполнения в FMX (Android)». - person Tracer; 22.08.2020
comment
Вы уже пробовали progressBar1->Repaint()? Лично я бы переписал этот код, чтобы вообще не блокировать очередь сообщений. После выполнения 1-го шага (changeClothes(); progressBar1->Value = 20;) я бы использовал TThread.(Force)Queue() для запуска следующего шага (eatSandwich(); progressBar1->Value = 40;), а затем снова использовал TThread.(Force)Queue() для запуска следующего шага и так далее, пока не закончу. Разбивая шаги и позволяя очереди сообщений обрабатывать ожидающие сообщения между шагами, это позволяет ProgressBar нормально рисовать себя, а также поддерживает отзывчивость пользовательского интерфейса в целом. - person Remy Lebeau; 22.08.2020
comment
Привет, Реми, я пробовал с Repaint(), но не работает. Я никогда не использую TThread, я новичок в C++ Builder. Я искал в Интернете, но я не понял, как использовать. Можете ли вы сделать небольшой пример, чтобы я проверил? - person devs121; 24.08.2020