Форум по 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(); К сожалению практики в этом нету.

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

Код:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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,107
Версия 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, посмотрел, мне кстати очень понравилось)
Вопрос решен, тему считаю закрытой!)
Ответить с цитированием
Ответ


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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