Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;
Внешний вид формы (тестовый)

Последний раз редактировалось LACOSTE, 18.09.2013 в 07:55.
Ответить с цитированием
  #2  
Старый 18.09.2013, 09:43
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну, во-первых, эта фича (делфидроид) введена недавно, и я лично не был бы так уверен, что она идеально-стабильная. А вообще, думаю, потоки спасут твою программулину. Гуглить TThread, руководств в Сети - хоть, извиняюсь, попой кушайте.

UPD: Раз юзается Indy - попробуй на форму кидануть IdAntifreeze. Авось проканает.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 18.09.2013 в 09:48.
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
LACOSTE (22.09.2013)
  #3  
Старый 21.09.2013, 23:25
LACOSTE LACOSTE вне форума
Прохожий
 
Регистрация: 18.09.2013
Сообщения: 7
Версия Delphi: Rad Studio XE5
Репутация: 10
По умолчанию

IdAntifreeze есть только в VLC!
Вообщем перевел все приложение на потоки, ничего не виснет, выполняется все очень быстро)
Отличная штука Thread
А по поводу сыроватости версии XE5 могу сказать, что, например поддержка переноса приложения на карту памяти не работает, отсутствуют некоторые фичи андроида, как например всплывающие уведомления, приложения очень много весят, тот же hello world - 25mb, если порыться можно еще ворох недостатков найти, а вообще по хорошему для Android нужно Eclipse + Android IDE , как бы Embarcadero не старались сделать свой компилятор под дроид eclipse не заменить, скоро будем в институте изучать java перейду на eclipse)

Последний раз редактировалось LACOSTE, 21.09.2013 в 23:36.
Ответить с цитированием
  #4  
Старый 22.09.2013, 01:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от LACOSTE
А по поводу сыроватости версии XE5 могу сказать, что, например поддержка переноса приложения на карту памяти не работает, отсутствуют некоторые фичи андроида, как например всплывающие уведомления, приложения очень много весят, тот же hello world - 25mb, если порыться можно еще ворох недостатков найти, а вообще по хорошему для Android нужно Eclipse + Android IDE , как бы Embarcadero не старались сделать свой компилятор под дроид eclipse не заменить, скоро будем в институте изучать java перейду на eclipse)


1. По крайней мере для разбора первой странички я бы рекомендовал честный парсинг в DOM и далее по id тегов получение всего, чего нужно.
2. Смотрел я на это безобразие. Лучше сразу переходи на джаву и не мучай ни себя, ни андроид. Ну или на C++, если очень уж хочется писать нативный код, хотя смысла в этом не вижу. Да, интерфейс на AndroidSDK писать "не айс" (там xml-html-е образное безобразие). Но честно я не вижу смысла писать программы ТОЛЬКО для андроида на Дельфи. только если собираешься потом все портировать и под iOS.

PS. Я пользуюсь IntelliJ Idea, мне кажется удобнее, чем eclipse.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
LACOSTE (22.09.2013)
  #5  
Старый 22.09.2013, 11:28
LACOSTE LACOSTE вне форума
Прохожий
 
Регистрация: 18.09.2013
Сообщения: 7
Версия Delphi: Rad Studio XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
1. По крайней мере для разбора первой странички я бы рекомендовал честный парсинг в DOM и далее по id тегов получение всего, чего нужно.
2. Смотрел я на это безобразие. Лучше сразу переходи на джаву и не мучай ни себя, ни андроид. Ну или на C++, если очень уж хочется писать нативный код, хотя смысла в этом не вижу. Да, интерфейс на AndroidSDK писать "не айс" (там xml-html-е образное безобразие). Но честно я не вижу смысла писать программы ТОЛЬКО для андроида на Дельфи. только если собираешься потом все портировать и под iOS.

PS. Я пользуюсь IntelliJ Idea, мне кажется удобнее, чем eclipse.

Спасибо за ответ!) Это моя первая и последняя программка для андроид на дельфи)) IntelliJ Idea, посмотрел, мне кстати очень понравилось)
Вопрос решен, тему считаю закрытой!)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025