Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
20 / 15 / 5
Регистрация: 11.09.2009
Сообщений: 117
1

При выполнении кода форма зависает. Как вывести прогрессбар?

06.01.2010, 14:06. Показов 9097. Ответов 4
Метки нет (Все метки)

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

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
Сама функция вытянута из инета, который пестрит этим примером.
Пример работает и файл вытягивается.
Проблема с формой и прогрессбаром.
Пытался вызывать эту функцию и в нажатии кнопки, и в таймере по времени. Одинаково загружает форму и не дает вывести прогрессбар.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2010, 14:06
Ответы с готовыми решениями:

Зависает форма при выполнении цикла
Всем привет! Пытаюсь посредством цикла перемешать элементы массива, избегая повторов. Пользуюсь...

Зависает программа при выполнении цикла
Здравствуйте, на 3 кнопки написаны циклы, при их выполнении программа зависает, подскажите в чем...

Зависает форма и RichTextBox при выполнении программы
Здравствуйте, форумчане! Возникла проблема с тем, что при выполнении кода зависает форма и...

Зависает браузер при выполнении кода
window.onload = function () { var mas = document.getElementById('back-fon').children; var...

4
158 / 157 / 16
Регистрация: 26.07.2008
Сообщений: 549
06.01.2010, 14:10 2
Вставьте в код строчку
Application.ProcessMessages
2
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.01.2010, 15:04 3
Dream, здесь скорее всего придётся использовать TThread, т. е. класс потока. Application.ProcessMessages удобно использовать, когда есть какой-то цикл с "быстрыми" итерациями. Но в представленном коде итерации скорее всего "медленные". Потому что долго могут выполняться отдельные команды. Например: InternetReadFile(); - эта функция может отрабатывать долго - в зависимости от скорости закачки.
0
20 / 15 / 5
Регистрация: 11.09.2009
Сообщений: 117
06.01.2010, 15:39  [ТС] 4
Цитата Сообщение от Dream Посмотреть сообщение
Вставьте в код строчку
Application.ProcessMessages
Помогло. Спасибо. В потоках необходимость не возникла.
Вопрос закрыт.
1
9 / 9 / 4
Регистрация: 22.10.2010
Сообщений: 95
29.01.2013, 21:42 5
Ребята та же петрушка а куда вставить Application.ProcessMessages
качаю так idHTTP1.Get(Y1, LoadStream)
0
29.01.2013, 21:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2013, 21:42
Помогаю со студенческими работами здесь

Lazarus намертво зависает при выполнении этого кода
begin {size-Количество кнопок} i:=Form2.Showmodal; setlength(but,size); c:=0; ...

Как правильно обработать ошибки при выполнении кода?
Имеется код : public void addMedication(Set<ReservationMedication> reservationMedications) { ...

Как сэкономить время и ресурсы при выполнении кода VBA
Доброго всем времени суток. Проблема такая: есть лист, в котором есть огромная таблица - много...

Определить, как изменится значение указателя при выполнении кода
При выполнении операции: double *p; ++p; значение указателя р увеличится на: Выберите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru