Как я говорил в прошлый раз, в Delphi XE7 появился новый тип проектов под названием Multi-Device Application. Как по мне, так это очень хорошая идея — создаем один проект и потом, переключаясь между различными режимами просмотра настраиваем интерфейс приложения под различные платформы. Код один — интерфейсов пользователя несколько. И всё в одном проекте.
Итак, приступим.
Запускаем Delphi XE7, создаем новый проект Multi-Device Application и в качестве шаблона выбираем «Blank Application». Сейчас в дизайнере отображается пустая форма, без заголовков и вообще без каких-либо опознавательных знаков. При этом, в верхней части окна дизайнера определен стиль (Style) Windows, а режим просмотра (View) — Master:
Переключаясь между различными стилями и режимами просмотра мы можем видеть как будет выглядеть наша форма на различных устройствах. Например, на Android:
Правда при этом, как справедливо заметил Андрей в своем блоге, размеры форм стали, мягко говоря, не совсем понятными. Но, если это глюк, то его исправят в ближайшем обновлении, а мы пока перейдем к дальнейшему изучению дизайнера.
Первое, на что стоит обратить внимание: добавлять компоненты на форму мы можем в любом режиме просмотре будь то Master или любой Android или IOS-шаблон, но удалять — только в режиме Master. При попытке удалить компонент в режиме просмотра отличном от Master Delphi выдаст ошибку:
Следующий момент — это работа со свойствами компонентов. Перейдем в режим Master, бросим на форму компонент TLabel и зададим ему свойство Text как «Master Label». Должно получиться как-то так:
Теперь меняем режим просмотра на любой другой и видим, что метка содержит один и тот же текст везде:
Теперь выберем режим просмотра (View) Android 4» Phone и изменим текст метки, например, на «Android Label»:
Теперь в этом режиме просмотра метка будет иметь один текст (Android Label), а во всех остальных — другой (Master Label). Таким образом, используя различные режимы просмотра мы можем настраивать свойства компонентов под каждый вид приложения. То есть:
Такая работа со свойствами компонентов, по-моему, вполне логична и понятна. Единственное, что несколько непонятно (может я просто не до конца разобрался) — почему нельзя добавить на форму компонент так, чтобы он был доступен только в определенном режиме просмотра? Например, в версии для Windows я хочу использовать компонент TTreeView, а в мобильной версии — TListView и как мне в мобильной версии избавиться от TTreeView? По-моему только с помощью TreeView.Viasible=False. Если не прав — поправьте, пожалуйста.
Следующий момент, касающийся Multi-Device Application — каждый раз после того, как мы выбираем новый режим просмотра, Delphi XE7 создает для этого режима отдельный pas-файл. К примеру, я выбираю режим «Android 7» Tablet». В результате получаем новую форму TForm1_LgXhdpiTb и, соответственно новый файл Unit1.LgXhdpiTb.pas. В проект новые формы включаются как ресурсы:
implementation {$R *.fmx} {$R *.LgXhdpiTb.fmx ANDROID}
При этом, само собой, весь исходный код находится в одном файле — Unit1.pas. Соответственно, чтобы удалить лишнюю форму, достаточно выбрать необходимый режим просмотра и зажать кнопку «Remove View»:
Ресурс с указанной формой будет удален, однако файл *.fmx останется в директории с проектом и удалять его придётся вручную.
После того, как приложение написано, достаточно выбрать в Project Manager необходимую платформу и Delphi XE7 соберет проект.
Что можно сказать в целом про новый вид проекта в XE7? По-моему очень классная и удобная штука получается. Теперь не надо создавать несколько отдельных проектов, можно «на лету» просматривать как будет выглядеть наше приложение при работе на различных платформах и т.д. И, надо сказать, что изучение работы с Multi-Device Application, а также изучение ранее добавленных новинок в Delphi XE6 сподвигло меня восстановить работу над небольшим рабочим проектом, который был «заморожен» по причине того, что мне не хватало на тот момент возможностей FMX. Теперь, похоже, возможностей должно хватить полностью. Так что, в ближайшее время я продолжу разговор про новинки Delphi XE6-XE7 и приведу ещё один или несколько примеров по их использованию.
Книжная полка
куда то у тебя кнопки +1 пропали к статьям.
«Она утонула»(с) :) А если серьезно, то, видимо, после обновления темы где-то забыл что-то прописать
Большое спасибо!
здравствуйте, читал про rest client library, попытался реализовать, список файлов грузит, файлы на google drive грузит, но вот название файла прицепить к запросу не получается, как это сделать?
RESTClient.BaseURL := ‘https://www.googleapis.com/upload/drive/v2’;
RESTRequest.Resource := ‘/files?uploadType=multipart’;
memstream := TMemoryStream.Create;
memstream.LoadFromFile(’11.docx’);
RESTRequest.AddBody(memstream,contenttypefromstring(‘application/vnd.openxmlformats-officedocument.wordprocessingml.document’));
RESTRequest.Execute;
файл загружается на диск гугла, но в параметре title всегда untitled
Могу сейчас ошибиться, но, по-моему, название документа надо передавать в заголовке запроса или же, второй вариант, грузить документ двумя запросами: первый — отправляет файл и получает ID нового документа, а второй — переименовывает документ как надо. Гляньте документацию к API…по-моему, можно раньше было в 1 запрос скинуть и имя документа и тело.
Спасибо за ответ, двумя запросами получилось нормально загрузить файл. А что насчет multipart загрузки?
не получается правильно создать тело запроса, и правильно ли я отправляю заголовки? var FTitle,FMimeType : TJsonObject; memstream,dump : TMemoryStream; bound,s,ss:ansistring; begin restclient.Accept:=’application/json, text/plain; q=0.9, text/html;q=0.8,’; restclient.AcceptCharset:= ‘UTF-8, *;q=0.8′; restclient.ContentType:=’multipart/related’; RESTRequest.Method := TRESTRequestMethod.rmPuT; RESTClient.BaseURL := ‘https://www.googleapis.com/upload/drive/v2’; RESTRequest.Resource := ‘/files?uploadType=multipart’; bound:=’foo_bar_baz’; restrequest.Params.AddItem; restrequest.Params.Items[0].Kind:=pkHTTPHEADER; restrequest.Params.Items[0].name:=’ContentType’; restrequest.Params.Items[0].Value:=’multipart/related; boundary=»‘+bound+'»‘; restrequest.Params.AddItem; restrequest.Params.Items[1].Kind:=pkHTTPHEADER; restrequest.Params.Items[1].name:=’Content-Transfer-Encoding’; restrequest.Params.Items[1].Value:=’base64′; s := ‘—‘+bound+sLineBreak; s := s + ‘Content-Type: application/json; charset=UTF-8’ + sLineBreak + sLineBreak; s := s + ‘{«title»:»app.doc»}’ + sLineBreak + sLineBreak +’—‘+bound; s := s + sLineBreak + sLineBreak; ss:=sLineBreak + sLineBreak + ‘—‘ + bound+ ‘—‘; memstream := TMemoryStream.Create; dump := TMemoryStream.Create; dump.Write(PAnsiChar(s)^, Length(s)); memstream.LoadFromFile(’11.doc’); dump.CopyFrom(memstream,memstream.Size); dump.Write(PAnsiChar(ss)^, Length(ss)); restrequest.AddBody(dump,ctmultipart_related);… Подробнее »
Влад, как всегда спасибо за статью.
Подскажите пожалуйста, это у меня глючит IDE или у баг? в XE6, в опциях проекта, отсутствует выбор ориентации девайса.. Ранее было не критично и да же, по этому внимания не обращал, но проблема появилась. Решил проверить, в xe-7 , всё на месте. Я про Project-Options-Application и там в дереве должен висеть айтем выбора ориентации… Это глюк моей среды xe6? Скажите пожалуйста у кого установлена.
В догоночку, проверил на триал -версиях Devart UNIDac — замечательно присоединился к удаленным базам PostgreeSQl и MySQL через Android , очень быстро и без танцев с бубном. … FireDAC — не успев родиться, умер в моих глазах….
Хотя, если кто скажет, как через FireDAC создать приложение для андроид и подсоединиться к упомянутым БД — заберу слова обратно.
p.s. Всякие обходные замороченные темы , типа DataSnap прошу не предлагать.
Дмитрий, про PostgreeSQl и MySQL не подскажу. Но то, что компоненты от Devart удобнее и легче в освоении, чем FireDAC — факт. По XE6 — выбора ориентации действительно нет
Еще разок спасибо Влад. Значит надо постепенно на xe7 переходить, хотя в xe5 был выбор ориентации принудительной, а мне очень стало это важно.
Delphi — в своем репертуаре, со времен первых версий — удачные только нечетные версии :) (d3 — d5 — d7 и т.д….)
И ладно — бы Влад, что удобнее Dervart , обидно то, что уже добившись от FireDAC соединения (пусть и более заморочено), в конечном итоге оказалось, что на андроид это не сработает :(
Спасибо за статью, а то уроки нашел начальные, но они по 6й версии, а там кое-что отличается… надеюсь на продолжение. Вот тут Дмитрий пишет про подключение к БД, вот статья для чайников была бы вообще полезной.