Перейти к содержанию
Fire Monkey от А до Я

Brovin Yaroslav

Администраторы
  • Постов

    2 124
  • Зарегистрирован

  • Посещение

  • Победитель дней

    390

Весь контент Brovin Yaroslav

  1. Как определить, установлено ли на телефон нужное приложение или нет?
  2. Есть два решения: Использовать встроенный в FireMonkey механизм автоматического выбора нужной формы (Для телефона или планшета) При запуске приложения определять тип устройства и создавать нужную формы вручную. Я рассмотрю первый вариант. Поскольку со вторым более менее все понятно. Первое решение основывается на понятии семейства форм. Основная идея следующая, вы определяете какие формы должны быть в вашем приложения без привязки к устройствам. Например, у вас получилось: Основная форма с данными Форма с настройками и тд То что мы перечислили в FireMonkey называется семейство форм или FormFamily. Далее вы создаете несколько форм в каждой семействе отдельно для телефона, отдельно для планшета, а отдельно для настольных систем. Далее все формы одного семейства помечаются через свойство формы TForm.FormFamily названием семейства (любой строковый идентификатор). Для каждой формы вы указываете через TForm.FormFactor на какие ориентации рассчитана каждый форма и на какие устройства, так же не забываем про размер формы на конечном устройстве. Далее приложение на основе этой информации автоматически выбирает нужную форму. Чтобы открыть нужную форму в семействе нужно использовать методы, которые по названию семейства вернут экземпляр формы Application: TApplication. function GetDeviceForm(const FormFamily: string; const FormFactor: TFormFactor): TCommonCustomForm; overload; function GetDeviceForm(const FormFamily: string): TCommonCustomForm; overload; Для ручной регистрации ваших форм в приложении используйте метод у Application: TApplication: procedure RegisterFormFamily(const AFormFamily: string; const AForms: array of TComponentClass); По умолчанию семейство главных форм называется "MainForm". Теперь то же самое, но на практике: 1. Создаем по отдельной форме для телефона и планшета. Я сделал две формы: PhoneFrm.FormPhone и TabletFrm.FormTablet. 2. Для формы телефона FormPhone указываем размеры формы через TFormFactor и в FormFactor.Devices указываем, что форма рассчитана для телефона iPhone. 3. Аналогично для формы планшета FormTablet указывает размер формы через TFormFactor и в FormFactor.Devices указываем, что форма рассчитана для планшетов iPad. 4. Для этих форм задаем название семейства форм FormFamily = "MainForm". Это название семейства по умолчанию для главной формы. Обратите внимание, что в файле проекта появились следующие строки: program MultiFormsSample; uses System.StartUpCopy, FMX.Forms, PhoneFrm in 'PhoneFrm.pas' {FormPhone}, TabletForm in 'TabletForm.pas' {FormTablet}; {$R *.res} begin Application.Initialize; Application.CreateForm(TFormPhone, FormPhone); Application.CreateForm(TFormTablet, FormTablet); Application.RegisterFormFamily('MainForm', [TFormPhone, TFormTablet]); Application.Run; end. Для нас же самое интересное это метод RegisterFormFamily, который регистрирует в системе наши формы под семейством MainForm. В момент запуска Application выберет нужную форму по заданным параметрам в FormFactor. 5. Наблюдаем результат работы под симулятором iPad и iPhone P.S. Исходники примера доступны для скачивания тут (RAD Studio XE5 Update 2):MultiFormsSample.zip
  3. Чтобы закрыть форму с выгрузкой ее из памяти, нужно сделать следующее: Повесить обработчик на событие формы TForm.OnClose. Установить переданные параметр Action в TCloseAction.caFree procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := TCloseAction.caFree; end; Doc Wiki: Releasing Forms in iOS Apps
  4. Как закрыть созданную форму? Close и free не закрывают, а только прячут.
  5. Прикрепите, пожалуйста, скриншот, чтобы было понятно, что за "обводку" вы имеете в виду.
  6. Не до конца разобрались. TListBoxItem - это обычные контролы, поэтому они так же допускают вставку других контролов друг в друга. Поэтому, чтобы добавить надпись сбоку, достаточно поместить TLabel внутрь итема, выровнить по правому краю и задать правы отступ (Margins.Right = 10). Так же для такой метки в FireMonkey предусмотрен специальный стиль "listboxitemdetaillabel". Обратите внимание, что таким образом можно разместить любой контрол. Здесь следует четко разделить два подхода: Стилизация итемов. Если у нас лист бокс содержит большое число итемов, то лучше использовать подход с созданием отдельного стиля. Поскольку при прокрутке итемов TListBox выгружает стили для итемов, которые не видны на экране и тем самым экономит память. Однако, для большого числа итемов лучше использовать TListView, так как он адаптирован и оптимизирован для работы с большим количеством итемов. В то время, как TListBox рассчитан для создания небольших меню. Непосредственное создание дополнительных контролов в итеме. Этот подход удобен в своем использовании и рекомендуется для варианта использования TListBox, как небольшое меню приложения. Например у меня по такому рецепту получился вот такой вариант:
  7. Тогда нужно сделать свой стиль в TStyleBook и задать его для этого итема. 1. Кидаем на форму TListBox и создаем итемы. Для разделения групп настроек вставляем TListBoxGroupHeader. У меня получился такой вариант: 2. Кидаем на форму TStyleBook и открываем редактор стиля, двойным кликом на TStyleBook. 3. Перетаскиваем TLayout к корню стиля в Structure и задаем название стиля как "listboxgroupheader". 4. Подключаем стиль бук в дизайнере к форме Form.StyleBook = StyleBook и задаем произвольную высоту для разделителей групп итемов. P.S. Если хотите оставить текст на разделителях, то нужно в стиль добавить контрол для вывода текст (TText или TLabel) с название стиля "text" О том, почему некоторые контролы имеют фиксированный размер написано тут: Почему для некоторых контролов нельзя поменять высоту или ширину? О том, как снять это ограничение (но не рекомендуется) написано тут: Как снять запрет изменения размера контролов
  8. В FireMonkey TListBox поддерживает несколько готовых вариантов итемов: TListBoxItem - обычный итем TListBoxHeader - общий заголовок лист бокса. TSearchBox - итем с полем поиска элементов по фильтру. TListBoxGroupHeader - заголовок группы итемов (Его можно использовать, как разделитель групп, предварительно убрав текст Text = "") TListBoxGroupFooter - подвал данных под группой итемов. Подробное руководство о том, как создавать из TListBox любой вариант UITableView очень детально описано тут: Mobile Tutorial: Using ListBox Components to Display a Table View (iOS and Android)
  9. Для мобильных устройств FireMonkey поддерживает все стандартные типы виртуальной клавиатуры (обычная, цифровая, ввод электронных адресов). Задание типа клавиатуры осуществляется через свойство: TEdit.KeyboardType. (Описание) Когда вы указываете TEdit, что он будет использовать цифровую клавиатуру, то в момент начала ввода в TEdit (установка фокуса в TEdit), появится клавиатура, выбранного типа.
  10. Ответ на этот вопрос дан здесь: [Android] Не получается увеличить высоту TProgressBar По умолчанию каждая платформа определяет свои правила построения пользовательского интерфейса. Это выражается, например, в том, что в ios и в Андроиде прогресс бар должен быть фиксированной высоты. Чтобы не нарушать руководство по проектированию пользовательских интерфейсов каждой платформы, FireMonkey принудительно запрещает менять размеры некоторых контролов. Обойти это ограничение можно, однако, не стоит забывать, что стили для мобильных платформ растровые, а значит при масштабировании будет наблюдаться потеря качества. Обратите внимание на приведенную выше ссылку в начале ответа. В ней рассказывает, как снять ограничение. Там же в конце на скриншоте приведен пример потери качества при изменении высоты.
  11. Почему в стилях андроида или йос я не могу поменять высоту для некоторых контролов. Например: TEdit, TProgressBar, TAniIndicator и другие.
  12. Приложения FireMonkey для Андроида полностью совместимы с версиями Андроид, начиная с версии 2.3 (GingerBread). Поэтому приложение, собранное с последней версии Android SDK, будет успешно работать и на всех предыдущих версия до 2.3 включительно. Однако, если вы хотите поменять используемую для сборки версию Андроид SDK, это можно сделать в настройках SDK профиля. Меню->Tools->SDK Manager (слева в дереве) Выбираем профиль SDK для андроида и в самом низу в поле SDK API-Level Location меняем путь на путь к другой версии SDK. (смотрите прикрепленный скриншот)
  13. Как в настройках среды RAD Studio XE5 указать, что проект нужно собирать с использованием другой версии Android OS?
  14. TLabel имеет стандартный механизм автоматического вычисления размеров метки на основании текста и параметров. Чтобы заставить Label автоматически менять ширину с учетом переносов, достаточно: Label1.AutoSize := True; Label1.WordWrap := True; Ниже приведены результаты работы этого способа при изменении ширины формы и автоматически выравненной меткой по верхнему краю Align := TAlignLayout.alTop;
  15. uses FMX.Helpers.iOS, iOSapi.Foundation function OpenURL(const AUrl: string): Boolean; var Url: NSURL; begin Url := TNSUrl.Wrap(TNSUrl.OCClass.URLWithString(NSStr(AUrl))); Result := SharedApplication.openUrl(Url); end;
  16. Судя по этому вопросу, вы не понимаете в принципе, как организована работа с видео где-либо. Поэтому, глядя на другие приложения, задаете этот вопрос. Нужно понимать следующее: Видео - это файл, который либо непосредственно воспроизводится в проигрывателе, например, в компоненте TMediaPlayer, либо отправляется по сети в виде потока. Опять же в проигрыватель. Поэтому "вставить видео" уже странно. YouTube - это веб сервис, который позволяет пользователям просматривать видео файлы, располагаемые на серверах Гугла. Я не знаю способ доставки видео, это может быть как и потоковая передача файла целиком, или же передача только по кадрам. Видео не встраивают и не вставляют. Встраивают видео проигрыватель, который уже воспроизводит файл. На основании этого уже о вашей задаче: Вы показываете в лист боксе картинку TImage, в котором отображаете скриншот видео плеера или же кадр видео. Затем по нажатию на картинку, вы либо открываете видео плеер и воспроизводите соответственный видео файл. Либо встраиваете проигрыватель прямо в лист бокс и там же опять же воспроизводите видео. Ответы на вопросы использования сервиса YouTube для получения видео файлов нужно искать на сайте YouTube в разделе для разработчиков. P.S. Просьба, подробнее расписывать ваш вопрос, прикладывать скриншоты для демонстрации достигаемого результата.
  17. Стандартный браузер определяет сам пользователь в системе, поэтому это не обязательно будет Safari. Обязательно указывайте платформу на которой нужно достичь данного действия.
  18. Русский За управление виртуальной клавиатурой в FireMonkey отвечает сервис IFMXVirtualKeyboardService (Embarcadero Doc Wiki). Который позволяет отображать и скрывать клавиатуру. Для скрытия клавиатуры достаточно выполнить следующий код: uses FMX.Platform, FMX.VirtualKeyboard; procedure TForm5.ButtonHideKeybordClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Запрашиваем сервис виртуальной клавиатуры if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.HideVirtualKeyboard; end; Чтобы показать клавиатуру для контрола: procedure TForm5.ButtonShowKeyboardClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Запрашиваем сервис виртуальной клавиатуры if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.ShowVirtualKeyboard(Edit1); end; English FireMonkey has special service for managing Virtual Keyboard. It is IFMXVirtualKeyboardService (Embarcadero Doc Wiki). It allows show and hide keyboard. For showing virtual keyboard use next code: uses FMX.Platform, FMX.VirtualKeyboard; procedure TForm5.ButtonHideKeybordClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Request service of visrtual keyboard if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.HideVirtualKeyboard; end; For showing virtual keyboard for control: procedure TForm5.ButtonShowKeyboardClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Request service of visrtual keyboard if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.ShowVirtualKeyboard(Edit1); end;
  19. Редактор не позволяет вставлять ссылки с участием file:/
  20. Из предполагаемых вариантов действий для устранения ошибки: Четко указать системе тип данных "text/html", тем самым выявив наше намерение, что нужно отправить запрос программе, которая умеет обрабатывать данные именно этого типа. OpenLinkIntent.setType(StringToJString('text/html')); Еще советуют убрать один слэш из трех после "file:" Или попробовать варианты, которые есть на StackOverflow: http://stackoverflow.com/questions/7009452/how-to-launch-browser-to-open-local-file
  21. Попробуйте добавить категорию для интента перед стартом активити: OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);
  22. Открытие ссылки под Андроид: uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText; function OpenURL(const AUrl: string): Boolean; var Uri: Jnet_Uri; OpenLinkIntent: JIntent; begin Uri := StrToJURI(AUrl); // Формируем намерение об открытии ссылки Uri в стандартном браузере OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); // Устанавливаем тип данных OpenLinkIntent.setType(StringToJString('text/html')); // Задаем категорию активити, который будет открывать нашу страницу. OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE); // Запускаем приложение и передаем ему наше намерение SharedActivity.startActivity(OpenLinkIntent); end; А чтобы открыть файл, нужно сформировать урл AUrl в виде: "file:/ //tmp/android.txt" (убрать пробелы) Согласно принятому стандарту оформления ссылок.
  23. Процесс добавления итема дорогостоящая операция. Так как после добавления итема идет операция выравнивания контента. И так происходит с каждым новым добавляемым TListBoxItem. Однако, у каждого контрола есть два метода, которые позволяют избежать лишних вызовов и ускорить процесс добавления дочерних объектов - TControl.BeginUpdate и TControl.EndUpdate. Решение простое, перед тем, как добавлять итем в листбокс, нужно вызывать метод BeginUpdate. А по окончании добавления всех итемов - EndUpdate. var I: Integer; ListItem: TListBoxItem; begin ListBox1.BeginUpdate; try for I := 0 to 1000 do begin ListItem := TListBoxItem.Create(Self); ListItem.Parent := ListBox1; ListItem.Text := I.ToString; end; finally ListBox1.EndUpdate; end; end;
  24. По умолчанию, каждая платформа определяет свои правила оформления пользовательского интерфейса, согласно Руководству пользовательского интерфейса Андроида TProgressBar не может быть по высоте другого размера. Поэтому стиль андроид платформы в Firemonkey запрещает изменять высоту некоторых контролов, в том числе TProgressBar. Аналогичная ситуация в Eclipse для андроида. Там также нельзя менять для этого компонента его высоту. Фиксация размера происходит путем сохранения в стиле свойств FixedHeight и FixedWidth (не доступного в дизайнере). Если эти свойства больше 0, значит контрол будет иметь фиксированный размер. Решение Если вы вдруг захотели нарушить стандарты, рекомендованные Google по оформлению UI, вы можете сделать следующее: 1. Открыть BitmapStyleDesigner (находится в папке bin студии bin\BitmapStyleDesigner.exe) 2. В выпадающем списке первой кнопки на панели инструментов Создать новый стиль (светлый или темный) для платформы андроид. Редактор автоматически создаст вам стандартный стиль для андроида. 3. Сохранить стиль для Firemonkey. В диалоге сохранения выбрать тип файла "FireMonkey Style (*.style)" 4. Открыть сохраненный файл стиля в текстовом редакторе и найти в нем стиль TProgressBar - "progressbarstyle". 5. Удалить из стиля строчку: FixedHeight = 10 6. Сохранить стиль и загрузить файл стиля в TStyleBook. Теперь для TProgressBar можно менять высоту. Однако, учтите, что стили для Андроид и iOS растровые. Это значит, что при растровое исходное изображение прогресс бара рассчитано на высоту в 10 пикселей и при увеличении высоты, вы потеряете качество отрисовки прогресс бара (смотрите рисунок выше).
×
×
  • Создать...