Показать сообщение отдельно
  #1  
Старый 18.09.2013, 07:52
LACOSTE LACOSTE вне форума
Прохожий
 
Регистрация: 18.09.2013
Сообщения: 7
Версия Delphi: Rad Studio XE5
Репутация: 10
По умолчанию Парсер сайта для Android (Rad Studio XE5)

Доброго времени суток Уважаемые форумчане!

Кратко поясню ситуацию данной темы.
Есть сайт расписания учебного заведения, возникла необходимость написать мини приложение для андроид смартфонов которое бы это расписание загружало и отображало как в онлайн так и в оффлайн режиме.
Данное приложение уже написано и работает.
НО! Некоторые операции которые приложение выполняет обрабатываются ~20 сек. (в зависимости от скорости интернета и т.п.), при этом в приложении (как и в случаи с VLC) виснет интерфейс на время выполнения операции. А хотелось бы показывать прогресс выполнения операции, хотя бы частями.

Ниже привожу код выполнения операции получения списка групп/преподавателей.

Сильно не ругайте, если считаете код плохим. сам только студент, опыт работы в Delphi 1.5 года.

Похоже что необходимо делать потоки данных, либо грамотно пользоваться оператором sleep(); К сожалению практики в этом нету.

Жду от Ваших ответов - советов, может ссылок полезных. Если у кого то найдется время/желание помочь изменить код на примере одной данной операции, буду очень признателен!!)))

Код:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  FMX.StdCtrls, FMX.Layouts, FMX.Memo, FMX.ListBox;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Button2: TButton;
    Memo2: TMemo;
    Button3: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }




  public
  function Pars(T_, ForS, _T:string):string;

  end;

var  
  Form1: TForm1;
  html,group,teach:string;                           // глобальные переменные

implementation

{$R *.fmx}


function TForm1.Pars(T_, ForS, _T: string): string; // функция для парсинга
var a, b:integer;
begin
Result := '';
if (T_='') or (ForS='') or (_T='') then Exit;
a:=Pos(T_, ForS);
if a=0 then Exit else a:=a+Length(T_);
ForS:=Copy(ForS, a, Length(ForS)-a+1);
b:=Pos(_T, ForS);
if b>0 then
Result:=Copy(ForS, 1, b - 1);
end;



procedure Button1Click(Sender: TObject);
var
i:integer;
s,s1:string;
begin

html:=IdHTTP1.Get('http://m.inhk.ru/');             // код странички

// 1 часть обработки кода



// находим в коде часть со списком групп и их id

memo1.text:=pars('<option selected disabled>Выбор группы</option>', html, '</select>'); 
Memo1.Lines.Delete(0);
i:=Memo1.lines.Count;
Memo1.Lines.Delete(i-1);

// удаляем пустые строчки

for i:=0 to memo1.lines.count-1 div 2 do begin
if i<Memo1.Lines.count then begin
memo1.lines.delete(i);
end;
end;

// получаем названия групп и id без лишних тегов

for i:=0 to memo1.lines.count-1 do begin
s:=memo1.Lines[i];
s1:=Memo1.Lines[i];
s:=pars('>', s, '<');
s1:=pars('"', s1, '"');
memo2.Lines.Add(s);
memo3.Lines.Add(s1);
end;

// временно заносим id групп

group:=memo3.Text; 

// заносим названия групп в combobox

for I := 0 to memo1.lines.count-1 do  begin         
ComboBox1.Items.add(Memo2.Lines.Strings[i]);
end;

memo1.Lines.Clear;
memo2.Lines.Clear;
memo3.Lines.Clear;

// часть 2 аналогична 1й, только для преподавателей


memo1.text:=pars('<option selected disabled>Выбор преподавателя</option>', html, '</select>');
Memo1.Lines.Delete(0);
i:=Memo1.lines.Count;
Memo1.Lines.Delete(i-1);

for i:=0 to memo1.lines.count-1 div 2 do begin
if i<Memo1.Lines.count then begin
memo1.lines.delete(i);
end;
end;

for i:=0 to memo1.lines.count-1 do begin
s:=memo1.Lines[i];
s1:=Memo1.Lines[i];
s:=pars('>', s, '<');
s1:=pars('"', s1, '"');
memo2.Lines.Add(s);
memo3.Lines.Add(s1);
end;

teach:=memo3.text;

for I := 0 to memo1.lines.count-1 do  begin
ComboBox2.Items.add(Memo2.Lines.Strings[i]);
end;

memo1.Lines.Clear;
memo2.Lines.Clear;
memo3.Lines.Clear;



// заносим id групп и преподавателей


Memo1.Text:=group;
Memo2.Text:=teach;

end;
Внешний вид формы (тестовый)
Ответить с цитированием