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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2010, 14:07   #1
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию При выполнении кода форма зависает. Как вывести прогрессбар?

Пишу программу, которая должна с моего сайта скачать нудный файл, и старый заменить новым. Типа обновление программы. Проблема в том, что во время закачки форма застывает, пока не закончится закачка. А хотелось бы поставить какой-то прогрессбар и отображать процесс загрузки.
Вот фрагмент кода:

Код:
function TForm1.GetInetFile(const fileURL, FileName: String): boolean;
begin
   Result:=False;
   sAppName := ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
   dwIndex := 0;   dwCodeLen := 10;
   try
      hURL := InternetOpenURL(hSession, PChar(fileURL),nil,0,0,0);
      HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, @dwcode, dwcodeLen, dwIndex);
      res := pchar(@dwcode);
      Memo1.Lines.Add(res); // вывожу на мемо размер требуемого файла
      pb.Max := StrToInt(res); // задаю макс для прогрессбара
      try
         AssignFile(f, FileName);
         Rewrite(f,1);
         Timer1.Enabled := true;
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen);            
         until BufferLen = 0;
         CloseFile(f);
         Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
   finally
   InternetCloseHandle(hSession)
   end
end;
Сама функция вытянута из инета, который пестрит этим примером.
Пример работает и файл вытягивается.
Проблема с формой и прогрессбаром.
Пытался вызывать эту функцию и в нажатии кнопки, и в таймере по времени. Одинаково загружает форму и не дает вывести прогрессбар.

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#" (а не значка #).
Вы не знали? Почитайте правила раздела...
Модератор
и не забудьте подарить детям шоколадку

Последний раз редактировалось mihali4; 06.01.2010 в 14:34.
plato вне форума Ответить с цитированием
Старый 06.01.2010, 14:39   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Таймер-то тут при чем?
Код:
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen); 
//Вот тут вставляем нечто вроде
ProgressBar.Position:=ProgressBar.Position+1;
Application.ProcessMessages;           
         until BufferLen = 0;
mihali4 вне форума Ответить с цитированием
Старый 06.01.2010, 14:39   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Правильнее будет вывести Вашу функцию скачки в отдельный поток, а потом методом Synchronize отправлять данные на Ваш прогрессБар.
FaTaL вне форума Ответить с цитированием
Старый 06.01.2010, 14:49   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вспоминаем школьную математику...
Код:
n байт получили     РАЗМЕР ФАЙЛА
--------------------- = ----------------
          Х                    100%
Код:
...
repeat
 InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
 BlockWrite(f, Buffer, BufferLen);            

 inc(num_packet);
 progressbar1.position:= num_packet* BufferLen *100 div @dwcode;
until BufferLen = 0;
тема обсасывалась тут
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.01.2010, 15:37   #5
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Таймер-то тут при чем?
Спасибо. Помогло. Собственно куда вставить было не проблема, помогла именно строка Application.ProcessMessages;

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Правильнее будет вывести Вашу функцию скачки в отдельный поток, а потом методом Synchronize отправлять данные на Ваш прогрессБар.
Нашел в инете способ закачки в отдельный поток. Но пока не брался его реализовать, т.к. этот нормально заработал.

Цитата:
Сообщение от raxp Посмотреть сообщение
вспоминаем школьную математику...
И Вам спасибо. только я не спрашивал, как посчитать 2+2 ))). Благо, я физмат оканчивал. Проблема была именно в отображении формы.

Считаю на данном этапе вопрос решенным. Всем спасибо.
и не забудьте подарить детям шоколадку
plato вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
появление картинки при выполнении кода kate158 Общие вопросы Delphi 13 29.09.2009 15:43
Зависает документ при срабатывании макроса Quatro_Drive Microsoft Office Excel 6 22.09.2009 23:21
Как избавиться от зависания приложения при выполнении длительных операциях Des Общие вопросы Delphi 15 30.04.2009 02:05
VB6. Программа зависает при выполнении. Artinka Помощь студентам 2 03.04.2008 00:06