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

Brovin Yaroslav

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

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

  • Посещение

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

    390

Активность репутации

  1. Like
    Brovin Yaroslav отреагировална 97mik в Ошибка при деплое: Не возможно запустить процесс приложения   
    При развертывании приложения PAServer выдаёт ошибку:
     
     

    Имя пользователя Windows сначала было русское, а потом переименовал на англ. Имя подключения английское. Имя проекта английское.
  2. Like
    Brovin Yaroslav получил реакцию от PowerOwl в Правила публикации сообщений на этом форуме   
    За постоянное нарушение этих правил пользователь может быть забанен, в том числе по адресу IP.Если тема оформлена не правильно, то она будет закрыта.

    1. Общие правила
    Перед тем как создать тему по вашему вопросу, воспользуйтесь поиском по форуму. Форум рассчитан на консультирования применения FireMonkey, решения прикладных задач с использованием FireMonkey.  Запрещено публиковать найденные ошибки. Для публикации и решения вопросов ошибок FMX существует специальный ресурс Embarcadero Quality Central. Запрещается обсуждение вопросов не связанных с разработкой и FireMonkey Запрещается использовать нецензурные выражения в тексте и заголовке сообщений 2. Создание темы
    Одна тема — один вопрос. Два вопроса в одной теме задавать запрещено. Запрещено создавать несколько тем для одного вопроса. Тема должна быть размещена в наиболее подходящем для нее по смыслу разделе. Если такового не имеется, то размещать тему на свое усмотрение. 2.1 Каким должен быть заголовок темы?
    Вопрос должен быть сформулирован в заголовке темы. Заголовок темы должен содержать не менее 4 слов. Заголовок темы должен формулировать вопрос как можно подробнее. 2.2. Каким должен быть текст вопроса?
    Текст вопроса нужно начать с указания используемой версии RAD Studio, Версии ОС и модель устройства (если речь идет о мобильной разработке) Текст темы должен максимально подробно описывать суть вопроса. Текст темы должен по возможности содержать иллюстрации.  Иллюстрации должны быть не от балды, а иллюстрировать текущее состояние вопроса: то есть, наглядно показывать факт существования описанного поведения. Если ваш вопрос касается конкретного случая разработки, нужно прикрепить проект (только исходные коды в zip архиве) к сообщению. Вставляя код в текст темы, позаботьтесь о том, чтобы он соответствовал стандарту «Руководство по оформлению кода на Pascal» (это можно сделать, при помощи средств автоматического форматирования кода, которые есть в RAD Studio Edit -> Format Source или Ctrl + D), а также не забудьте использовать тег «Код» при оформлении кода в сообщении. 3. Ответы в темы
    Задавать свой вопрос в чужой теме можно только в случае если ваш вопрос совпадает с вопросом в теме. Отвечать можно на любые темы. При ответе старайтесь подробно описывать решение вопроса. Избегайте лишних сообщений не касающихся решения вопроса.
  3. Like
    Brovin Yaroslav отреагировална Sergionn в Как определить, какая канва сейчас используется в FireMonkey?   
    Canvas.ClassName:
    будет: TCanvasGPU, TCanvasGDIPlus, TCanvas2D  итд.
  4. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Как использовать иконки разного качества для экранов с разным DPI?   
    Вариант с заданием картинки через IBitmapLink нельзя использовать.
  5. Like
    Brovin Yaroslav получил реакцию от neohost в Проигрывание внутренних ресурсов приложения.   
    Этот способ, как и в Windows подразумевает встраивание ресурсов прямо в исполняемый файл приложения. Поэтому при установки на устройство, как вы понимаете, ресурс останется в исполняемом файле. Чтобы ресурс распаковался в виде файла, нужно использовать способ с Deployment Manager по этому руководству: Включение своих файлов в приложение Без распаковки отдельным файлом стандартными средствами никак. Если это и возможно, то только при помощи низкоуровневого кодирования с использованием Android API. Поскольку, судя по описанию используемого JMediaPlayer в Android API (MediaPlayer), он не умеет читать из кастомного потока. Если же вопрос встраивания медиа ресурсов в приложение важно для вас, то либо распаковка файла либо долгие и мучительные поиски решения. Поскольку так в большинстве случаев не делают. Поскольку сам формат андроид приложения подразумеваем хранение всех ресурсов отдельно.
  6. Like
    Brovin Yaroslav отреагировална Sergionn в В DesignTime на форме появляются артефакты   
    Для топикастера: вариант "лечения" в панели управления Nvidia выставить для всей системы или конкретно для Delphi и программы режим.
    Предпочтительный графический процессор - или Автовыбор или Интегрированное графическое оборудование.
     
    Эта песня с непрорисовкой имеет место быть в ноутбуках с гибридными  видеосистемами Nvidia. Тянется с xe2, в qc писал с 2011 - 0 реакции. Режим direct2d, при переключении на gdi+ моргание уходит, но появляются другие "радости".
    Также в самой ide тоже работать нельзя. Это касается HD типа приложения, в 3D канва иногда просто непрорисовывается при размещение контролов на TLayer3d - также постил в qc - бестолку.
    И это только самые поверхностные (есть еще!) неисправленные баги на отдельно взятой системе, боюсь представить какие будут на других.
  7. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Проигрывание внутренних ресурсов приложения.   
    Этот способ, как и в Windows подразумевает встраивание ресурсов прямо в исполняемый файл приложения. Поэтому при установки на устройство, как вы понимаете, ресурс останется в исполняемом файле. Чтобы ресурс распаковался в виде файла, нужно использовать способ с Deployment Manager по этому руководству: Включение своих файлов в приложение Без распаковки отдельным файлом стандартными средствами никак. Если это и возможно, то только при помощи низкоуровневого кодирования с использованием Android API. Поскольку, судя по описанию используемого JMediaPlayer в Android API (MediaPlayer), он не умеет читать из кастомного потока. Если же вопрос встраивания медиа ресурсов в приложение важно для вас, то либо распаковка файла либо долгие и мучительные поиски решения. Поскольку так в большинстве случаев не делают. Поскольку сам формат андроид приложения подразумеваем хранение всех ресурсов отдельно.
  8. Like
    Brovin Yaroslav отреагировална Andrey Efimov в Проигрывание внутренних ресурсов приложения.   
    Точно конечно не могу сказать, но если мы не можем обратиться к запакованному файлу (в ресурсы приложение) просто указав путь до файла, то напрашивается вывод, что все запакованные таким образом файлы (картинки, звуки) не распаковываются (автоматически). Судя по справке TMediaPlayer, я не вижу варианта проигрывания музыки прямо из ресурсов, т.е. перед проигрыванием придётся извлечь запись и вставить путь в TMediaPlayer.FileName.
  9. Like
    Brovin Yaroslav получил реакцию от Вадим Шавров в Где взять стандартный стиль в FireMonkey для iOS и Android, используемый по умолчанию?   
    Хороший вопрос.
     
    Не все знают, что в RAD Studio XE5 входит дизайнер растровых стилей для VCL (BitmapStyleDesigner), который также позволяет автоматически создавать стили для FireMonkey. Этот дизайнер находится в папке Bin/bitmapStyleDesigner.exe и содержит внутри себя автоматическую конвертацию любого VCL стиля в FireMonkey. 

    Этот дизайнер также предназначен для внесения правок в стандартные системные стили андроида и йос.
     
    Чтобы получить системный стиль Android Dark, Android Light, iOS, iOS 7 нужно:
     
    1. Выбрать дефолтный требуемый стиль: 

    2. Сохранить стиль как стиль FireMonkey:

     
    А дальше использовать файл стиля в своих приложениях.
  10. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Как использовать иконки разного качества для экранов с разным DPI?   
    Завтра все равно попробую с IBitmapLink.
     
    Так как это работает намного быстрее, при таком подходе картинка существует в одном экземпляре и используется во всех итемах.
  11. Like
    Brovin Yaroslav отреагировална Andrey Efimov в Как использовать иконки разного качества для экранов с разным DPI?   
    Ошибка была из-за прошлых экспериментов со стилями, забыл очистить свойство формы StyleBook.
     
    Про этот способ ItemTmp.ItemData.Bitmap.Assign знаю, уже попробовал, не хочет подгружать картинки и всё. Надо попробовать на чистом приложении.
     
    p.s. Ярослав, спасибо вам за помощь и терпение!
     
    UPD.(2:32) Точно надо было идти спать... Нашёл свой косяк. У меня было TImage.StyleName:='folders', а запрашивал я 'folder'. Картинки не грузит… Всё я спать, лучше завтра со свежей головой разберусь с этим. Ещё раз спасибо!
    UPD.2.(2:36) Понял в чём косяк, ваш код отказывается у меня работать, а именно сточка (ItemTmp.ItemData.Bitmap as IBitmapLink).SetResourceBitmap(BitmapCloud);, получилось с ItemTmp.ItemData.Bitmap.Assign.
  12. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Как использовать иконки разного качества для экранов с разным DPI?   
    Что за ошибка? Можно использовать ItemTmp.ItemData.Bitmap.Assign вместо варианта с IBitmapLink Вопрос про дефолтный стиль оформите отдельной темой.
  13. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Как использовать иконки разного качества для экранов с разным DPI?   
    Здесь есть много решений. Но я приведу на мой взгляд самый оптимальный вариант по простоте и производительности с использованием TStyleBook в качестве TImageList.
     
    Основное нововведение для изображений в мобильных платформах - это использование экранов разной плотности пикселей. Что приводит к тому, что одно и тоже изображение на разных (с разным dpi) экранах имеет разные физические размеры. Подробнее об этом можно прочитать тут: Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey . Если коротко, то это значит, чтобы картинка была четкой на всех экранах нам нужно иметь в своем наборе несколько вариантов этой картинки для основных типов экранов (слева класс экрана - справа коэффициент масштабирования):
    MDPI - 1X HDPI - 1,5X XHDPI - 2X XXHDPI - 3X Например, если у нас есть картинка 48х48 точек для обычного экрана (MDPI - 1X), то нам нужно по хорошему иметь еще три варианта этой картинки других размеров:

    Иначе, картинка или будет сжата, или растянута, что приведет к потере ее качества. Вариант загрузки одного большого изображения не хорош тем, что автоматическое сжатие изображение влечет за собой потерю качества, обычно выраженную в размытии картинки. Попробуйте вручную уменьшать размер изображения, и вы увидите, что в конечном итоге картинка будет либо размытой, либо искаженной в зависимости от алгоритма сжатия. Поэтому как раз и предлагается иметь несколько вариантов исходной картинки, адаптированной под разные варианты экраны.
     
    Теперь на практике. FireMonkey специально для мобильных платформ поддерживает задание нескольких вариантов качества (dpi) одного изображения. Для этого в FireMonkey существует специальный класс TMultiResBitmap (Using Multi-Resolution Bitmaps). Который позволяет указать картинки для разных Scale. Он автоматически вернет картинку нужного качества для текущего устройства. Этот класс используется в TImage. 
     
    1. Делаем форму с лист боксом:

     
    2. Создаем на основе TStyleBook хранилище картинок TImageList по руководству, представленному здесь: Есть ли в fmx класс TImageList?
     
    3. Загружаем для каждой TImage несколько вариантов одного и того же изображения (MultiResBitmap Editor):

     
    4. Далее в режиме выполнения, запрашиваем картинку у ImageBook: TStyleBook. Обратите внимание, что при запросе картинке через TImage.Bitmap - этот метод вернет битмап нужного dpi.
    function TForm5.GetImage(const AImageName: string): TBitmap; var StyleObject: TFmxObject; Image: TImage; begin StyleObject := ImageBook.Style.FindStyleResource(AImageName); if (StyleObject <> nil) and (StyleObject is TImage) then begin Image := StyleObject as TImage; // Здесь мы получим картинку нужного dpi (Scale) Result := Image.Bitmap; end else Result := nil; end; 4. Используя полученную картинку присваиваем ее TListBoxItem:
    const COUNT_ITEMS = 10; var ItemTmp: TListBoxItem; BitmapCloud: TBitmap; I: Integer begin BitmapCloud := GetImage('cloud'); ListBox.BeginUpdate; try ListBox.Clear; for I := 1 to COUNT_ITEMS do begin ItemTmp := TListBoxItem.Create(Self); ItemTmp.Parent := ListBox; ItemTmp.Text := 'Item' + I.ToString; if BitmapCloud <> nil then ItemTmp.ItemData.Bitmap.Assign(BitmapCloud); end; finally ListBox.EndUpdate; end; end; P.S. На устройстве не проверял, но код должен работать. Чуть позже проверю на Nexus 4.
     
    Полезные ссылки
    Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey Есть ли в fmx класс TImageList? Using Multi-Resolution Bitmaps MultiResBitmap Editor
  14. Like
    Brovin Yaroslav получил реакцию от Pavel Vasilev в Есть ли в fmx класс TImageList?   
    На данный момент (до версии RAD Studio XE5) FireMonkey не имеет компонент TImageList.
    Однако, для хранения графических ресурсов отлично подходит TStyleBook. Общая идея сводится к добавлению именованных графических ресурсов в TStyleBook в контейнере TImage. Затем мы каждому TImage задаем имя через StyleName. И затем в нашем коде уже по строковому идентификатору достаем нужную картинку.
     
    Рассмотрим теперь это на практике.
    Создадим приложение, которое будет вытаскивать картинку по имени из TStyleBook и отображать его в контейнере TImage.
     
    1. Создаем TStyleBook. Перетаскиваем его палитры компонентов (Tool Palette) в дизайнере на форму. Так же на форме я разметил кнопку и TImage для отображения выбранного изображения.

     
    2. Открываем дизайнер стилей и добавляем компонент TImage, путем перетаскивания TImage в корень Structure Panel (панель с деревом компонентов формы).

     
    3. В TImage загружаем картинку и называем картинку через TImage.StyleName. В моем случае изображение андроида и название  - 'android'. 


     
    4. Обратите внимание, что RAD Studio XE5 поддерживает картинки разного dpi для четкой отображения на экранах с разными dpi и Экранным масштабом (Scale). На рисунке выше, я загрузил два разрешения картинки, для обычных экранов, и экранов с удвоенной плотностью пикселей. Это актуально для мобильных платформ и OSX с экранами ретина.
     
    5. Пишем метод, который вытащить картинку по имени:
    function TForm4.GetImage(const AImageName: string): TBitmap; var StyleObject: TFmxObject; Image: TImage; begin StyleObject := ImageBook.Style.FindStyleResource(AImageName); if (StyleObject <> nil) and (StyleObject is TImage) then begin Image := StyleObject as TImage; Result := Image.Bitmap; end else Result := nil; end; Каждый объект FireMonkey TFmxObject предоставляет способ для поиска среди дочерних объектов объект с указанными именем StyleLookup. Доступ к корню всех стилей в StyleBook  является свойство TStyleBook.Style. Далее ищем у корня стиль с нужным именем картинки. Если стиля нету, то метод вернет nil. Иначе проверяем, что стиль есть и он экземпляр контейнера TImage. Далее просто выбираем картинку через свойство Bitmap.
     
    6. Вытаскиваем картинку и отображаем ее в TImage на форме.
    procedure TForm4.Button1Click(Sender: TObject); var Bitmap: TBitmap; begin Bitmap := GetImage('android'); if Bitmap <> nil then Image1.Bitmap.Assign(Bitmap); end; Вот в принципе и вся идея. Эту идею можно обобщить, сделав отдельный компонент с быстрой загрузкой картинок. Но это уже практика.
     
    Пример можно скачать тут: ImageBook.zip
  15. Like
    Brovin Yaroslav получил реакцию от Tom1984 в Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey   
    Введение
    Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
     
    Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:

     
    Для разработчика это могло означать, что интерфейс привязанный к разрешению 320х480 на Retina экране будет занимать только четверть экрана. Естественно, что использование разрешения экрана в физических координатах не удобно с этой точки зрения. Именно по этому появились логические координаты, которые гарантируют, что тот же пользовательский интерфейс для iPhone 3, будет иметь такие же размеры (физические) и на экране с ретиной.
     
    FireMonkey работает в логических координатах. Это означает, что на iPhone 3 - 4 мы работаем с логическим разрешением 320x480 точек. Однако, при отображении интерфейса на iPhone 4 c (с двойной плотностью пикселей по сравнению с iPhone 3), интерфейс автоматически масштабируется на физическое разрешение 640х960 с коэффициентом масштабирования равным 2. 
     
    Практика
    Теперь посмотрим, как получить всю эту информацию. Вся информация об экране (логический размер и коэффициент масштабирования) находится в сервисе IFMXScreenService. 
    Чтобы получить физическое разрешение экрана, нужно логический размер умножить на коэффициент масштабирования.
     
    Код ниже показывает, как получить доступ к этому сервису и извлечь требуемые параметры:
    var ScreenService: IFMXScreenService; LogicScreenSize: TPoint; ScreenScale: Single; begin // Запрашиваем сервис экрана, для получения информации о размере и текущем коэффициенте масштабирования if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin LogicScreenSize := ScreenService.GetScreenSize.Round; ScreenScale := ScreenService.GetScreenScale; LabelLogicScreenSize.Text := Format('Логический размер: %d, %d', [LogicScreenSize.X, LogicScreenSize.Y]); LabelPhysicScreenSize.Text := Format('Физический размер: %f, %f', [LogicScreenSize.X * ScreenScale, LogicScreenSize.Y * ScreenScale]); LabelScreenScale.Text := Format('Коэффициент масштабирования: %f',[ScreenService.GetScreenScale]); end; end; Результат кода приведен на снимке экранов ниже для iPad устройств с ретиной экраном и без:

  16. Like
    Brovin Yaroslav отреагировална Andrey Efimov в Задаем отступ между картинкой и текстом в TListBoxItem   
    Вопрос решил! Не знаю, как я мог забыть про стили… Прошу прощения за такой простой вопрос(Мне стыдно   )
     
    Всем у кого появился подобный вопрос, загружаете через «TStyleBook» свой стиль, далее редактируете его, находим ListBox (listboxitemnodetail), открываем ветку и находим «area:Tlayout->Text», чтобы редактировать отступ, выберите свойство Margins и редактируйте.
     
    P.S. Тему наверно можно удалять или …

  17. Like
    Brovin Yaroslav получил реакцию от Andrey Efimov в Автоматический переход на вторую строку TLabel   
    Да, согласен.
     
    На XE5 Update 2 наблюдается, описанное вами поведение. На текущий момент это уже исправлено. Поэтому предлагаю для XE5 программное решение этой задачи:
    procedure TForm1.FormCreate(Sender: TObject); begin FTextLyout := TTextLayoutManager.DefaultTextLayout.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(FTextLyout); end; procedure TForm1.Label1Resize(Sender: TObject); var LabelTmp: TLabel; begin if Sender is TLabel then begin LabelTmp := Sender as TLabel; FTextLyout.BeginUpdate; try FTextLyout.Text := LabelTmp.Text; FTextLyout.MaxSize := TPointF.Create(LabelTmp.Width, 1000); FTextLyout.WordWrap := LabelTmp.WordWrap; FTextLyout.Font := LabelTmp.Font; FTextLyout.HorizontalAlign := LabelTmp.TextAlign; FTextLyout.VerticalAlign := LabelTmp.VertTextAlign; finally FTextLyout.EndUpdate; end; LabelTmp.Height := FTextLyout.Height; end; end; Основная идея следующая: мы используем TTextLayout и параметры метки для вычисления размера текста в TLabel. На основании этого задаем новую высоту для метки.
     
    Обратите внимание, что в этом примере все метки выравнены по верхнему и нижнему краю. Поэтому ширину для текста я указываю равной ширине метки. Если вам нужно вычислить ширину текста, то нужно задавать тогда высоту.
     
    Событие TLabel.Label1Resize нужно задать событию OnResize у меток, где вы хотите автоматически вычислять высоту метки.
     
    Рабочий пример можно скачать тут: LabelAutosizeDemo.zip
  18. Like
    Brovin Yaroslav отреагировална Andrey Efimov в Автоматический переход на вторую строку TLabel   
    Если выставить:
    Label1.Align := alTop;  Label1.AutoSize := True;  Label1.WordWrap := True; то при компиляции под андроид, Label1.WordWrap := True; автоматически превращается в Label1.WordWrap := False; и перенос не работает.
  19. Like
    Brovin Yaroslav получил реакцию от Ingalime в Средства логирования в FireMonkey   
    RAD Studio XE5 предоставляет несколько способов логирования под платформы Андроид и iOS. Давайте их рассмотрим:
    Встроенный в FIreMonkey механизм логирования (кроссплатформенный). Использование системных функция каждой платформы для логирования Использование файлов для вывода логов. Использование сети для передачи сообщений лога 1. Встроенный механизм логирования
    FireMonkey содержит специальный класс FMX.Types.Log для осуществления логирования на всех платформах.
    Этот класс использует на каждой платформе системные средства вывода лога.
    Log = class abstract public class procedure d(const Msg: String); overload; class procedure d(const Fmt: String; const Args: array of const); overload; class procedure d(const Tag: String; const Instance : TObject; const Msg : String); overload; class procedure d(const Tag: String; const Instance : TObject; const Method : String; const Msg : String); overload; class procedure TimeStamp(const Msg: String); overload; class function ObjToString(const Instance : TObject) : String; class function ArrayToString(const AArray : TEnumerable<TFmxObject>) : String; overload; class function ArrayToString(const AArray : TEnumerable<TFmxObject>; MakeStr : ToStringFunc) : String; overload; class procedure DumpFmxObject(const O: TFmxObject; Nest: Integer = 0); end; Он предоставляет довольно много методов по вывода лога. 
    Чтобы его использовать достаточно вызвать любой нужный классовый метод. Например в моем приложении по нажатию на кнопку я буду выводить сообщение: "Log message from FireMonkey application"
    procedure TFormPhone.Button1Click(Sender: TObject); begin Log.d('Log message from FireMonkey application'); end; Далее нужно понять, куда будет выведено это сообщение.
     
    1.1. Андроид
    Под андроид это сообщение попадает в системный журнал. Прочитать его можно в утилите Андроида LogCat - это специальная утилита для просмотра системного лога. Ее можно запустить двумя способами:
    C GUI оболочкой Из командной оболочки (консольный вариант). Первый способ (с GUI). В Eclipse с Android SDK открыть Window->ShowView->LogCat. Откроется окно с GUI интерфейсом, в котором вы сможете увидеть все сообщения, которые отправляют все приложения на телефоне. Стоит отметить, что это вариант LogCat в эклипсе содержит ряд полезных функций по фильтрации лога и его управлению. Поэтому я предпочитаю этот способ, нежели использовать консольный вариант этой же утилиты. Сразу же перед использования советую полностью очистить текущий журнал логов телефона, так как он вначале будет содержать огромное количество сообщений. Для очистки нажмите кнопку очистки лога в окне (кнопка с листком и красным крестиком).

     
    Второй способ (консольный режим). Второй вариант запуска утилиты LogCat заключается в вызове утилиты из командной строки. Утилита просмотра журналов логов входит в общую утилиту ADB.exe. Чтобы запустить лог изз командой строки воспользуйтесь следующей командой:
    .\sdk\platform-tools\adb.exe logcat Утилита лежит в папке platform-tools Android SDK. В вашем случае вы должны указать свой путь к этому файлу. Ключ logcat запускает просмотр журнала логирования.
    Так же как и в первом варианте я советую предварительно очистить лог вызвав logcat с ключом -c:
    .\sdk\platform-tools\adb.exe logcat -с Описание всех ключей утилиты logcat: logcat
    После того, как мы открыли Logcat любым из предложенных способов, запускаем нашу программу и смотрим сообщение в логе:

     
    1.2 Йос
    В йос лог попадает в два журнала в зависимости от того, где вы запускаете свою программу (Симулятор или устройство).
     
    iOS Симулятор. Открываем журнал лога в меню симулятора Отладка->Открыть системный журнал...
     
     
    iOS устройство. Открываем XCode Органайзер и выбираем вкладку Console у вашего устройства.

     
    2. Использование системных функций логирования
    Для тех, кто по каким-то причинам не хочет использовать FireMonkey для этих целей может использовать на каждой платформе системные функции логирования.
     
    2.1 Андроид
    Для андроида в Delphi предусмотрены системные функции из Androidapi.Log:
    { Helper functions } function LOGI(Text: MarshaledAString): Integer; function LOGW(Text: MarshaledAString): Integer; function LOGE(Text: MarshaledAString): Integer; function LOGF(Text: MarshaledAString): Integer;  Каждая из которых выводит сообщение с указанным типом (I - информационное сообщение, W - предупреждение, E - ошибка, F - фатальная ошибка)
     
    2.2 iOS
    В IOS вы можете использовать системную функцию iOSapi.Foundation.NSLog.
    procedure NSLog(format: PNSString); cdecl; varargs; external libFoundation name _PU + 'NSLog'; 3. Логирование в файл
    Является самым стандартным средством. Для его использования вы можете использовать стандартные способы работы с текстовыми файлами, которые полностью работают на всех платформах.
     
    4. Логирование по сети
    Этот способ так же имеет место быть и заключается в создании простого TCP клиента на стороне вашего приложения и FTP сервера на Windows. С приложения вы просто шлете на указанный адрес сервера сообщения, а на стороне сервера просто отображаете. Для этих целей можно использовать стандартные Indy компоненты. 
  20. Like
    Brovin Yaroslav получил реакцию от 97mik в Как сделать промежутки между подгруппами итемов?   
    Тогда нужно сделать свой стиль в TStyleBook и задать его для этого итема.
    1. Кидаем на форму TListBox и создаем итемы. Для разделения групп настроек вставляем TListBoxGroupHeader. У меня получился такой вариант:

    2. Кидаем на форму TStyleBook и открываем редактор стиля, двойным кликом на TStyleBook.
    3. Перетаскиваем TLayout к корню стиля в Structure и задаем название стиля как "listboxgroupheader".

    4. Подключаем стиль бук в дизайнере к форме Form.StyleBook = StyleBook и задаем произвольную высоту для разделителей групп итемов.

     
    P.S. Если хотите оставить текст на разделителях, то нужно в стиль добавить контрол для вывода текст (TText или TLabel) с название стиля "text"
    О том, почему некоторые контролы имеют фиксированный размер написано тут: Почему для некоторых контролов нельзя поменять высоту или ширину? О том, как снять это ограничение (но не рекомендуется) написано тут: Как снять запрет изменения размера контролов
  21. Thanks
    Brovin Yaroslav получил реакцию от Мирзали Пирмагомедов в Как я могу скрыть / показать клавиатуру под "Android"?   
    Русский
    За управление виртуальной клавиатурой в 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;
  22. Like
    Brovin Yaroslav отреагировална la_coste в [Android] Открытие HTML страницы в браузере по умолчанию   
    uses  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.Net;   procedure TForm1.Button3Click(Sender: TObject); var   OpenLinkIntent: JIntent; begin OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW); OpenLinkIntent.setDataAndType(StrToJURI('file: ///sdcard/inhk.files/index.html'), StringToJString('text/html')); SharedActivity.startActivity(OpenLinkIntent); end; Именно) 
     
    Вот такой код получился
     
    Написал строчку в прошлом посте, почему то не отобразилась.
  23. Like
    Brovin Yaroslav получил реакцию от la_coste в [Android] Открытие HTML страницы в браузере по умолчанию   
    Из предполагаемых вариантов действий для устранения ошибки:
     
    Четко указать системе тип данных "text/html", тем самым выявив наше намерение, что нужно отправить запрос программе, которая умеет обрабатывать данные именно этого типа.
    OpenLinkIntent.setType(StringToJString('text/html')); Еще советуют убрать один слэш из трех после "file:"
     
    Или попробовать варианты, которые есть на StackOverflow: http://stackoverflow.com/questions/7009452/how-to-launch-browser-to-open-local-file
  24. Like
    Brovin Yaroslav получил реакцию от Barbanel в Можно ли уменьшить размер приложения для андроида?   
    Если говорить о размере приложения. То первоначально нужно понять, что входить в состав пакета? Затем определить, что нужно и не нужно?
     
    Давайте посмотрим на примере состав пакета небольшого Андроида приложения, написанного в RAD Studio XE5 Delphi. В качестве примера, я взял приложение PhotoEditorDemo, доступный на официальном Open Source проекте примеров RAD Studio XE5
     
    Это пример кроссплатформенного простого фоторедактора:
    Описание примера: http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMX.Mobile.PhotoEditorDemo_Sample_(Delphi) Исходники: http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE5_Update/FireMonkeyMobile/Delphi/PhotoEditorDemo/ Размер сжатого приложения
    Собираем приложение и смотрим на результирующий пакет PhotoEditorDemo.apk (Он располагается в директории .\Android\Debug\PhotoEditorDemo\bin относительно корня проекта).
     
    После сборки приложения его размер ~6 760 КБ (в зависимости от Debug or Release сборки). Это размер сжатого пакета нативного приложения.
     
    Размер распакованного приложения
    Если мы распакуем ZIP архиватором этот файл, то увидим его содержание:

    В распакованном виде, пакет занимает 21,7 МБ.
     
    Состав пакета
    Что же входит в его состав:
    lib - место хранения собранных натиных библиотек приложения. Поскольку приложение нативное, то оно работает на основании библиотеки .so. res - место хранения ресурсов приложения (картинки, иконки и тд) META-INF - хранение подписи приложения, контрольные суммы файлов ресурсов (картинок, звуков и т.д.) AndroidManifest.xml - манифест приложения (расширенный аналог VersionInfo в Windows) classes.dex - файл с java реализацией дополнительного функционала FireMonkey. resources.arsc - таблица ресурсов. В этом файле собраны xml-описания всех ресурсов. Самый значительный вклад в размер пакета вносят:
    libPhotoEditorDemo.so (20 060 КБ) - непосредственно сам бинарник приложения classes.dex (1 948 КБ) - частичная реализация FireMonkey на java. Размер самого приложения большой потому, что включает в себя полностью все Delphi библиотеки, которые используется FireMonkey. А это:
    RTL Хедеры для доступа к Android API Нативные стили для Android (три стиля - 1х, 1.5x, 2х, 3х скалирования экрана). Каждый стиль содержит исходную png картинку нативного стиля. Фильтры и эффекты FireMonkey Вся остальная реализация FireMonkey. Довольно большой набор того, что нужно включить в пакет и тяжело выбросить.
     
    Если говорить о приложении написанном в Eclipse, то приложение включает в себя только часть пользовательского кода. И размер мал за счет того, что весь Android API находится перманентно на самом устройстве (не в пакете).
     
    Если бы используемая часть библиотек FireMonkey находилась на каждом устройстве, то размер приложения сократился бы раза в четыре. 
     
    Вывод
    Размер установочного пакета приложения, написанного на FireMonkey не большой для нативных приложений порядка 6 760 КБ для реализации простого фоторедактора (Хотя для кого-то это может быть много). В установленном виде приложение занимает от 20 000 КБ. Основная причина полная интеграция используемых библиотек в пакет приложения. Вероятность уменьшить этот размер маловероятна. Однако увеличение функционала приложения не так сказывается на дальнейший рост приложения.
     
    Можно попробовать сделать усеченные библиотеки, сократить функциональность. Но это не даст ощутимого уменьшения результирующего размера приложения. 
     
    На сколько важен размер приложения для конкретной работы приложения каждый заказчик решает сам.
     
    P.S. Цель этого ответа дать подробный ответ о причинах такого размера, а не попытка вызвать обсуждение на тему сравнения сред разработки. Каждый framework обладает своими достоинствами и недостатками. И выбор средства разработки диктуется совокупностью требования заказчика. 
  25. Like
    Brovin Yaroslav получил реакцию от Alex7wrt в Как сделать перемещение контрола мышкой/пальцем?   
    Добрый вечер,
     
    Перемещение контрола можно сделать двумя способами:
    Используя обычный набор событий OnMouseDown, OnMouseMove, OnMouseUp. Использовать для перемещения жесты. 1. Реализация с использованием событий мыши
    Эти события реализованы для всех платформ. В том числе они эмулируются на мобильных платформ, где понятия мыши, как такового нету. Это означает, что их можно использовать для реализации перетаскивания контрола. Это можно сделать, например, следующим образом:
     
    а) Создаем форму и кидаем на нее картинку. Я назвал ее DraggableImage.

    б) Заводим два поля.
    TForm5 = class(TForm) DraggableImage: TImage; procedure DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure FormCreate(Sender: TObject); procedure DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); private FStartPos: TPointF; FPressed: Boolean; end; FStartPos - начальная локальная позиция мыши внутри нашего контрола (картинки), когда пользователь зажал кнопку мышки или опустил палец на экран. FPressed - флаг для сигнализирования, что пользователь опустил палец (зажал кнопку мыши) на нашу картинку и до текущего момента не снял с экрана. в) В конструкторе формы для перетаскиваемого контрола ОБЯЗАТЕЛЬНО задаем AutoCapture = True. Это позволит контролу генерировать события перемещения мыши, даже если курсор мыши ушел за локальные границы контрола.
    procedure TForm5.FormCreate(Sender: TObject); begin DraggableImage.AutoCapture := True; end;  г) В момент нажатия на картинку сохраняем локальную позицию мыши и задаем флаг FPressed = True
    procedure TForm5.DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := True; FStartPos := TPointF.Create(X, Y); end; д) В момент отпускания кнопки мыши или убирания пальца с экрана сбрасываем флаг FPressed:
    procedure TForm5.DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := False; end; е) И собственно меняем позицию картинки, когда мы ведем мышкой по картинке:
    procedure TForm5.DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); var MoveVector: TVector; begin if FPressed then begin // Вычисляем локальное смещение относительно первоначальной позиции MoveVector := TVector.Create(X - FStartPos.X, Y - FStartPos.Y, 0); // Вычисляем смещение в координатах формы, чтобы учесть изменение // координат при смещении родительских контролов MoveVector := DraggableImage.LocalToAbsoluteVector(MoveVector); if DraggableImage.ParentControl <> nil then      MoveVector := DraggableImage.ParentControl.AbsoluteToLocalVector(MoveVector); // Перемещаем картинку на вычисленный вектор // Для RAD Studio XE5 DraggableImage.Position.Point := DraggableImage.Position.Point + MoveVector.ToPointF; // Для новых версий // DraggableImage.Position.Point := DraggableImage.Position.Point + TPointF(MoveVector); end; end; Этот кусок стоит прокомментировать, чтобы корректно выполнить перетаскивание контролу обязательно нужно вычислять смещение в абсолютных координатах формы. Причина в том, что если контрол повернут или входит один в другой, то нужно учитывать смещения всей цепочки родительских контролов до формы. Поэтому мы вначале вычисляем смещение в локальных координатах, затем вычисляем его в абсолютных координатах формы. А затем обратно переводим в локальные координаты родительского контрола. После чего изменяем позицию контрола на вычисленное смещение.
     
    Такой подход используется, в частности, в контроле TSelection, который так же можно перемещать мышкой или пальцем.
     
    P.S. Чтобы лучше понять это, нарисуйте на листке бумаги положения контрола и попробуйте вручную выполнить этот алгоритм с преобразованием координат. 
     
    Собственно говоря, такой подход отлично работает везде и не требует использования системы жестов.
    2. Реализация с использованием жестов
    Этот способ будет работать только на мобильных платформах, поскольку нужный жест Pan (если я правильно помню) не поддерживается под Windows. Поэтому в целом, первый вариант является универсальным и лучшим решением. 
×
×
  • Создать...