Доброго времени суток Уважаемые форумчане!
Кратко поясню ситуацию данной темы.
Есть сайт расписания учебного заведения, возникла необходимость написать мини приложение для андроид смартфонов которое бы это расписание загружало и отображало как в онлайн так и в оффлайн режиме.
Данное приложение уже написано и работает.
НО! Некоторые операции которые приложение выполняет обрабатываются ~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;
Внешний вид формы (тестовый)
