В предварительном обзоре я очень кратко и сжато показал, что представляет из себя 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:
Жаль, конечно, что сейчас этот компонент может использоваться только в разработках под iOS, но не стоит забывать, что сегодня я рассматриваю только бета-версию и вполне возможно, что в Delphi XE4 этот компонент будет работать и под другими ОС.
Посмотрим, как работает этот компонент. Для этого я создал новый проект «FireMonkey Mobile Application» по шаблону «Basic Tabbed Application» и бросил на первую вкладку TWebBrowser. Получился вот такой вид будущего приложения для iOS:
Теперь, посмотрим на свойства компонента — их, в принципе, не так уж много. И первое, на что следует обратить внимание — поля.
У TWebBrowser нет свойства Padding — есть только Margins. Это не недочет бета-версии, просто теперь Padding и Margins стали работать «как у людей», т.е. Margins — задает внешний отступ, а Padding — внутренний (ровно так, как это принято, например, в CSS). На скрине выше у TWebBrowser свойство Align = alClient и заданы значения в свойства Margins [5, 5, 5, 23].
Что касается остальных свойств TWebBrowser, то в секции published у нас остается всего одно «неизвестное» свойство:
property URL: string read GetURL write SetURL;
которое задает URL на который необходимо перейти.
Также TWebBrowser содержит два свойства в секции public:
property CanGoBack: Boolean; //True, если можем перейти на страницу назад property CanGoForward: Boolean;//True, если можем перейти на страницу вперед
Теперь посмотрим как работает этот компонент. Собственно, здесь ничего сложного нет. На данный момент TWebBrowser предоставляет нам основные возможности работы с сайтами, т.е. загружать контент и перечещаться взад/вперед по истории запросов.
Я добавил следующие компоненты на табы:
То есть, клик по кнопке «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 для работы с Сетью в 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 for Android.
Сейчас в основном занимаюсь разработкой под веб на php+js, но любимым языком остается Delphi.
а я не только на блог, но и на Delphi не забиваю :)
Привет!
У меня пока нет возможности проверить коды, которые здесь написали :(
Вот здесь как-то не по дельфийски написали:
procedure TTabbedAdvancedForm.WebBrowser1DidFinishLoad(ASender: TObject);
begin
if lbHistory.Items.IndexOf(edURL.Text)
lbHistory.Items.Add(edURL.Text)
Так компилится? Если да, тогда мне придется срочно доучиться.
ох чОрД :( опять плагинчик забарахлил. Конечно так не скомпилируется. Должно быть по-другому:
procedure TTabbedAdvancedForm.WebBrowser1DidFinishLoad(ASender: TObject);
begin
if lbHistory.Items.IndexOf(edURL.Text)<0 then
lbHistory.Items.Add(edURL.Text)
end;
Хух! Успокоили :)
Спасибо! А то подумал, что отстал маленько от прогресса.
Сорри, что напугал..я больше так не буду :)
о реальной работе приложения как-то сложновато судить :)), но надеюсь, что будущие разработчики на Delphi под iOS оценят продукт по достоинству.
уже обсудили и оценили, не пользу последней: _http://forum.ru-board.com/topic.cgi?forum=33&topic=13387&start=900
Судя по видео, пляшущий текст так и не исправили… XE4, однако :(
А под Windows будет все также ущербный IE? В этом виде хромиум или мозилка лучше будут смотреться, на мой взгляд.
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!