Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2010, 07:59   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию Шаг в ProgressBar. Правильность формулы. Типы данных

Составил формулу для вычисления шага, который нужно задавать в Progressbar, чтобы отображать ход загрузки. Смысл формулы: "Берем количество загружаемых файлов, делим на 100 и полученное число переводим в проценты и записываем в свойство StepBy". Например, число загружаемых файлов = 2300. т.е. 2300:100=23. Следовательно 23 - это 1%. Правильно я рассуждаю? Вот, пытался сделать так:
Код:
var
 i,f: real;
begin
 i:=100;
 f:=FloatToStr(Form1.ListBox2.Items.Count/100);
 Form1.ProgressBar1.StepBy(f);
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.09.2010, 08:54   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Рассуждение правильное, реализация не очень.
Код:
var
 i, f: Integer;
begin
  Form1.ProgressBar1.Max := 100;
  f := Round(Form1.ListBox2.Items.Count/100);
  for I := 0 to ListBox2.Items.Count-1 do begin
    ... процесс загрузки
    if ((I+1) mod f = 0) or (I = ListBox2.Items.Count-1) then
      Form1.ProgressBar1.StepBy(f);
  end;
Что-то в этом роде.

Добавление: этот алгоритм не будет работать, если количество элементов в листбоксе меньше 100, из-за того что переменная f будет равна нулю.

Второе добавление: было бы неплохо, если бы прогрессбар оперировал не количеством файлов, а их суммарным объемом (в байтах или Кб, зависит что за файлы - большие, небольшие по размеру).

Еще один совет (ИМХО). Свойство прогрессбара Max установить в количество файлов. Тогда не надо вычислять шаг приращения, а прогрессбар будет показывать более точно процесс загрузки:
Код:
var
 i: Integer;
begin
  Form1.ProgressBar1.Max := Form1.ListBox2.Items.Count;
  for I := 0 to ListBox2.Items.Count-1 do begin
    ... процесс загрузки
    Form1.ProgressBar1.Position := I;
  end;
К тому же, этому алгоритму все равно сколько будет файлов.

Последний раз редактировалось Скандербег; 13.09.2010 в 09:10.
Скандербег вне форума Ответить с цитированием
Старый 13.09.2010, 09:03   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
Добавление: этот алгоритм не будет работать, если количество элементов в листбоксе меньше 100, из-за того что переменная f будет равна нулю.
В этом случае тогда можно добавить какое-нибудь условие типа:
Код:
 if Form1.ListBox2.Items.Count < 100 then 
 begin
  //что-то
 end;
пошел пробовать код
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.09.2010, 09:13   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
пошел пробовать код
Немного тормознул и более простой алгоритм запоздало добавил в свой пост (см. пост #2).

Последний раз редактировалось Скандербег; 13.09.2010 в 09:15.
Скандербег вне форума Ответить с цитированием
Старый 13.09.2010, 09:16   #5
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Цитата:
Добавление: этот алгоритм не будет работать, если количество элементов в листбоксе меньше 100
Почему? Даже при 50 округление будет идти до единицы


Добавлено позже:

А при второй реализации прогресс бар будет слишком часто перерисовываться, что тоже нежелательно, т.к. может вызвать мигание.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab

Последний раз редактировалось ex.cluz; 13.09.2010 в 09:22.
ex.cluz вне форума Ответить с цитированием
Старый 13.09.2010, 09:21   #6
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Вот более верное решение для счета в %
Код:
pb.position :=trunc(колиспф*100/общеекол);
где колиспф- сколько файлов уже просмотрели а общеекол- сколько всего файлов.будет работать с любым количеством элементов кроме 0 конечно
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 13.09.2010 в 09:25.
Mad_Cat вне форума Ответить с цитированием
Старый 13.09.2010, 09:27   #7
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Да, здесь вы правы - арифметическое округление, конечно же ноль будет при кол-ве файлов меньше 50.
Но все равно странно будет выглядеть прогрессбар в процессе, если загружаем, допустим, 80 файлов: "движок" заполнит весь прогрессбар одним махом.
Используя второй алгоритм (пост #2) можно будет видеть как "движок" постепенно заполняет прогрессбар. Быстро или медленно - это уже зависит от размеров файлов.
Скандербег вне форума Ответить с цитированием
Старый 13.09.2010, 09:27   #8
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Код:
ProgressBar1.Max := количество_файлов;
ProgressBar1.Position := текущий_файл;
А почему не воспользоваться стандартными средствами?
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 13.09.2010, 09:32   #9
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

russian-stalker, во #2 посте так и написано.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 13.09.2010, 09:36   #10
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

ex.cluz, ой, извиняюсь. Глянул на первый пример, а второй не заметил.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Типы данных С++ werser Помощь студентам 1 13.03.2010 18:34
Проверка строки на правильность данных haros Microsoft Office Excel 10 28.02.2009 16:39
Типы данных nedden Помощь студентам 2 12.11.2008 17:18
Типы данных??? Рустам Общие вопросы Delphi 10 08.11.2007 08:03