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

Brovin Yaroslav

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

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

  • Посещение

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

    390

Ответы сообщества

  1. Пост Brovin Yaroslav - сообщение в Как указать целевые платформы для компонента, написанного на C++ Builder? был отмечен как ответ   
    Delphi атрибуты не поддерживаются в С++ Builder. Поэтому не получится на уровне одного компонента указать, на каких платформах он будет работать. Однако, есть другой способ указания этого (правда для всех компонентов пакета). При добавлении новой платформы в список целевых платформ пакета, все компоненты пакета считаются полностью рабочими на этих платформах. (после сборки пакета на каждую платформу). Что проиллюстрировано на рисунках ниже:

     
    Если у вас пакет содержит компоненты, как рассчитанные на одну платформу, так и на несколько, то я вижу пока только единственных выход - создание отдельных пакетов для таких компонентов.
     
  2. Пост Brovin Yaroslav - сообщение в [iOS] Можно ли уменьшить размер приложения? был отмечен как ответ   
    Добрый день,

    Ответ на этот вопрос практически полностью совпадает с ответом на вопрос Можно ли уменьшить размер приложения для андроида? с единственным отличием в составе файлов приложения.
     
    Спасибо
  3. Пост Brovin Yaroslav - сообщение в [Windows] Как получить HWND Application? был отмечен как ответ   
    Для RAD Studio XE7
    Начиная с RAD Studio XE7 Доступ к хендлу приложения можно получить так FMX.Platform.Win.ApplicationHWND
     
    Для версий < XE7
    Для всех, у кого среда <= XE6 делаем следующее:
    Открываем исходный файл FMX.Platform.Win.pas (Предполагаемое место расположения файла "/Program Files(x86)/Embarcadero/Studio/14.0/Source/fmx/") В секцию interface модуля объявляем функцию:
    function ApplicationHWND: HWND; В секцию implementation модуля добавляем ее реализацию (лучше в конец модуля либо после объявления глобальной переменной PlatformWin):
    function ApplicationHWND: HWND; begin   if PlatformWin <> nil then     Result := PlatformWin.GetApplicationHWND   else     Result := 0; end; Добавляем модифицированный файл FMX.Platform.Win.pas в ваш проект. P.S. Исходники коммерческих продуктов выкладывать запрещено. Поэтому выше приведено руководство.
  4. Пост Brovin Yaroslav - сообщение в [iOS] Как программно определить, что планшет джейлбрейкнутый? был отмечен как ответ   
    Можно проверить двумя способами:
    Проверить доступность системной командной оболочки Bash Проверить наличие установленного приложения Cydia. uses System.SysUtils, iOSapi.Foundation, MacApi.Helpers; function SharedFileManager: NSFileManager; begin Result := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager); end; function IsBashAccessible: Boolean; var FileBashHandle: THandle; begin FileBashHandle := FileOpen('/bin/bash', fmOpenRead); try Result := FileBashHandle <> INVALID_HANDLE_VALUE; finally FileClose(FileBashHandle); end; end; function IsCydiaInstalled: Boolean; begin Result := SharedFileManager.fileExistsAtPath(StrToNSStr('/Applications/Cydia.app')); end; function IsJailbroken: Boolean; begin {$IF Defined(IOS) AND Defined(CPU386) } Result := False; {$ELSE} Result := IsBashAccessible or IsCydiaInstalled; {$ENDIF} end;
  5. Пост Brovin Yaroslav - сообщение в [Windows] TComboBox, как разрешить использовать кастомные, стилизованные TListBoxItem в выпадающем списке? был отмечен как ответ   
    Установите:
    TComboBox.DropDownKind = TDropDownKind.Custom;
  6. Пост Brovin Yaroslav - сообщение в [Windows] Ищу компонент для отображения табличных данных был отмечен как ответ   
    Чем не устраивает TGrid и TStringGrid, входящий в состав FireMonkey?
    Начиная с версии XE6 скорости работы TGrid и TStringGrid была значительно увеличена и на текущий момент не зависит от количества отображаемых данных. Так же эти гриды имеют поддержку LiveBinding, что позволяет в дизайнере выводить данные из TDataSet подобных компонентов.
  7. Пост Brovin Yaroslav - сообщение в Странное отображение DrawPath был отмечен как ответ   
    Нужно указать способ соединения линий:
    PaintBox.Bitmap.Canvas.Stroke.Join := TStrokeJoin.Bevel;
  8. Пост Brovin Yaroslav - сообщение в Изменение свойства шрифта одной ячейки в FireMonkey TStringGrid DELPHI XE6 был отмечен как ответ   
    Поменялась логика работы грида. Теперь он самостоятельно отрисовывает ячейки и не создает для каждой ячейки отдельный контрол. Поэтому старый способ работать не будет.
     
    Новый вариант решения - это самостоятельно нарисовать ячейку грида:
    uses FMX.TextLayout, System.UIConsts; procedure TForm2.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); const HorzTextMargin = 2; VertTextMargin = 1; var TextLayout : TTextLayout; TextRect: TRectF; begin // Здесь определяем какую ячейку будем перерисовывать if (Column = StringColumn1) and (Row = 1) then begin TextRect := Bounds; TextRect.Left := TextRect.Left + 1; TextRect.Bottom := TextRect.Bottom -1; TextRect.Inflate(-HorzTextMargin, -VertTextMargin); Canvas.FillRect(TextRect, 0, 0, AllCorners, 1); TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.WordWrap := False; TextLayout.Opacity := Column.AbsoluteOpacity; TextLayout.HorizontalAlign := StringGrid1.TextSettings.HorzAlign; TextLayout.VerticalAlign := StringGrid1.TextSettings.VertAlign; TextLayout.Trimming := TTextTrimming.Character; TextLayout.TopLeft := TextRect.TopLeft; TextLayout.Text := Value.ToString; TextLayout.MaxSize := PointF(TextRect.Width, TextRect.Height); { Пользовательские настройки отрисовки } TextLayout.Font.Family := 'Times New Roman'; TextLayout.Font.Style := [ TFontStyle.fsBold ]; TextLayout.Font.Size := 14; TextLayout.Color := claBlueViolet; finally TextLayout.EndUpdate; end; TextLayout.RenderLayout(Canvas); finally TextLayout.Free; end; end; end;
  9. Пост Brovin Yaroslav - сообщение в [TTabControl] Можно ли скрыть названия вкладок? был отмечен как ответ   
    TabPosition = TTabPosition.None;
  10. Пост Brovin Yaroslav - сообщение в Как получить значение свойства объекта стиля, используя StylesData? был отмечен как ответ   
    Нужно помнить, что StylesData при запросе значения свойства какого-либо объекта стиля всегда возвращает TValue.
    Поэтому например в вашем случае вы допускаете сразу две ошибки по одной в каждом варианте:
     
    Ошибка 1
    Не правильно:
    ListBoxItem.StylesData['text.width'].asInteger Свойство Width вещественного типа, поэтому при попытке конвертировать TValue в Integer этим способом приведет к ошибке "Invalid class typecast", так как представления вещественного и целого чисел отличаются.
     
    Правильно:
    ListBoxItem.StylesData['text.width'].AsExtended Ошибка 2
    Не правильно:
    ListBoxItem.StylesData['text.text'].asString В этом случае вы пытаетесь представить содержимое TValue, как строка. Но при таком обращении через методы, начинающиеся с приставки "As", идет попытка конвертации чистого значения вещественного числа (указатель в памяти) в строку. Естественно, что такая конвертация пройдет не правильно и закончится все той же ошибкой "Invalid class typecast"
     
    Правильно:
    ListBoxItem.StylesData['text.text'].ToString
  11. Пост Brovin Yaroslav - сообщение в [Android] Как изменить качество изображения? был отмечен как ответ   
    Сжатие работает. Проверил на Samsung S3.
    Код использования:
    ChangeQuality(ImageBefore.Bitmap, ImageAfter.Bitmap, 10); P.S. Чтобы Bitmap можно было передать вторым параметром в вашей процедуре убрал модификатор доступа var.
     
    Результат сжатия

  12. Пост Brovin Yaroslav - сообщение в Вызов распознавателя голоса. Помогите перевести Java код на Delphi был отмечен как ответ   
    Почему Не все Android API включено в RTL
    Это АПИ, как и другое, специально не включено в состав RTL. Поскольку в RTL включены только те классы и пакеты, которые непосредственно используются и нужны для корректного функционирования FireMonkey. Вторая не менее важная причина - это прирост размера выходного файла вашего приложения. Проблемы трансляции всех модулей Android API нету. Главная причина в том, что мост вызовов между Delphi и Android программный, и поэтому включение огромного числа дополнительных интерфейсов Android API  влечет значительный прирост конечного исполняемого файла. Так как он будет содержать всю ту часть модулей, которые не используются. Решение
    1. Переводим нужную часть Android API. Делаем по аналогии, как переведены другие классы и пакеты, сравнивая документацию Андроида и аналогичные обертки на Delphi AndroidApi.JNU.*  Androidapi.JNI.Speech.pas.zip
    2. Пишем реализацию на Delphi:
    uses Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Speech, Androidapi.Helpers, FMX.Helpers.Android; procedure OpenSpeechRecognizer; var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJRecognizerIntent.JavaClass.ACTION_RECOGNIZE_SPEECH); Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_PROMPT, StringToJString('Голосовой поиск Inforino')); Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE_MODEL, TJRecognizerIntent.JavaClass.LANGUAGE_MODEL_WEB_SEARCH); Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_MAX_RESULTS, 1); Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE, StringToJString('ru-RU')); SharedActivity.startActivityForResult(Intent, 1); end;
  13. Пост Brovin Yaroslav - сообщение в Что работает быстрее TBitmap.Map или TBitmapData.GetScanline? был отмечен как ответ   
    В отличии от VCL FireMonkey не имеет метода TBitmap.GetPixel. Работа с пикселями идет только после запроса TBitmapData.  После запроса TBitmapData TBitmapData.GetScanline и TBitmapData.GetPixel выполняются мгновенно, вне зависимости от размера изображения.  На счет скорости выполнения запроса TBitmapData нужно проверить на своих вариантах использования. В целом, это дорогостоящая операция. Но ее стоимость зависит от многих факторов, от типа используемой канвы, от варианта использования (частота, объемы и тд)
  14. Пост Brovin Yaroslav - сообщение в [Android] Можно ли изменить цвет TProgressBar? был отмечен как ответ   
    Можно, действия аналогичные теме: Как поменять цвет выделенного итема в ListBox для андроид стиля?
    Читаем тему. На 3 шаге меняем исходники стиля горизонтального TProgressBar, согласно этой картинке:
  15. Пост Brovin Yaroslav - сообщение в Как использовать TBannerAd? был отмечен как ответ   
    Подробное описание примера доступно тут: FMX.Advertising.TBannerAd (Delphi)
     
    Спасибо Сысоеву Максиму за ответ.
  16. Пост Brovin Yaroslav - сообщение в Можно ли средствами FM создать PDF файл? был отмечен как ответ   
    Поддержки PDF из коробки нету. Однако, для создания вашего pdf документа вы можете попробовать воспользоваться существующими решениями для создания pdf. Например: TMS iCL
  17. Пост Brovin Yaroslav - сообщение в Как создать собственный эффект (Effects)? был отмечен как ответ   
    Добрый день.
     
    По поводу создания собственных эффектов рекомендую к прочтению зарубежную статью How to Create Your Own FireMonkey Image Effect
  18. Пост Brovin Yaroslav - сообщение в Есть ли возможность работы с MySQL? был отмечен как ответ   
    Заголовок темы об одном, а текст вопроса о другом.
     
    Отвечу на заголовок:
    Поддержки MySQL на андроиде из коробки нету. На андроиде или йос нету поддержки dll. Это чисто Windows технология. А значит логично предположить, что скаченная библиотека на мобильных платформах не поможет и не будет работать. Постскриптум
    Текст вопроса не соответствует правилам Согласно тем же правилам нужно воспользоваться поиском для поиска вопроса: Возможно ли подключиться к MySQL без DLL на Андроиде? На этом тему я закрываю. На будущее прошу вас лучше ознакомиться с правилами.
  19. Пост Brovin Yaroslav - сообщение в Правильное завершение программы на Андроиде был отмечен как ответ   
    Нет.
    При закрытии главной формы в FireMonkey так же используется вызов Application->Terminate. 
    Поэтому в описанном вами случае принципиальной разницы нет. Она может появится только в том случае, когда вы закрываете не главную форму и хотите при этом завершить выполнение программы. В этом случае нужно использовать Application->Terminate.
  20. Пост Brovin Yaroslav - сообщение в Компонент для построения графиков был отмечен как ответ   
    TeeChart
     
    Варианты графиков:


  21. Пост Brovin Yaroslav - сообщение в Запуск видео по расписанию в плеере на Андроиде был отмечен как ответ   
    Подводные камни могут появиться. И они есть. Самое главное, что нужно знать при разработке на андроиде - это то, что при запуске другого активити, ваше может быть выгружено системой из памяти. И как вы понимаете, следствие, ваше приложение не будет работать, пока его опять не запустят. 
     
    За выгрузку вашего приложения отвечает сама операционная система. Одной из причин выгрузки может послужить нехватка ресурсов для выполняемого текущего активити. В этом случае Операционная система выгрузит остальные, чтобы освободить ресурсы. Такое поведение например наблюдается на Samsung S3, когда вы из вашего приложения пользуетесь стандартной камерой (системное приложение). На  Samsung S3 в этом случае происходила выгрузка приложения, а потом повторный запуск, после завершения работы с камерой. 
     
    Отсюда следует, что гарантированно управлять по расписанию вашим плеером таким способом не получится. Работать будет только на тех устройствах, которые не выгружают ваше активити. Если это будет работать на одном и том же устройстве, на котором вы проверили работу и на котором не будет работать ничего лишнего, то можно использовать этот способ.
     
    Однако, если вы хотите добиться одинаковой работы на любом устройстве, то нужно пользоваться другим подходом. А именно:
    AlarmManager - специальный системный планировщик Андроид. Который позволяет на системном уровне послать интент любом приложению в указанные моменты времени.  Сервис - приложение, которое работает в фоне. Сразу скажу, что использование первого в Delphi требует хорошего понимания, как это работает и что нужно сделать. Примеров нету. У меня пока руки не дошли показать, как с ним работать. Хотя он успешно используется в FMX для эмуляции отложенных уведомлений, которых, как известно нету в Андроиде. 
    На форуме было общее обсуждение этого планировщика тут: RSS reader
     
    На счет второго в интернете были зарубежные статьи на эту тему. Но я не углублялся в них. У нас были ссылки на форуме по созданию сервисов
     
    Так же на основании этой информации важно извлечь, что в андроид приложении нужно предусмотреть сохранение состояния приложения. Чтобы в случае выгрузки вашего приложения и повторного запуска, вы не потеряли все данные.
  22. Пост Brovin Yaroslav - сообщение в Как правильно запустить видео в плеере из своей программы? был отмечен как ответ   
    Собственно говоря, Android - хоть и linux подобная система, но команда System не распространяется на проигрывание видео в стандартном видео плейeре.
     
    Поэтому как правильно заметил konung, проигрывание видео файла в стандартном проигрывателе на платформе Андроид осуществляется при помощи намерений (Intent).
    uses Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net, Androidapi.Helpers, FMX.Helpers.Android; {$R *.fmx} procedure PlayVideo(const AFileName: string); var Intent: JIntent; Data: JNet_Uri; begin Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW); Data := StrToJURI(AFileName); Intent.setDataAndType(Data, StringToJString('video/avi')); SharedActivity.startActivity(Intent); end;
  23. Пост Brovin Yaroslav - сообщение в У меня возникает ошибка при попытке добавить пустой TObject в TStringList был отмечен как ответ   
    Ошибка вашего кода, не связанная с TComboBox.
    Под мобильными платформами работает ARC - Автоматический подсчет ссылок. В вашем примере, вы добавляете псевдообъект:
    TObject(I) При добавлении объекта у него должен увеличиваться счетчик ссылок RefCount (поле объекта). Компилятор автоматически вызывает системный метод TObject:
    function __ObjAddRef: Integer; virtual;  В этом методе идет увеличение внутреннего поля FRefCount. А так как объекта физически не существует, то вы получаете Access Violation.
  24. Пост Brovin Yaroslav - сообщение в Как обойти потерю фокуса ввода близко расположенных TEdit при выделении? был отмечен как ответ   
    Тут решение простое.
     
    Нужно расположить поля ввода в том порядке, чтобы в начале шли поля ввода ниже, а затем выше.
     
    Система ищет контрол, который будет получать события мыши проверяя их по порядку с конца. Первый найденный будет получать события. В вашем случае вышло так, что нижнее поле ввода создавался после верхнего. И значит оно будет раньше с конца. При нажатии на точку, первым проверяется последний контрол (нижнее поле ввода) на попадание. Вы действительно попадаете в область и события перехватываются. Если же поменять порядок, то верхнее поле.
     
    Проверить можете на прикрепленном примере: EditOrdersDemo.zip
     
    То же самое на иллюстрации:


  25. Пост Brovin Yaroslav - сообщение в Как увеличить область перехвата событий мыши и жестов для контрола не меняя его физического размера? был отмечен как ответ   
    Решение простое, FireMonkey поддерживает специальное свойство TControl.TouchTargetExpansion для расширения логического размера контрола, не меняя его физический размер.
     
    Работает это так: При определении контрола, в который нужно транслировать системное событие мыши или жестов, платформа вначале ищет контрол по указанным координатам нажатия. Система опрашивает каждый контрол на попадание нажатия в область контрола. По умолчанию область контрола полностью совпадает с его размерами. TouchTargetExpansion позволяет увеличить эту область на момент определения контрола. 
×
×
  • Создать...