уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В предварительном обзоре я очень кратко и сжато показал, что представляет из себя Delphi for iOS. Сегодня я решил остановиться на работе с Сетью. Всё-таки работа с www была (и остается) одним из  основных направлений этого блога и не хотелось бы от этого направления полностью отказываться.

Опять же, напоминаю всем читателям (таковы правила, пока не выйдет официальный релиз  продукта — буду напоминать в начале каждой статьи), что публикация этой информации в блоге webdelphi.ru разрешена официально с 18 марта 2013 года представителями компании Embarcadero. 

Теперь, что касается сегодняшней статьи. Сегодня я буду рассматривать работу с HTTP. Как я уже упоминал в комментарии к обзору, в Delphi for iOS нас ждет (наконец-то) компонент TWebBrowser. Вот про это мы сегодня и поговорим.

Компонент TWebBrowser для FireMonkey

Собственно для тех, кто часто работает в Delphi с http, отсутствие этого компонента в FireMonkey было одной из причин не использовать новую платформу. Конечно, можно было найти в Сети, например, проект Chromium Embedded и «допилить» его до работы с Delphi XE3, как это сделал Роман Янковский. Но наличие собственного, «родного» компонента всё-таки лучше, да и, в случае чего, воспользоваться сторонними разработками всегда успеем.

И вот, в Delphi for iOS, на вкладке «Internet» появился он — компонент TWebBrowser для FireMonkey:

Компонент TWebBrowser для FireMonkey

Компонент TWebBrowser для FireMonkey

Жаль, конечно, что сейчас этот компонент может использоваться только в разработках под iOS, но не стоит забывать, что сегодня я рассматриваю только бета-версию и вполне возможно, что в Delphi XE4 этот компонент будет работать и под другими ОС.

Посмотрим, как работает этот компонент. Для этого я создал новый проект «FireMonkey Mobile Application» по шаблону «Basic Tabbed Application» и бросил на первую вкладку TWebBrowser. Получился вот такой вид будущего приложения для iOS:

webbrowser2

Теперь, посмотрим на свойства компонента — их, в принципе, не так уж много. И первое, на что следует обратить внимание — поля.

У TWebBrowser нет свойства Padding — есть только Margins. Это не недочет бета-версии, просто теперь Padding и Margins стали работать «как у людей», т.е. Margins — задает внешний отступ, а Padding — внутренний (ровно так, как это принято, например, в CSS). На скрине выше у TWebBrowser  свойство Align = alClient и заданы значения в свойства Margins [5, 5, 5, 23].

Свойства Margins и Padding аналогичным образом работают и у других компонентов FireMonkey, т.е. Margins теперь задает внешние отступы, а Padding — внутренние отступы. 

Что касается остальных свойств TWebBrowser, то в секции published у нас остается всего одно «неизвестное» свойство:

property URL: string read GetURL write SetURL;

которое задает URL на который необходимо перейти.

Также TWebBrowser содержит два свойства в секции public:

property CanGoBack: Boolean; //True, если можем перейти на страницу назад
property CanGoForward: Boolean;//True, если можем перейти на страницу вперед

Теперь посмотрим как работает этот компонент. Собственно, здесь ничего сложного нет. На данный момент TWebBrowser предоставляет нам основные возможности работы с сайтами, т.е. загружать контент и перечещаться взад/вперед по истории запросов.

Я добавил следующие компоненты на табы:

webbrowser

То есть, клик по кнопке «Go» на первом табе будет запускать загрузку страницы, а после окончания загрузки в ListBox будет заноситься URL на который мы перешли.

Для отслеживания того, что происходит с TWebBrowser для компонента определены следующие типы событий:

 
  TWebBrowserDidStartLoad = procedure(ASender: TObject) of object; //начало загрузки
  TWebBrowserDidFinishLoad = procedure(ASender: TObject) of object;//успешное окончание загрузки
  TWebBrowserDidFailLoadWithError = procedure(ASender: TObject) of object;//окончание загрузки по причине ошибки
  TWebBrowserShouldStartLoadWithRequest = procedure(ASender: TObject; const URL: string) of object;//начало нового запроса

Событие TWebBrowserDidFinishLoad, как и TWebBrowserDidStartLoad вызывается каждый раз при выполнении очередного запроса.

Т.е., если, скажем, на сайте css располагаются в отдельном файле, то события TWebBrowserDidFinishLoad и TWebBrowserDidStartLoad сработают как минимум дважды — при загрузке html и при загрузке css-файла.

О начале очередного запроса нам будет сигнализировать TWebBrowserShouldStartLoadWithRequest.

Для начала воспользуемся событием TWebBrowserDidFinishLoad. Напишем для него такой обработчик:

procedure TTabbedAdvancedForm.WebBrowser1DidFinishLoad(ASender: TObject);
begin
  if lbHistory.Items.IndexOf(edURL.Text)
    lbHistory.Items.Add(edURL.Text)

Обработчик OnClick кнопки «Go» тоже не блещет оригинальностью и выглядит так:

procedure TTabbedAdvancedForm.btnGoClick(Sender: TObject);
begin
  WebBrowser1.Navigate(edURL.Text);
end;

Кстати, у TWebBrowser имеется два метода Navigate:

procedure Navigate; overload;
procedure Navigate(const AURL: string); overload;

Уже сейчас мы можем посмотреть как будет работать приложение. Внимание на экран:

[youtube_sc url=»http://www.youtube.com/watch?v=4oAkmTYeLFQ»]

Обратите внимание, что в последнем случае я занес в edit несуществующий URL в результате чего ничего и не произошло, т.к. мы «забыли» обработать событие TWebBrowserDidFailLoadWithError. Допишем нашему браузеру и этот обработчик, а заодно и посмотрим как выглядят всякие диалоговые окошечки в Delphi for iOS. Я написал вот такой обработчик события:

procedure TTabbedAdvancedForm.WebBrowser1DidFailLoadWithError(ASender: TObject);
begin
  if MessageDlg('Ошибка загрузки. URL '+WebBrowser1.URL,TMsgDlgType.mtError,[TMsgDlgBtn.mbAbort, TMsgDlgBtn.mbRetry],0)=mrRetry then
      WebBrowser1.Navigate;
end;

Теперь наш браузер, в случае ошибки, будет сообщать об этом и «предлагать» два варианта дальнейшей работы — попробовать загрузить страничку снова или же оставить всё как есть:
[youtube_sc url=»http://youtu.be/K0z2dJApRko»] Вот, собственно, как работает на данный момент компонент TWebBrowser в Delphi for iOS. Опять же особо подчеркну, что:

В это статье рассматривается бета-версия продукта и работа в т.ч. и над TWebBrowser продолжается до сих пор. В релизе этот компонент может претерпеть серьезные изменения

В заключение остается сказать, что кроме TWebBrowser для работы с Сетью в Delphi for iOS можно также использовать все компоненты Indy. Пока разбирался с TWebBrowser попутно немного потестировал и idHTTP на симуляторе iOS — все работает, качается, отправляется. В общем без поддержки Сети точно никто не останется ;).

Не знаю (и не могу знать) сколько ещё времени пройдет прежде, чем Delphi for iOS окажется на прилавках электронных магазинов. Надеюсь, что скоро, т.к. следом планируется разработка под Android — вот уж где мне не потребуются ни симуляторы ни эмуляторы :). Но могу сказать, что уже на данный момент Delphi for iOS выглядит довольно впечатлительно. Конечно, мне трудно судить о том насколько быстро или медленно работают приложения под iOS (по скорости работы в симуляторе, который пашет на эмуляторе о реальной работе приложения как-то сложновато судить :)), но надеюсь, что будущие разработчики на Delphi под iOS оценят продукт по достоинству.

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
10 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Delphi
Delphi
28/03/2013 02:52

Влад, спасибо, что не забиваешь на блог.
Будем ждать Delphi for Android.
Сейчас в основном занимаюсь разработкой под веб на php+js, но любимым языком остается Delphi.

Бекжон Жонбеков

Привет!
У меня пока нет возможности проверить коды, которые здесь написали :(

Вот здесь как-то не по дельфийски написали:

procedure TTabbedAdvancedForm.WebBrowser1DidFinishLoad(ASender: TObject);
begin
if lbHistory.Items.IndexOf(edURL.Text)
lbHistory.Items.Add(edURL.Text)

Так компилится? Если да, тогда мне придется срочно доучиться.

Бекжон Жонбеков

Хух! Успокоили :)
Спасибо! А то подумал, что отстал маленько от прогресса.

Sergionn
Sergionn
28/03/2013 14:04

о реальной работе приложения как-то сложновато судить :)), но надеюсь, что будущие разработчики на Delphi под iOS оценят продукт по достоинству.
уже обсудили и оценили, не пользу последней: _http://forum.ru-board.com/topic.cgi?forum=33&topic=13387&start=900

Kazantsev Alexey
28/03/2013 19:33

Судя по видео, пляшущий текст так и не исправили… XE4, однако :(

Alexey
Alexey
21/04/2013 12:57

А под Windows будет все также ущербный IE? В этом виде хромиум или мозилка лучше будут смотреться, на мой взгляд.

Karina de Souza
11/05/2013 01:08

If you guys are developing with FireMonkey, take a look on WebFMX. It makes FireMonkey applications accessible from the Web.
Here is the link to the product site:

http://www.cybelesoft.com/webfmx/

Hope you enjoy it!