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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2010, 18:33   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Раcсчитать координаты - Нарисовать бегунок и полосу "рисованного" прогрессбара

Фейлю при расчете координат.

Задача:
Нарисовать бегунок и полосу "рисованного" прогрессбара:

Изображение 1: █, (размер: 3 х 3)
Изображение 2: ►. (размер: 3 х 3)

Прогресс бар выглядит так: ███████████►

Начальные координаты в основном окне: 16, 207.

Максимальное количество возможных "блоков" (сколько умещается в картинке прогрессбара) - 96.

Рисую в цикле.

Проблема в том, чтобы создать функу, которая будет принимать значения от 0 до 100 (%) и рисовать этот "прогресбар". Не выходит рассчитать координаты.

Примерно накинул:
Код:
Procedure DrawProgress(PRC : Byte);
Var
 N : Byte;
 M : Real;
Begin
   M := 100/96;
   For N:=0 to Round(PRC*M) do
   FRMMain.IMGMain.Canvas.Draw(16+3*Round(M*PRC*100/96),207,BTM[4]);
   FRMMain.IMGMain.Canvas.Draw(16+3*Round(M*(PRC-1)*100/96),207,BTM[3]);
End;
Выводит откровенный бред.

Прошу помощи.


P.S.
2admin:

Фильтрация по названию (помогите) темы легко взламывается.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.04.2010, 04:08   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

О_о, ну и формула
96 блоков - 100%
1% - 0.96 блока
Логично начинать вывод не с 0%, а с 1
Код:
For N:=1 to Round(PRC*0.96) do
   FRMMain.IMGMain.Canvas.Draw(16+3*(N-1),207,BTM[4]);
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 26.04.2010, 17:21   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Либо ошибка опять в формуле, либо в том, как я её использую:
Код:
Procedure DrawProgress(PRC : Byte);
Var
 N : Byte;
 M : Real;
Begin
 For N:=1 to Round(PRC*0.96) do
   FRMMain.IMGMain.Canvas.Draw(16+3*(N-1),207,BTM[4]);
End;
Код:
procedure TFRMMain.IDHMainWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
 Progresses := AWorkCount;
 DrawProgress(Round(Progresses*100/88628));
end;

procedure TFRMMain.IMGMainDblClick(Sender: TObject);
begin
try
  if IDHMain.Get('http://www.programmersforum.ru/showthread.php?t=94500') <> '' then
      ShowMessage('Инет есть');
  except
    ShowMessage('Инета нет или сервер недоступен');
  end;
end;
В результате не вижу прогресса реалтайм, а вижу только "недоехавший" прогрессбар после загрузки:


Где я дурак?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.04.2010, 21:20   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Код:
 DrawProgress(Round(Progresses*100/88628));
не знаю, что у тебя тут такое, но передавать надо просто проценты
Код:
DrawProgress(50);
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 26.04.2010, 21:22   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Хм... Вот когда передаю 100 то рисуется правильно. Тогда как передать процентное содержание от загруженного файла?
Код:
 DrawProgress(Round(Progresses*100/88628));
88628 - размер запрашиваемой страницы в байтах.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.04.2010, 21:44   #6
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

А Progresses это что такое?
Проверь перед вызовом процедуры рисования, чему равно Round(Progresses*100/88628), мало ли что он там наокруглял. И кстати, лучше всё-таки размер каждый раз заново узнавать, а то мало ли кто что в той теме нафлудит
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 26.04.2010, 21:53   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
лучше всё-таки размер каждый раз заново узнавать
А разве его можно узнать, не скачивая файл?
Цитата:
А Progresses это что такое?
Глобальная переменная (глобальная - чтобы отрисовывать при запуске и проч.)
Код:
Progresses : Integer = 0;

Просмотрел лог роунда и понял, в чем проблема. Добавил следующее:
Код:
procedure TFRMMain.IDHMainWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  Progresses := 88628;
 DrawProgress(Round(Progresses*100/88628));
 Lis.Add(IntToStr(Round(Progresses*100/88628)));
end;
И прогресс бар заполнился полностью после скачивания. В логе было следующее: 3, 39, 69.

Так как узнать размер файла ДО скачивания?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.04.2010, 22:06   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
var HTTP : TidHTTP;
begin
 HTTP := TIdHTTP.Create(nil);

 HTTP.head('http://s53.radikal.ru/i141/1004/58/8ad9d9a74dc4.png');
 caption:= inttostr(HTTP.Response.ContentLength);
 HTTP.Free;
или пропарсить на сокетах
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 26.04.2010 в 22:10.
raxp вне форума Ответить с цитированием
Старый 26.04.2010, 22:25   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
HTTP := TIdHTTP.Create(nil);
HTTP.head('http://www.programmersforum.ru/showthread.php?t=94500');
IntLen := HTTP.Response.ContentLength;
IntLen = -1 !!! О_о?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.04.2010, 23:39   #10
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Я не силён в Indy, но вроде бы размер файла можно узнать в событии WorkBegin, там передаётся параметр AWorkCountMax, вроде это он и есть, поправьте если не прав
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При старте страницы, опустить полосу прокрутку вниз _PROGRAMM_ JavaScript, Ajax 0 27.12.2009 18:45
Как убрать такую розовую полосу из браузера,причём я уже всё перепробовал и она отображается во всех брау DartWayder HTML и CSS 1 22.05.2009 19:53
по правой стороне поля, при печати, делает полосу Виктор1966 Свободное общение 1 11.03.2008 13:08
координаты Aram Общие вопросы C/C++ 5 08.06.2007 20:03