Delphi программа для андроид
Хелп оказался толковый и довольно подробный. Содержит не только свойства и методы, но и примеры и даже описание методик разработки. В общем, возвращение к истокам, как оно было ещё у Борланда.
Cама среда мне очень нравится. В Визуал Студио всё какое-то аморфное и невнятное. Юнити визуально неплох, но там совсем другая специфика. Короче – язык программиста всё равно не опишет то, что видит глаз эстета, даже если они принадлежат одному человеку…
Интерфейс пользователя
FireMonkey порадовал своей гибкостью. На любой контрол можно повесить другой, на тот ещё один, и так далее, достигая очень интересных результатов. По сравнению с VCL стандартизовано именование свойств. Никаких больше Caption’ов и прочего, если где-то есть текст – это всегда Text. Позиция – всегда Position. Масса способов выравнивания. Кроме того, есть TLayout – нечто «невещественное» (об этом будет и ниже), невидимое, на что можно положить контролы и выравнивать их «в пустоте», а не обязательно на какой-нибудь панели.
Когда много всего на форме, становится очень полезным свойство DesignVisible – скрыть в дизайн-тайме. Набор стилей для Андроида прилагался только один, но очень элегантный – белым по чёрному, как мне нравится.
В инете ходят слухи, что ссылки на стиль для контрола (StyleLookup) иногда «не сохраняются». Для многих типов контролов (а может и для всех) существует для каждого своя ссылка «по умолчанию», которая будет назначена, даже если не указана, и которая-то и не сохраняется, как я понимаю, для экономии места в ресурсе формы.
Контролу можно добавить анимацию, и даже несколько, и даже одновременно. И это не только перемещение по экрану, но и изменение любых вещественно-численных свойств (размеров, цвета, масштаба и т.д.). Для каждой анимации можно указать временную задержку её начала, что очень удобно в сложных случаях, т.к. можно обойтись без дополнительных таймеров, просто запустив все нужные анимации одновременно из одного блока кода.
Теперь о жестах. В принципе всё просто – назначаем контролу Touch.GestureManager, галочками помечаем интересующие жесты, назначаем искусственное расширение границ ловли жестов (если контрол мелкий) в TouchTargetExpantion, создаём для него событие OnGesture и ловим там по EventInfo.GestureID нужный жест. Но есть тонкости.
Ещё именно под Андроидом я бы настоятельно порекомендовал явно проверять GestureID каждого пойманного жеста и реагировать только на те, которые интересуют (независимо от того, какие жесты помечены галочками).
И пример. Долго не мог сообразить, как показать баннер в TWebBrowser. Решение нашёл на одном форуме и творчески переработал. Но, если быть уж совсем точным, не до конца. Практикующие перфекционисты могут поразвлечься и этот недочёт поискать. Однако код при этом абсолютно рабочий и именно его я использую:
HTML тут – это код этого самого банера.
Базы данных
В XE5 включён набор компонентов для универсального доступа к базам данных – FireDAC. В принципе все названия свойств и методов как у других аналогичных наборов, так что тут всё ясно. Я использовал его для общения с SQLite. Всё настолько просто и обычно, что даже не знаю, что рассказать. К тому же и не помню ничего – в это время смотрел что-то по медиаплейеру, руки сами всё сделали.
Чтобы почувствовать разницу, желающие могут для сравнения после FireDAC сделать что-нибудь с базой данных из программы на той же Юнити. Да ладно Юнити, она игровая, – вон из той же Визуал Студии. После этого начинаешь понимать, где пули свистят, а где туземки коктейли разносят…
Ну и для любителей делать всё своими руками приведу небольшой пример, как заполнять ListBox без Bindings:
Кроме всего прочего, в зависимости от кода в столбце d_result в строчку лист-бокса помещается та или иная картинка:
Главное, что тут не забыть – это aList.AddObject(aItem);
Ну и Next, конечно, чтобы не зависло.
Манипуляции с формами
То, к чему приучает Делфи – это каждому действию свою форму. Под Андроидом в ней можно точно так же, как и под Виндоуз, создавать, показывать и закрывать формы. Каждая новая так или иначе созданная и показанная форма будет как бы «модальной», т.е. закрывающей всё пространство приложения. Однако Form.ShowModal делать не следует (Андроид этого «не понимает»), а следует по старинке просто вызывать Form.Show. По системной кнопке Back автоматом вызывается Form.Close и самая верхняя на данный момент форма закрывается. Можно её потом опять использовать. При закрытии главной (первой) формы приложение, как и следовало ожидать, закрывается. Замечу, что не следует закрывать форму с параметром caFree либо явно её уничтожать (Free, Release) – не любит Андроид этого!
и работало как часы и под Андроидом, и под Виндами.
Если же возникают какие-либо проблемы с пониманием этого процесса, без всякого стёба рекомендую немного пописать на си-шарпе. Там вообще деструкторы явно вызывать не принято, просто или выходишь из процедуры, где данный объект был локальной переменной, или присваиваешь (глобальной) переменной значение null. Через некоторое время уже спинным мозгом начинаешь чувствовать момент, когда ладьи с объектами отправляются в Вальгаллу, причём безо всякого с твоей стороны толчка.
Массивы
При разработке под мобильный компилятор в руководстве по адаптации кода сказано «не использовать статические массивы». Указано также одно исключение – когда статический массив является членом структуры. И всё. Не совсем ясно, относится ли это к константам-массивам. Например, таким как
Не исключено, что так делать можно, хотя я такого старался избегать и формировал массивы строк в initialization динамически. В си-шарпе там хоть это можно в описании делать… Короче, вопрос требует дальнейшего исследования и разъяснения.
Следует также помнить, что элементы строки (string) в мобильном компиляторе нумеруются с нуля.
Операторы
Появился (уж не знаю в какой версии) новый оператор
Похоже, все языки стремятся к общему знаменателю. Кстати, перебирать им в паскале можно не только массивы, но и множества.
Продолжаем нашу серию статей по Delphi. В предыдущем материале мы скачали и установили бесплатную версию Delphi и запустили простейшую программу под Windows, сегодня наша цель: разработать первое приложение на платформе Android и запустить его на своём телефоне.
1. Подготовка среды разработки Delphi для создания Android-приложений
Процесс довольно длительный, может потребоваться перезапуск среды разработки. Старайтесь не нагружать компьютер другими операциями. После успешного завершения вы увидеть надпись Operation Completed.
2. Подготовка проекта Android-приложения
Выбираем Header/Footer (шаблон приложения с шапкой и подвалом) и жмём ОК.
Внесем небольшие изменения в наше приложение. В шапке формы напишем Привет Android. Для этого нажмём на метку HeaderLabel на форме и слева внизу найдём параметр Text.
Переключим целевую платформу для компиляции приложения на Android в правом верхнем углу экрана (дважды щёлкните названии платформы).
Без телефона запустить приложение не получится. Давайте его настроим.
3. Настройка телефона для разработки Android
К сожалению, каждый телефон настраивается по-своему. Я расскажу общую схему на примере моего Xiaomi Redmi Note 4.
После этой процедуры зайдите в пункт меню Расширенные настройки, там нажмите Для разработчиков.
В меню разработчиков нужно включить кнопку Отладка по USB и затем Установка через USB. (Нюанс: для Redmi Note 4 в этот момент должна быть вставлена SIM-карта. После включения этих опций симку можно вынуть).
На других телефона процедура выглядит примерно также. Для вашей модели телефона инструкцию включения режим разработчика ищите в Google по запросу: «как включить режим разработчика для *название телефона*» или «как включить отладку по USB для *название телефона*».
При подключении устройства телефон может попросить разрешить отладку через USB для конкретного компьютера. Ставим галку и соглашаемся, нажав ОК. Если не успели, вытаскиваем кабель и вставляем снова.
Но может и не попросить, зависит от модели. Теперь важно, чтобы телефон увидела Delphi.
Скорее всего, после успешного подключения среда разработки подхватит устройство автоматически. Если этого не произойдёт, попробуйте нажать кнопку Refresh devices (обновление устройств). Справа от надписи Android вы увидите название вашего смартфона.
Всё готово к запуску приложения.
4. Запуск приложения на Android
Нажмите F9 (зелёный треугольник в панели управления) для запуска приложения.
Пока программа будет компилироваться, внимательно следите за вашим устройством Android. После создания файла apk (установочного файла Android-приложения) на компьютере он будет передан на ваш смартфон. Например, мой Xiaomi Redmi Note 4 даёт только 10 секунд на подтверждение установки. Если вы не уложитесь в это время (не успеете нажать Установить), установка будет отклонена и её нужно будет запускать заново, нажав F9 в Delphi.
К счастью, можно запомнить этот выбор для конкретного приложения. Ставьте галку (на скриншоте я ещё это не сделал) и нажимайте Установить, когда увидите подобный экран:
НЮАНС. Если один раз приложение установилось, а потом появляется ошибка, попробуйте удалить его с устройства. Это может быть связано с изменениями настроек телефона, подключением телефона к другому компьютеру и т.д.
5. Ввод данных в Android-приложении
Добавьте на форму текстовое поле, для этого найдите компонент TEdit в палитре компонентов (воспользуйтесь поиском, как показано на скриншоте) и перетащите его в верхнюю часть формы.
Под ним добавьте компонент кнопки TButton, как в предыдущем уроке. На самой кнопке напишите слово Приветствие, использовав его поле Text в инспекторе объектов. Ваш экран будет выглядеть примерно так:
И для текстового поля, и для кнопки измените в инспекторе объектов следующие свойства:
Элементы прижмутся к верхней части формы и станут в 2 раза выше, это сделает работу с программой удобнее (особенно на Android). Выглядеть в среде разработки это будет вот так:
6. Нажатие кнопки
А сколько весит hello android в application store и debug версиях?
Хотелось бы увидеть окно с настройками компиляции.
Torbins, сорри, туплю..какое окно настроек интересует?
Все :) Можно ли решать, какие наборы инструкций будут использоваться?
Влад добрый день. Интересует где Вы взяли Xe5?
Подскажите еще, какой компонент используете в качестве таблицы списка в DelphiFeed?
9-10мб очень много
eclipse собрал бы не более 1мб
Vlad написал же, что это размер debug сборки, в release выйдет в разы меньше. Не 1mb явно, но эта разница не большая и будет уже не столь значительна в больших приложениях.
Подозреваю, что на Android 2.3 работает благодаря пакету совместимости от Google (который предоставляет более новое API для более старой ОСи)
Вроде всё правильно сделал, но у меня приложение пустое разворачивается, какие бы компоненты я не ставил.
А 4.1.2 SM-T211
alikust, всмысле? Как разворачивается?
У меня такая же проблема. То есть при запуске приложения на форме не видно никаких компонентов.
Такая же проблема
По поводу Е2312 добавь иконки в проект, при компиляции создается res файл содержащий изображения,который хочет найти компилятор
А в каком варианте лицензии XE5 (starter / professional / enterprise / architect) есть возможность компилить под android?
А как настроить тоже самое для Iphone?
для аднроида так просто, а для айфонов в вики пишут что надо к МАКу подключаться.
Есть вариант проще? чтобы тоже по USB
по-моему без лицензии разработчика нельзя. А вместо железного макбука моно использовать виртуалку с мак осью и симулятор.
установил RAD Studio xe5, законнектился по сети к маку, в который по усб подключен Iphone 4S
выполнил все инструкции по настройке.
Имеется аккаунт разработчика.
Все нормально работает на моём телефоне, при запуске приложения с винды, результат вижу в телефоне.
Вопрос: не работает на другом телефоне, то же самой модели. с другим аккаунтом.
что можно сделать чтобы приложение загрузить на другой телефон?
Поставил XE5 для андроида, никак он не мог он увидеть в таргет мои планшеты, скачивал дрова на планшеты но никак.
В очередной попытке поставил Моборобо и все ок.
Выдавал сначала одну ошибку, победил добавлением в переменные PLATFORM=Win32, теперь не деплоится:
[PAClient Error] Error: E0004 File does not exist: C:\Users\GreyScall\Documents\RAD Studio\Projects\Android\Test_0001\Test_0001._@emb_.tmp
В дебаге все работает а вот когда перевожу прогу в релиз вуерсию то не коннектится к веб сервисам (( из-за чего это может быть .
З.Ы. Делать все через код можно, но в лом :) хочется все таки визуально размещать и видеть реальные размеры-разметку
Подпись приложения.
Как подписать приложение, выходит ошибка INSTALL PARSE FAILED NO CERTIFICATES
Project ->Options ->Provisioning -> кнопка New Keystore
Как создать новую форму ? Main form.. form1 значит можно и вторую форму создать ? Неудобно ато в одной форме работать
Да как бы так же само как и в других версия Delphi создается и используется также само
Доброго времени суток.
Эта ошибка выводится в полу Messages при компиляции.
Вот она:
[PAClient Error] Error: E0004 File does not exist: C:\Users\╒└╩┼╨\Documents\RAD Studio\Projects\AndroidT\AndroidT._@emb_.tmp
Кто-нибудь побил белый экран (это когда не видно компонентов на экране) при работе приложения?
и попутно вопрос: как запустить приложение под интел? игры с настройками в NDK и SDK к успеху не привели?
wood, Intel Atom не поддерживается в XE5
В какую папку его установить?
Могу ошибаться, но, по-моему причина в путях вида C:\Documents and Settings\Slava\╠юш фюъєьхэЄ√\RAD Studio\Projects\Android\Debug\Project1\library
Поменять не пробовали?
Vlad! У меня есть еще один вопрос? В delphi xe5 в project Manager не определяется мой планшет? Что это может означать? Спасибо за ответ на предыдущий вопрос.
Взял я XE6 а там как я поднял пока не получишь сертификат этого Hello android не увидишь? Как можно загрузить не подписанное приложение без ошибки путь до test2354.apk Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]?
У меня не видит телефон, galaxy s3 хотя установлена 19 версия api
Решили проблему?
У меня аналогичная ситуация.
Следующий урок пожалуйста :)
Люди как поменять платформу на Android
В Project Manager есть только 64-bit Windows, а платформы Андроид нет, как её туда добавить?
Компилировать на Delphi под Android и iOS не целесообразно! Пустая трата времени! Получите тормозящий, бестолковый софт!
Ребяты, подскажите есть возможность прикрутить андроид к TurboDelphi .
Добрый день, Влад!
Добрый день прошу помочь мне.
У меня телефон htc one e9 plus и когда я создаю любую программу даже просто кнопку (Delphi XE5) в телефону появляется иконка но при запуске все программы бывают черного цвета и не отображается что внутри и нет реакции
от чего это так ?
Как обычно, начнём с простейшего и самого бесполезного. Сделаем приветствовалку. Легко, примитивно, бесполезно. В бонус к этому, покажу как можно достаточно неплохо на первое время оптимизировать приложения под разные экраны.
Создаём новый мобильный проект. Что к чему в этом окне разобраться успеете.
Как создать такой проект? Во, смотрите.
Следом откроется ещё одно окно. Это будет выбор шаблона. Сейчас нам нужен пустой. (Blank Application)
Теперь, открылось окошко в котором мы и будем работать. Разберём его подробней:
Наверняка, у вас на форме творится бардак. Вот, вроде моего:
Откроется вот такое окошко. Отмечаем центр по горизонтали и радуемся.
Повторяем со всеми компонентами. Получается что-то вроде этого:
Ну всё. С оформлением закончено. Теперь, давайте-ка, перейдём к части кода. Нажимаем на компонент кнопки два раза. Откроется скромненький редактор кода с уже сгенерированной функцией OnClick, которая отрабатывает при нажатии на кнопку в уже запущенном приложении.
Впишем туда что-то типа этого:
Повторяем это дело со всеми объектами.
Теперь, сохраняем наш проект куда-нибудь.
Ну всё. Осталось только запустить этот огромный комплекс. Подключаем девайс в режиме отладки (Если уже не подключили).
Разворачиваем вот такое дерево в менеджере проектов, активируем подключённый девайс двойным нажатием левой кнопки мыши. Он должен стать жирным.
Следом, давим F9 и ждём полной сборки проекта и установки его на устройстве. Запуститься на девайсе приложение должно само.
DataSnap – платформа создания многозвенных приложений. Её история достаточно продолжительна, начиная с совсем ранних версий Delphi. Роль и значимость этой технологии/платформы изменялась в течение эволюции Delphi/C++Builder/RAD Studio, но сейчас есть ряд очевиднейших преимуществ от её использования в контексте мобильной разработки.
Внешний web-сервис REST требует наличия как-минимум такового. Можно писать самому, кто обладает достаточной компетенцией в данном вопросе. Можно пытаться делать всё «классически» через клиент-сервер. Клиент-сервер в качестве технологии передачи данных от мобильного клиента в сервер БД сразу же зажимает разработчика в определенные рамки. Прежде всего, это – занесение данных в базу посредством SQL-запроса. Но для первого приближения хочется простого, милого, доброго и доступного – нажать кнопку на мобильном приложении и увидеть «отработку» в приложении, запущенном на настольном компьютере. Давайте это и сделаем.
DataSnap сервер
В Delphi/C++Builder подобные вещи делаются интерактивно, визуально и легко (начиная с Delphi XE, когда платформа DataSnap была уже сформирована в практически готовом виде). Мы не будем «преобразовывать» этот просто VCL-desktop проект в нечто, способное реагировать на действия мобильного приложения (хотя это можно, я покажу потом как). Мы создадим новый DataSnap Server на основе VCL Forms Application. Будучи запущенным, он сыграет роль «обычного Windows-приложения на основе VCL» с несколько расширенными функциями.
Запускаем Delphi XE5/C++Builder XE5. Выполним File->New->Other… | <узел DataSnap> DataSnap Server, как показано на картинке:
Дальше пойдут окна мастера создания DataSnap Server, далее будут «правильные» скрин-шоты с небольшими пояснениями:
Мы оставим выбор «VCL Forms Application», хотя по названию двух других пунктов можно догадаться, что они означают. Да, это будет обычным VCL-приложением, которому будут добавлены функции «прослушки» обращений и реакции на обращения мобильных клиентов.
Кнопка «Next >>» явит следующее окно:
Оставим тоже всё как есть, альтернативы с протоколом понятны, а аутентификация есть предмет отдельной работы (например, здесь, также ищете по Pawel Glowacki и DataSnap). Но впоследствии можно «нагрузить» нашу связку и системой аутентификации – изобретать «велосипед» смысла большого нет. Далее есть еще и фильтры шифрования/сжатия для воздействия на передаваемый поток байтов, но это уже потом (давний материал релизов XE-XE3). Нам нужно перейти на следующую ступень (кнопка «Next>>»):
Тестируем порт (211) на предмет незанятости – успешный тест гарантирует «соединяемость» с сервером из клиентского приложения. Нажимаем «Next>>».
Здесь выбираем пункт TDSServerModule как самую «прокаченную» опцию. Можно прибедниться за счёт двух предыдущих пунктов, дабы сэкономить, но смысла большого нет. Выбираем «Finish».
Это – нормальное, обычное приложение, ему можно даже сделать какой-то вменяемый интерфейс, т.е. получить приложение, работающее самостоятельно и самодостаточно, но умеющее также выполнять некие методы, будучи вызванными извне.
Все эти «заморочки» с созданием сервера DataSnap, живущего внутри VCL-приложения, нужны, чтобы «выставить наружу» некий функционал. Технически это выглядит как добавление некоторых «странных» модулей, помимо классических Form1.pas и Form1.dfm за счет отработки мастера DataSnap Wizard (который мы только что использовали). Сохраним всё как есть, но зададим лишь другое имя проекта – DataSnapMobileServer (таким будет и результирующий exe – DataSnapMobileServer.exe). Разбираемся подробно:
Unit1.pas, Unit1.dfm – это «классика», не нуждающаяся в пояснении. Сама IDE (Delphi XE5/C++Builder XE5) по результатам работы с DataSnap Wizard (тем самым четырёхоконным мастером) выдала нам ещё парочку сладких модулей ServerContainerUnit1 и ServerMethodsUnit1.
ServerContainerUnit1 в виде визуального контейнера нам интересен будет потом, когда мы будем развивать функционал сервера в платформенной части (жизненный цикл серверных объектов, аутентификация, фильтры шифрования/сжатия и т.д.). Модуль в этом «юните» и есть главный серверный объект. Обратите внимание (в коде), что класс серверного контейнера наследуется от TDataModule, а с ним-то мы уже умеем работать! Серверный модуль – просто некий визуальный контейнер в IDE в design-time, а также определенный объект, создаваемый в runtime. В этом модуле и конфигурируется сервер приложений за счёт добавления на него определенных компонентов. Пока у нас лишь «прожиточный минимум» в виде трёх компонентов, функционал которых приблизительно ясен из названий.
ServerMethodsUnit1 вообще не блещет визуалкой, он – «пустышка». Но именно тут нам предстоит выполнить некое кодирование. Нажмем F12, войдем в редактор кода для данного модуля и увидим класс с двумя тестовыми методами:
Читайте также: