Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Требуется помощь! Непойму что-такое 
:(
    Опции темы
Alkash
Дата 6.8.2004, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Проблема в том - при нажатии на батон, прога как будто виснет, IdAntiFreeza поставил, но нифига.Как бы сделать, чтоб бегал прогресс бар как в IE, и показывать отсчёт времени до конца считывания инфы?А то не поймёшь- зависла или работаетsad.gif

Код
procedure TForm1.Button1Click(Sender: TObject);
var
Adr, html : string;
Posts : TPosts;
 PostNo, i, i2: integer;
 tag: integer;
 User: boolean;

procedure AddText (const txt : string; c : TColor; fs : TFontStyles);
var
 st : integer;

begin
  st := RichEdit1.SelStart;
  RichEdit1.Lines.Add(txt);
  RichEdit1.SelStart := st;
  RichEdit1.SelLength := Length(txt);
  RichEdit1.SelAttributes.Color := c;
  RichEdit1.SelAttributes.Style := fs;
  RichEdit1.SelectAll;
  RichEdit1.SelStart := RichEdit1.SelLength;
end;

begin
RichEdit1.Lines.Clear;
SetLength (Posts, 0);

IdHTTP1.Host := HostName;
IdHTTP1.Connect;

PostNo := 0;
repeat
  AddText ('Get from PostNo: ' + IntToStr(PostNo), clBlue, []);
  RichEdit1.Update;
  Adr := URL + 't=' + Edit1.Text + '&start=' + IntToStr(PostNo);
  html := IdHTTP1.Get(Adr);
  i := GetPosts(html, Posts);
  Inc (PostNo, i);
until i = 0;
 Tag := 0;
 for i := 0 to High(Posts) do Posts[i].Tag := 0;
//Тут присваиваем уникальному юзверю уникальный тэг.
 for i := 0 to High(Posts) do
   if Posts[i].Tag = 0 then
     begin
       Inc(Tag);
       Posts[i].Tag := Tag;
       for i2 := i + 1 to High(Posts) do
         if Posts[i2].User = Posts[i].User then Posts[i2].Tag := Tag;
     end;

//Тут выводим в порядке возрастания значения поля Tag все посты каждого
//юзверя.
 for i := 1 to Tag do
   begin
     User := true;
     for i2 := 0 to High(Posts) do
       if Posts[i2].Tag = i then
         begin
           if User then
             begin
               AddText (Posts[i2].User, clBlack, [fsBold]);
               User := false;
             end;

           AddText (Posts[i2].PostDate, clGreen, [fsItalic]);
           AddText (Posts[i2].Text, clBlack, []);
           AddText ('', clBlack, []);
         end;
         IdHTTP1.Disconnect;
   end;

end;




--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
78125
Дата 6.8.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 20.1.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



могет поток?
--------------------
купим подпись
PM MAIL   Вверх
Vit
Дата 6.8.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Забросить код в отдельную нитку


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Alkash
Дата 6.8.2004, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



В смысле в отдельную?


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Pakshin A. S.
Дата 6.8.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



1) В циклах, где идёт изменение на форме поставить Application.ProcessMessages
Пример:
Код

for i:=1 to 2004 do
begin
  Label1.Caption:=IntToStr(i);
  Application.PrecossMessages
end;

2) Создать поток.
PM   Вверх
Alkash
Дата 6.8.2004, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Код
for i := 1 to Tag do
  begin
    User := true;
    for i2 := 0 to High(Posts) do
      if Posts[i2].Tag = i then
        begin
          if User then
            begin
              AddText (Posts[i2].User, clBlack, [fsBold]);
              User := false;
            end;

          AddText (Posts[i2].PostDate, clGreen, [fsItalic]);
          AddText (Posts[i2].Text, clBlack, []);
          AddText ('', clBlack, []);
  Application.ProcessMessages;//?????
        end;

Так что-ли?


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Pakshin A. S.
Дата 6.8.2004, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Немного подумал и решил, что лучше так:
Код

procedure AddText (const txt : string; c : TColor; fs : TFontStyles);
var
st : integer;

begin
 st := RichEdit1.SelStart;
 RichEdit1.Lines.Add(txt);
 RichEdit1.SelStart := st;
 RichEdit1.SelLength := Length(txt);
 RichEdit1.SelAttributes.Color := c;
 RichEdit1.SelAttributes.Style := fs;
 RichEdit1.SelectAll;
 RichEdit1.SelStart := RichEdit1.SelLength;
 Application.ProcessMessages;
end;


Но можно и так, как предложил. Просто в первом варианте - конечные изменения, а во втором - каждое изменение.
PM   Вверх
Alkash
Дата 6.8.2004, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Во, спасибо гут, заработало.....Но 2 вопроса остались....


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
p0s0l
Дата 6.8.2004, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Знакомый код! smile.gif
Сама закачка происходит тут:
Код

repeat
 AddText ('Get from PostNo: ' + IntToStr(PostNo), clBlue, []);
 RichEdit1.Update;
 Adr := URL + 't=' + Edit1.Text + '&start=' + IntToStr(PostNo);
 html := IdHTTP1.Get(Adr);
 i := GetPosts(html, Posts);
 Inc (PostNo, i);
until i = 0;

AddText тут поставлен + RichEdit1.Update лишь для того, что показать, что чо-то там происходит... Это было сделано так, для примера.
Для того, чтобы сделать прогресс-бар, надо закачать первую страницу темы, оттуда выдрать количество страниц в теме, и уже тогда можно будет сделать прогресс бар, и кстати, цикл немного изменится (будет на 1 запрос к серверу меньше, так как было сделано по-халявному):
Код

PageNo := 1;
PageMax := 1;
repeat
 Adr := URL + 't=' + Edit1.Text + '&start=' + IntToStr(PostNo);
 html := IdHTTP1.Get(Adr);
 if PageNo = 1 then PageMax := GetMaxPage(html);
 Inc (PostNo, GetPosts(html, Posts));
 Inc(PageNo);
 ProgressBar1.Max := PageMax;
 ProgressBar1.Position := PageNo;
 Application.ProcessMessages;
until (PageNo > PageMax);

Тебе тут надо написать функцию GetMaxPage, которая из html-текста выдирает макс. № страницы (где-то на странице либо вверху, либо внизу должны быть ссылки)...


Добавлено @ 18:31
Кстати, у тебя IdHTTP1.Disconnect; стоит в цикле... лучше вынеси из цикла


--------------------
С уважением, г-н Посол.
PM   Вверх
Alkash
Дата 6.8.2004, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Хм, сенкс.А как показать, сколько осталось до конца отображения информации в РичЭдите?
В смысле в минутах, начиная с максимального времени и до нуля.

Это сообщение отредактировал(а) Alkash - 6.8.2004, 23:03


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
p0s0l
Дата 7.8.2004, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Для поиска макс. страницы - ищи <span class="nav">Страница
там далее идёт например: <b>1</b> из <b>3</b>
Время - примерно так:
Код

PageNo := 1;
PageMax := 1;
TimeStart := GetTickCount;
repeat
Adr := URL + 't=' + Edit1.Text + '&start=' + IntToStr(PostNo);
html := IdHTTP1.Get(Adr);
if PageNo = 1 then PageMax := GetMaxPage(html);

TimeDelta := GetTickCount - TimeStart;
TimeTotal := TimeDelta*PageMax / PageNo

Inc (PostNo, GetPosts(html, Posts));
Inc(PageNo);
ProgressBar1.Max := PageMax;
ProgressBar1.Position := PageNo;
Application.ProcessMessages;
until (PageNo > PageMax);

TimeDelta и TimeTotal - в миллисекундах, первое - сколько прошло времени, второе - сколько всего времени надо на закачку...



--------------------
С уважением, г-н Посол.
PM   Вверх
Alkash
Дата 7.8.2004, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Спасибо.


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.