Перейти к содержанию

Лидеры


Популярный контент

Показан контент с высокой репутацией за 02.01.2018 во всех областях

  1. 19 баллов
    Brovin Yaroslav

    [FGX Native] Большие новости с полей

    Как вы уже могли заметить, уже давно не было никаких новостей о ходе разработке библиотеки FGX Native. Однако, несмотря на это, работа ни на секунду не прекращалась и продолжалась с еще более быстрым темпом. И в этой новости я хочу познакомить вас со всеми новостями, которые произошли за эти 3-4 месяца. И начну я с самой важной для меня новости – это 0. Запущено закрытое альфа тестирование Запуск закрытого альфа тестирования – это очень ответственный для меня момент, потому что он впервые связывает меня и мою разработку с реальными людьми. Поэтому он требует не просто что-то делать, но и определенного процесса разработки и релизов. Кроме того, альфа тестирование – это необходимость решения вопроса распространения библиотеки. Именно поэтому была проведена работа по организации сборки и доставки библиотеки до пользователя. Был собран полноценный инсталлятор FGX Native библиотеки для RAD Studio CE или RAD Studio Tokyo и теперь в несколько простых кликов можно развернуть FGX Native прямо у вас в IDE и приступить к разработке ваших приожений. Альфа тестирование началось 7 августа и до сих пор продолжается. Тестирование закрытое и осуществляется маленькой группой разработчиков, помогающих мне понять, что можно и нужно улучшить, какой функционал добавить и какое API расширить. А также просто поделиться со мной своими любыми впечатлениями. Ведь основная цель – это сделать удобный продукт для разработчиков. 1. Дизайнер: 1.1 Новый дизайнер ресурсов Безусловно идея с выделением всех графических ресурсов вашего приложения из контролов в отдельное хранилище является классной, позволяющая ускорить загрузку форм из ресурсов, за счет не хранения больших картинок прямо в ресурсах формы. Помимо этого, такой подход позволяет избежать копирования одного и тоже изображения в нескольких контролах, а позволяет использовать только один экземпляр картинки в рамках всего вашего приложения. Однако, я решил не останавливаться на достигнутом и пойти дальше, расширив типы хранимых ресурсов. Что привело к полной переработке существующего АПИ по хранению ресурсов в FGX Native и разработке нового дизайнера ресурсов. Теперь они называются Assets, по-русски просто ресурсы. И могут быть разных типов. В текущей версии поддерживаются два типа ресурсов, но существующие абстракции позволяют добавлять и другие типы: Ресурс цвет – хранит информацию о ARGB цвете Сет картинок – хранит версии одного и того же изображения в разных масштабах для качественного отображения картинок на экранах устройств в разных масштабах. Если раньше все картинки задавались по имени. То сейчас идея задания картинки расширена и позволяет задавать не только картинку, но и цвет. Например, раньше задний фон контролов задавался как-то так: Для каждого способа отображения заднего фона существовало отдельное свойство. Это нормальное решение, но не такое классное, как могло бы быть. Именно поэтому теперь есть только одно свойство, при помощи которого разработчик должен указать лиши название ресурса, которое он хочет использовать для отображения заднего фона. При этом это может быть, как картинкой, так и обычным ресурсом цвета. Компонент автоматически определяет это и корректно задает графический ресурс. За счет этого удается повысить скорость разработки вашего приложения и централизованно организовать хранение всех ваших ресурсов приложения в одном месте. Но это еще не все, такой подход к организации хранения ресурсов позволяет сопровождать каждый ресурс дополнительными данными. Например, если картинка рассчитана для отображения “резиновых” 9-patch изображений, то вместо того, чтобы каждый раз задавать правила нарезки изображения непосредственно в каждом контроле, это можно сделать один раз при загрузке ресурса. После чего, опять же, указываем имя ресурса и мы получаем уже масштабированное изображение: Безусловно такая идея хранения ресурсов не является новой, однако в данном случае она дает массу преимуществ. Идея будет развиваться и в ближайшее время будут добавлены новые типы ресурсов для переводов интерфейсов, локализации строк и создания цветовых схем вашего приложения. 1.2 Дизайнер управления порядком контролов С чего все началось? Исторически сложилось в Delphi, что при выравнивании контролов между собой используется приоритет позиции контрола на экране. И при выравнивании трех кнопок по левому краю, порядок следования контролов друг за другом будет определяться их положением на форме. Другими словами, тот контрол, который находится левее, займет первую позицию. Безусловно это дает большие удобства по манипуляции выравнивания контролов в дизайнере, так как смена порядка контролов осуществляется простым перетаскиванием контролов между собой. Но с другой стороны это имеет и побочный эффект в рантайме. Если ваше приложение управляет видимостью выравненных контролов, то очередное скрытии и повторное отображение контрола может привести к смене позиции контрола. Именно поэтому иногда приходится использовать трюк со сменой позиции контрола в рантайме, чтобы вернуть скрытый контрол на место. Типичный пример это добавление контролов в скролл бокс, выравненных по верхнему краю. Чем закончилось? В библиотеке FGX Native я решил отказаться от классического старого подхода и перейти к современной модели выравнивания – порядок выравнивания задается порядком следования контролов у родителя, который отлично себя зарекомендовал во многих UI библиотеках. Другими словами, на порядок выравнивания влияет не позиция компонента на форме, а его порядковый номер в рамках своего родителя. Именно этот подход и был разработан с добавлением нового дизайнера. 1.3 Режим блокировки контролов на экране форме Данный режим не представляет из себя что-то новое. Обычно при проектировании приложения вы используете большое количество компонентов. Среди которых присутствуют контролы, используемые только для выравнивания или группировки визуальных компонентов (линии, картинки, контейнеры). Это приводит к тому, что ваша форма перегружена визуальными контролами. И порой выделить среди этого количества нужный компонент становится все сложнее и сложнее. А если взять во внимание, что вы разрабатываете мобильное приложение с ограниченными размерами экрана устройства, то концентрация контролов может доставлять вам неудобство в проектировании вашего приложения. Именно режим блокировки контролов и позволяет вам упростить выделение “важных” компонентов за счет блокировании “побочных” контролов. У каждого компонента появилось свойство Locked, позволяющее заблокировать контрол в дизайнере от выделения. Контрол, у которого стоит Locked = True, нельзя выделить в дизайнере нажатием мышки. Единственный способ – это выбрать его в выпадающем списке инспектора свойств объекта. 1.4 Добавлен новый режим в дизайнере по отображению границ контролов Данный режим позволяет вам визуально отобразить области, занимаемые каждым контролом на форме, за счет легкой подсветки каждого контрола. Такой режим позволяет наглядно продемонстировать границы контролов и какие отступы они используют (внутренние padding или внешние margins). 1.5 Сплеш скрины Теперь поддерживаются сплеш скрины с поддержкой 9-patch изображений. Если приложение запускается очень быстро, то сплеш скрин не отображается. Если же запуск приложения занимает больше времени, то отображается сплеш скрин. 1.6 Минорные улучшения Задание иконки приложения Теперь при двойном нажатии на контрол для автоматической генерации обработчиков предпочтение отдается следующим событиям в порядке возрастания приоритета: 'ONCREATE', 'ONTOUCH', 'ONTAP', 'ONCHANGE', 'ONCHANGED'. А для формы всегда выбирается OnCreate. Теперь контролы можно бросать с палитры прямо на форму. Раньше можно было кидать только двойным кликом Улучшено перемещение не визуальных компонентов по форме 2. Платформенные сервисы: 2.1 Получение информации о текущей локали устройства Возвращает информацию о текущей локали устройства: Код текущего языка Первый день недели Код страны 2.2 Открытие документов в сторонних приложениях. Поддерживает открытие ссылок в системном браузере 2.3 Тоаst Добавлен сервис по отображению тостов "Toast" и он реализован для Андроид платформы. 2.4 Виртуальная клавиатура Возможность скрыть виртуальную клавиатуру. 2.4 Хелпер для централизованного получения информации о системе TfgSystemInfo Пока возвращает только информацию о локале. В будущем будет расширен. 2.5 Менеджер по управлению историей отображения форм. Появился менеджер форм TfgFormManager, позволяющий организовывать простую навигацию по истории открытии форм. 3. Выравнивание (Yoga и FlexBox): 3.1 Конец эпохе якорей Убраны якоря Anchors и вместо них добавлено свойство RelativePosition. В первых версиях FGX Native была поддержка якорей, как это сделано в FMX и VCL, однако, после анализа работы с системой выравнивания стало очевидно, что якоря устарели из-за их главного недостатка – это невозможность легко задавать конкретное значение отступа контрола относительно родителя. Например, если требуется расположить компонент в правом нижнем углу с отступом от угла в 10 пикселей с двух сторон, то это крайне тяжело сделать с концепцией якорей. Поскольку требуется вычислить координаты правого нижнего угла компонента и только потом постепенно пододвигать компонент для выставления желаемых значений отступов. Вместо этого используется подход, как в CSS. Введено свойство RelativePosition, которое позволяет задать положение контрола относительно всех четырех сторон родителя вместе или частично. Достаточно указать значение расстояния от нижнего и правого краев, и контрол автоматически буде т прижат к правому нижнему углу на указанном расстоянии. Помимо этого, в новой системе выравнивания, данное свойство позволяет реализовать накладывание контролов друг на друга в стеке. 3.2 Обновление Yoga Обновление йоги до последней актуальной версии с исправлением ошибок. 3.3 Абстракции для системы выравнивания Несмотря на то, что система выравнивания FlexBox внедрена в библиотеку на нижнем уровне, это не означает, что все контролы должны ее использовать. Совершенно допустимо реализовать свой кастомный вариант выравнивания для вашего специфичного компонента. Для этих целей были выделены интерфейсы для маркировки, какие компоненты должны использовать автоматом встроенную систему выравниванию. 4. Графика: Реализована возможность задавать скейл для битмапа, отвечающего за то, как изображение будет выводиться на экране. 5. Расширение возможностей компонентов 5.1 TfgDrawer Новые события: OnBeginOpen, OnOpened, OnBeginClose, OnClosed, OnStateChanged, OnSlideChanged; 5.2 TfgApplicationEvents Добавлены новые события компонента мониторинга основных событий приложения OnSaveApplicationState - Срабатывает, когда приложению нужно сохранить свое состояние, так как оно может быть закрыто OnRestoreApplicationState - Срабатывает, когда приложению нужно восстановить свое состояние после запуска. 5.3 TfgCollectionView Один из ключевых компонентов построения интерфейса мобильного приложения. За последнее время разработаны функционалы: выделению элементов в списке Мультиселект Тинт Глоуэффект, отображаемый при прокручивании списка за границы контрола Методы по скроллингу контента Возможность динамически менять высоту элементов в рантайме Screenrecorder-2018-10-03-01-54-40-72.mp4 5.4 TEdit Задание цвета оттенка поля ввода (тинт) 5.6. TSwitch Добавлен тинт эффект. 5.7. TfgForm OnKey – новое событие по обработки нажатия кнопок 6. И просто баг фиксинг История изменений [0.1.0.0] - Alpha 02.10.2018 ВАЖНО: - Теряется обратная совместимость! * Глобальная работа концепцией ресурсов: - Полностью переработана концепция ресурсов и приведена к единой терминологии. - TfgAsset - это абстрактный ресурс, предназначенный для указанного класса устройств и платформы. - Ассет может быть любым. В текущей версии поддерживается два типа: цветовой TfgAssetColor и набор картинок TfgAssetBitmapSet. - TfgAssetColor - ресурс, содержащий цвет в ARGB формате. - TfgAssetBitmapSet - ресурс, содержащий версии одной картинки в разных масштабах. - TfgAssetBitmapSet - поддерживает указание правил нарезки изображения аналог 9-patch для возможности "натягивать" картинку на контрол любого размера. (TfgBitmapInfo.CapInsets) - Центром управления всех ассетов является TfgAssetManager. Имеено через него можно добавить, найти или удалить ассет и многое другое. - Заменено свойство TfgControl.Background на TfgControl.BackgroundName. И теперь здесь достаточно указать название графического ресурса, которое будет использовано для заполнения заднего фона (цвет или изображение). - Удалено свойство TfgImage.CapInsets. Теперь оно является частью картинки и должно задаваться именно там. - TfgImage поддерживает не только задание ассета с картинками, но и цветового ассета. В этом случае контрол будет полностью заполнен цветом. - Изменен формат хранения информации об ассетах в config.json файле. Теперь формат поддерживает расширение ресурсов и позволяет добавлять свои кастомные типы. - Если раньше дизайнер развертывал файл config.json целиком, включая даже пустые ресурсы и ресурсы для ios. То теперь IDE собирает специальную сокращенную версию config.json, вырезает от туда пустые ресурсы. Благодаря этому немного уменьшается время запуска приложения. - Полностью переработан дизайнер ассетов для IDE. Теперь он поддерживает работу с ассетами разных типов. * #12 [TfgImage, TfgLayout] Заполнение изображением с CapInsets * #28 [Designer] [FGX Assets manager] Ошибка с одинаковыми именами картинок в различных папках * #39 [Designer] GFX Assets manager - вылеты * #67 [Designer] Добавить в дизайнер новый режим отображения границ контролов. * Исправлено отображение иконки блокировки контрола Locked для иконки невизуального компонента. [0.0.6.0] - Alpha 05.09.2018 * #66 [Designer] Адаптировать автоматическое создание обработчиков для компонентов при двойном клике Теперь при двойном нажатии на контрол для автоматической генерации обработчиков для событий предпочтение отдается следующим событям в порядке возрастания приоритета: 'ONCREATE', 'ONTOUCH', 'ONTAP', 'ONCHANGE', 'ONCHANGED'. А для формы всегда выбирается OnCreate. * #29 [Designer][Assets Manager] Продублировать открытие дизайнера из главного меню в менеджере проекта * #38 [Designer] Автоматическое открытие GFX Assets manager * #62 Создание новой формы в демо-проекте дает ошибку project already contains a form or module named TForm1 * #63 Баг при выделении контрола * #64 [TfgWebBrowser] При повторном показе html-страницы содержимое сильно увеличивается * #65 [Lolipop] [Java bridge] Поддержка загрузки приложения на андроиде 5.Х * Исправлена ошибка дизайнера, не позволяющая загрузить IDE под Windows 7. [0.0.5.1] - Alpha - Hotfix 28.08.2018 * Правка подхода к изменению порядка контролов. К сожалению пришлось отказаться от решения смены порядка, основанного на работе панели Structure, по скольку в ней содержится баг, который периодически сбивает сортировку узлов по индексу. Вместо этого в этом релизе сделано отдельное диалоговое окно смены порядка контролов на подобии "Tab order...", "Create order...". Открыть окно можно: - через главное меню "Edit->Alignment Order..." - через контекстное локальное меню дезайнера. При этом если в дизайнере формы был выделен контрол, то для удобства пользования дерево иерархии контролов разворачивается до него, чтобы сэкономить время пользователя на поиск интересуемого контрола. Помимо этого в окне менять порядок можно комбинацией клавиш Ctrl + Up, Ctrl + Down. * Реализованы методы TfgControl.BringToFront и TfgControlSendToBack; * В панель структуры добавлено отображение индекса для контролов, чтобы визуально можно было увидить порядок следования контролов. * Подчищено контекстное локальное меню формы. Убраны пункты меню, которые не актуальны. * Исправлена ошибка неверного положения рамки выделения первого компонента. При первом добавлении компонента на форму рамка выделения всегда находилась в левом верхнем углу. * Исправлено неверное расположение текста на кнопке в дизайн тайме, если у кнопки нету картинки. * Добавлено отображение картинки замка в верхнем правом углу контрола, если он залочен при помощи свойства TfgControl.Locked. Если контрол очень маленький, то замок не рисуется [0.0.5.0] - Alpha 25.08.2018 * Отключена регистрация TfgListView, TfgScrollBox, TfgTabBar, TfgToolBar до момента, когда они будут готовы. * #2 Не открывается дизайнер формы при создании нового проекта * #22 Не перемещаются положенные на форму не визуальные компоненты * #53 [Android] Предложение: сделать помошника для перехода по URL Application.OpenUrl * #55 [TfgWebBrowser] Не скроллится содержимое TfgWebBrowser * #56 [TfgRadioButton] Не работает VertAlign для текста * #58 [Feature] [Designer] Реализовать смену порядка контролов через панель структуры - Теперь панель "Structure" сортирует контролы не по имени, как это принято, а по индексу. - Чтобы поменять порядок контрола в рамках родителя нужно воспользоваться стрелками на панели "Structure". - Чтобы программно задать порядковый номер контрола, можно воспользоваться свойство TfgControl.Index. * #59 [Designer] [TfgControl] Реализовать свойство Locked * #60 [Designer] Реализовать добавление компонента на форму с палитры путем перетаскивания Drag and Drop [0.0.4.0] - Alpha 31.07.2018 * Глобальное обновление функционала TfgCollectionView: - Добавлен функционал выделения элементов. - Добавлены русскоязычные описания всех методов, событий и свойств в FGX.CollectionView. - Добавлено демо CollectionViewSelectionDemo, демонстрирующее работу выделения. - Рефакторинг реализации под Андроид с дальнейшей целью сделать TfgListView и TfgListMenu на базе TfgCollectionView. - TfgCollectionView.SelectionColor - цвет выделения по умолчанию. - TfgCollectionViewStyle.SelectionColor - цвет выделения для элементов одного стиля. - TfgCollectionViewStyle.Selectable - поддерживают ли элементы данного стиля выделение. - TfgCollectionViewStyle.Clickable - Поддерживает ли элемент нажатие. Влияет на работу событий OnTapItem. - TfgCollectionView.SelectionMode - Режим выделения. - TfgCollectionView.SelectionMode - Режим выделения. - TfgCollectionView.OnSelectionChanged - выделение изменилось. Получает на вход список всех выделенных элементов - TfgCollectionView.OnItemSelectionChanged - выделение у элемента поменялось. Срабатывает для одного элемента при изменении его состояния выделения. - TfgCollectionView.ResetSelection - сбросить выделение - TfgCollectionView.ResetSelection - сбросить выделение для одного итема - TfgCollectionView.SelectItem - выделить указанный элемент - TfgCollectionView.SelectAllItems - выделить все элементы - TfgCollectionView.Selection - Список индексов выделенных элментов. - TfgCollectionView.ReloadItem - Метод обновления данных для указанного элемента - TfgCollectionView.Count - возвращает количество элементов в списке - TfgCollectionView.GetStyle - Возвращает стиль по его имени - TfgCollectionView.GetStyleForItemIndex - Возвращает стиль указанного элемента - TfgCollectionView.CreateStyle - создает новый стиль с уникальным именем - TfgCollectionView.ScrollToItem - Прокручивает список к элменту с указанным индексом. - Теперь при нажатии на TfgCollectionView не выделяется контейнер стилей, а выделяется TfgCollectionView. - Теперь можно добавить новый стиль через контекстное меню дизайнера при нажатии на TfgCollectionView. - Исправлены ошибки с перетаскиванием элементов стиля. - Исправлена ошибка неверной генерации названия нового стиля. - Исправлена ошибка, из-за которой новый добавленный стиль не появлялся в структуре и не мог быть выделени. * #16 [Deploy] Реализовать статичные картинки для сплеш скрина. * #21 [TfgCollectionView] Предложение: Реализовать возможность отображения выбранного элемента * #37 [Designer] Вложенные компоненты * #51 [fgCheckBox] отсутствует событие OnChanged * #52 [TfgCollectionView | Предложение] Добавить ScrollTo * Добавлено событие OnChanged для TfgRadioButton * Опубликовано свойство GroupName для TfgRadioButton * Пофикшены дефолтный размеры TfgRadioButton из-за чего раньше компонент не помещался в размеры и обрезался. [0.0.3.1] - Alpha 29.07.2018 * #50 [FMX | Manifest] В новом FMX-проекте создается неправильный манифест [0.0.3.0] - Alpha 28.07.2018 * #19 [Platform] Добавить хелпер для работы с сервисом локали IFGXLocaleService * #23 [Device skins] Не открываются разные шкурки устройств в дизайнере * #26 [Yoga FlexBox] Убрать якоря и ввести свойство RelativePosition * #31 [Designer] Ошибка при выборе класс устройства из выпадающего списка в дизайнере формы * #32 [Designer] Хинт кнопки переворота * #33 [Designer] Для кнопки увеличения масштаба не верно указана иконка * #34 [Designer] Не меняются цифры при изменении размера * #41 [Designer] Не работает кнопка поворота устройства для Universal класса * #44 [TfgRadioButton] При добавлении компонента приложение зависает при загрузке * #45 [Deploy] Неправильный деплой иконок в новых проектах * #46 Проблема манифестом при создании FGX проекта * #49 [Designer][Assets Manager] Сделать сохранение локального пути к картинкам относительно папки проекта * Пофикшена проблема с невозможностью использовать TfgCheckBox * Исправлена проблема, из-за которой FGX подменял список файлов деплоя для FMX приложений из-за чего FMX приложения крашились на старте * Теперь, если у проекта еще не было манифеста или файла со стилем, то они автоматически создаются перед компиляцией. * Исправлена ошибка, которая могла отключать из деплоя файл classes.dex, если в проекте использовалось более одной конфигурации сборки. [0.0.2.0] - Alpha 25.07.2018 * #2 Не выделяется компонент, если у него или родителей стоит HitTest=False * #3 [NavigationBar] Ошибка в названии события OnNavicationIconTap * #4 [NavigationBar] Надпись в дизайнере TITLE при пустом свойстве * #7 [FGX Assets manager] Проверка допустимых символов * #9 [Project Options] Не меняется иконка проекта * #14 [Designer] Добавить иконку библиотеки FGX на сплеш скрин студии с указанием загружаемой версии FGX * #15 [FGX Assets manager] Если переименовать картинку, то картинка со старым именем физически остается в папке Assets
  2. 16 баллов
    sinuke

    [Android] Прозрачный StatusBar в RAD 10.3 Rio

    Привет Вчера была выпущена финальная версия RAD Studio 10.3 Rio, в которой много нововведений для Андройд. Но вот про статусбар снова "забыли". Хотя не совсем, добавили файлик styles-v21.xml, который превносит новую материальную тему на устройствах под управлением Android 5.0 и выше вместо устаревшей Holo. Но все равно свойство формы SystemStatusBar так и не реализовали. Поэтому при запуске статус бар будет окрашен в унылый серый цвет (см. скриншот). Для того, чтобы сделать статусбар прозрачным и поместить под него содержимое формы, то достаточно сделать несколько несложных шагов: 1. Убираем из деплоймента (Project -> Deployment) файл styles-v21.xml (можно просто снять галочку рядом с именем файла) 2. Добавить в деплоймент проекта новый файл styles-v21.xml (styles-v21.zip) и прописать ему путь res\values-v21\ 3. В результате получится следующий вид P.S. В новом файле по сравнению со стандартным добавилась строчка <item name="android:windowTranslucentStatus">true</item>, которая и отвечает за прозрачный статусбар P.P.S. Чтобы определять размер статус бара, все также можно воспользоваться решеним ZuBy - http://blog.rzaripov.kz/2016/12/android-ios.html P.P.P.S. Тестовый проектик - StatusBar.zip
  3. 14 баллов
    Всем добрый вечер, Вот и прошло лето, а вместе с этим подходит к концу закрытое бета тестирование библиотеки FGX Native. Проделана огромная работа, как в разработке самой библиотеки, так и в разработке нового портала. Плодотворная работа во время бета тестирования принесла свои плоды. В результате: Были разработаны несколько новых интересных мобильных проектов: Аналог сервиса распознавания музыки Shazam на Delphi и FGX Native! Температурный дневник. Фиксация температуры, приема лекарств, построение графиков и рекомендации о приеме лекарств. Электронный конспект лекций по теме "Слесарное дело" с функциями самопроверки. Домашняя аптечка. Большой проект с демонстрацией возможностей библиотеки. Добавлены новые возможности и компоненты. Повышена стабильность работы библиотеки. И многое другое. Я рад с вами поделиться отличной новостью, которую многие с нетерпением ждали. До нового года запланирован релиз библиотеки FGX Native под Андроид, который будет доступен для РФ и стран СНГ: Разработка кроссплатформенных приложений под Андроид . Русскоязычная документация. Набор демонстрационных проектов. Более 40 готовых компонентов. Свой дизайнер форм. В течении следующих двух недель будет опубликована ссылка на сайт, посвященный библиотеке FGX Native. На нем вы сможете найти: описание возможностей, документацию, тарифы и многое другое - всё это поможет вам предварительно оценить возможности библиотеки для реализации своих проектов. Позже, ближе к новому году, будет выложена Trial сборка библиотеки и открыта продажа. Если у вас есть какие-либо вопросы - задавайте. Всем отличной рабочей недели! P.S. - Релиз под iOS запланирован на весну/лето 2020 года. - Релиз для других стран будет позже, после локализации документации.
  4. 13 баллов
    krapotkin

    Фреймворк для стандартного ListView

    Всем привет! После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView. Данные подаются в виде модели данных, описание раскладки итема лежит в JSON. Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI { TMyAdapter } procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable; const AData: TMyData); begin if SameText( ADrawable.Name, 'text') then begin (ADrawable as TListItemText).Text := AData.Text; end else if SameText( ADrawable.Name, 'detail') then begin (ADrawable as TListItemText).Text := AData.Detail; end else if SameText( ADrawable.Name, 'balance') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance); end else if SameText( ADrawable.Name, 'reserved') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved); end end; Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки. Можно указать Detail.Y = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X {"Kind":"rect","Name":"BonusRect","Value":"", "Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"}, "BorderColor":"#FF005500", "Color":"lime", "LineWidth":3}, {"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"", "Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"}, "WordWrap":true, "Color" :"Black", "Font":{"Size":18,"Style":""}} ], "ItemHeight":"detail.bottom+10", Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects Код для работы примерно такой procedure TForm1.FormCreate(Sender: TObject); begin data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView end; procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема end; Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия. Отличие от ModernLV - , 1) все происходит без правки системных файлов 2) пока нет колонок и других особых изысков. На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже ListViewFramework.7z
  5. 12 баллов
    slav_z

    Работа с атрибутами текста

    Как сделать текст с подобными атрибутами? Очень просто! (Цвет текста не работает в XE8) Вот весь код: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.TextLayout; type TForm1 = class(TForm) Button1: TButton; Text1: TText; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} type TTextAccess = class(TText); procedure ClearTextAttribute(Text: TText); begin TTextAccess(Text).Layout.ClearAttributes; end; procedure AddTextAttribute(Text: TText; Pos,Length: Integer; FontStyles: TFontStyles; FontColor: TAlphaColor); var Font: TFont; begin Font:=TFont.Create; Font.Assign(Text.Font); Font.Style:=FontStyles; TTextAccess(Text).Layout.AddAttribute( TTextRange.Create(Pos,Length), TTextAttribute.Create(Font,FontColor)); end; procedure TForm1.Button1Click(Sender: TObject); begin AddTextAttribute(Text1,10,17,[TFontStyle.fsBold],claRed); AddTextAttribute(Text1,34,8,[TFontStyle.fsUnderline],claBlue); AddTextAttribute(Text1,47,8,[TFontStyle.fsStrikeOut],claGreen); Text1.Repaint; end; end.
  6. 12 баллов
    В конце концов получилось исправить. Для interlaced гифок проблема была вообще пустяковая. Одна строчка не в том месте. А вот для optimized все оказалось несколько сложней, но в итоге теперь все гифки отображаются правильно. Пользуйтесь на здоровье! FMX.GifUtils.zip
  7. 11 баллов
    Расскажу о том как я добился нормальной фоновой работы приложения. В моем понимании нормальная фоновая работа приложения - это сохранять геокоординаты и систематически (по мере их накопления передавать на сервер). По сути у нас получился трекер. Те кто считают что iOS такое не умеет делать, и все что будет написано ниже это фейк лучше закройти эту тему. Итак начнем, по пунктам: 1) Добавляем к проекту ключ NSLocationAlwaysAndWhenInUseUsageDescription - для новых иОС это обязательно, начиная с 11 или 12 версии уже не помню 2) Сообщаем приложению о намерении что мы будем использовать геокоординаты в фоне (редактируем ключ UIBackgroundModes выставляя галочку напротив location) 3) Далее для того чтобы не поломать другие приложения которые используют геолокацию создаем специальную дерективу, которая будет сообщать о том что наше приложение будет использовать геолокацию в фоне, я ее назвал iOS_RequestAlwaysAuthorization 4) Дальше намного сложнее, нам нужно исправить исходники самой Delphi, а именно System.iOS.Sensors. Изменять будем процедуру TiOSLocationSensor.DoStart, все что отличается от стандартного у меня в рамках описания моей директивы: function TiOSLocationSensor.DoStart: Boolean; var I: Integer; begin {$ifdef iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestAlwaysAuthorization; {$else iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestWhenInUseAuthorization; {$endif iOS_RequestAlwaysAuthorization} // check authorization if Authorized = TAuthorizationType.atUnauthorized then SensorError(SLocationServiceUnauthorized); // check if location sensor is enabled if not FLocater.locationServicesEnabled then SensorError(SLocationServiceDisabled); // start location updates if (LocationChange = TLocationChangeType.lctLarge) and CanUseSignifChangeNotifs then FLocater.startMonitoringSignificantLocationChanges else FLocater.startUpdatingLocation; // start heading updates if CanUseHeading then begin FLocater.startUpdatingHeading; end; // start monitoring regions if CanMonitorRegions then for I := 0 to Regions.Count - 1 do FLocater.startMonitoringForRegion(ConvLocationRegion(Regions[I])); Result := FLocater.locationServicesEnabled; if Result then Result := Authorized = TAuthorizationType.atAuthorized; {$ifdef iOS_RequestAlwaysAuthorization} FLocater.setAllowsBackgroundLocationUpdates(True); FLocater.setPausesLocationUpdatesAutomatically(False); {$endif iOS_RequestAlwaysAuthorization} end; Собственно усе, можно наслаждаться фоновой работой. Все это работает под Delphi 10.2.3. На телефоне iPhone 6s под управлением iOS 11. Как было сказано выше, работает как геолокация так и инет и вообще все остальные процессы внтури приложения, такие как TTimer Собственно вот результат данного трекера: Если приблизить то можно увидеть насколько точно и часто он обновляет координаты: И да, огромное спасибо человеку с ником Artyom Karapetyan, именно он натолкнул на мысль того как надо правильно все сделать
  8. 10 баллов
    Первые пробы портирования существующего приложения с FMX на FGX. За основу был выбран классный проект Станислава Ихнатовича из Беларуссии с мобильным расписанием, отличающийся от других продуманным интерфейсом и детальной шлифовкой UI. Станислав любезно предоставил исходные коды своего проекта. Предлагаю вам ознакомиться с первым наброском его приложения на базе FGX. Обратите внимание, на сколько удобно идет создание стиля расписания пары, сделанного на базе компонента TfgCollectionView. В дизайн тайме созданы три варианта стилей без единой строчки кода для отображения расписания одной пары в разных исполнениях. Используя всю мощь FlexBox, удается достигнуть разнообразных вариантов "резинового" выравнивания контролов. А связь с данными не размазывается по коду, а сосредоточена вся в одном месте. Меню навигации сделано на базе нового компонента TfgListMenu без единой строчки кода, за исключением обработчиков нажатия на пункты меню и открытия отдельных форм, которым отведена роль отображения экранных страниц. Отдельно стоит указать, что специально для данного мобильного приложения была расширена возможность задавать задний фон контролов на базе картинки. А также были расширены возможности отображения и выравнивания форм относительно других. Так например форму можно встроить в любой контрол контейнерного типа, как фрейм. Или же просто отобразить форму, как всплывающее окно. P.S. Портирование приложения на FGX Native находится на стадии разработки. Screenrecorder-2018-05-28-00-54-39-998.mp4
  9. 10 баллов
    Принцип работы такой: На форму кладете стандартный TImage Создаете экземпляр TGifPlayer Задаете свойство FGifPlayer.Image:=Image; где Image это лежащая на форме TImage Загружаете гифку FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); Запускаем проигрывание гифки FGifPlayer.Play; Вот код: unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.GifUtils, FMX.Objects; type TFormMain = class(TForm) Image: TImage; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } FGifPlayer : TGifPlayer; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin FGifPlayer:=TGifPlayer.Create(Self); FGifPlayer.Image:=Image; FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); FGifPlayer.Play; end; end. Вот демо проект во вложении: FMX.GifUtils.Demo.zip
  10. 9 баллов
    У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. Автоматически возникает вопрос обновления. Если в первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"... Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер. Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT, Вот то что получилось в результате. Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой. Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path файл, показанный на рисунке, создается автоматически самой делфи. теперь остается отгадать, какой путь реально подставится вместо "." Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик. Оказалось все проще (?) st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!! (For.Unbelievably.Creative.Knowers!) Потом все просто. FApkUri передаем в интент и запускаем итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания) procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь. Всем удачи. UPD. Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку
  11. 9 баллов
    yooSee

    Runtime permissions in Delphi 10.3 Rio

    Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage. в uses проекта добавьте следующее uses System.Permissions, Androidapi.Jni.Os, Androidapi.Helpers, далее создадим переменные var Form: TForm; .... FPermissionWrite: string; FPermissionRead: string; в Form.Create добавим следующий код procedure TForm.FormCreate(Sender: TObject); begin FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; и теперь сам не посредственно запрос на подтверждение наших прав procedure TForm.Button1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([FPermissionWrite, FPermissionRead], nil); end; //это вызовет окно с запросом разрешения прав ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства procedure TForm.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; procedure TForm.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses uses System.system.ioutils; Надеюсь материал будет полезен! video_2019-02-08_00-11-36.mp4 Permissions.zip
  12. 9 баллов
    Brovin Yaroslav

    С днем рождения Андрей Ефимов ???

    Хочу от всей души поздравить с днем рождения нашего модератора Андрея Ефимова @Andrey Efimov. Человек, на которого можно положиться и который всегда готов прийти на помощь. Из года в год помогает нашему форуму становиться лучше. С днем рождения! Успехов тебе в работе, в личных делах. И не забывать про Делфи!
  13. 9 баллов
    Задался вопросом, нашел ответ, может кому пригодится. uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  14. 8 баллов
    OnePeople

    Монополия

    Делал чисто для себя! И только для своего удовольствия! Возможны ошибки!*(вернее точно есть))) Графика не окончательная! Скриншоты сервер: Скриншоты клиент: Сервер на комп, клиент Android (должны находиться в одной сети) P/S И так как все устройства у меня Full HD, проверял только на них( Monopoly.rar
  15. 8 баллов
  16. 8 баллов
    Тема: "Сравнение возможностей кроссплатформенных мобильных библиотек нативных приложений FMX и FGX Native" Дата и время: 20 декабря 2018 года в 12:00 (по московскому времени) Участники: @Brovin Yaroslav, Андрей Совцов Регистрация: ссылка Ссылка на официальный телеграмм канал: https://t.me/fgx_native Участие бесплатное Под конец уходящего нового года сравним текущие возможности кроссплатформенной библиотеки мобильной разработки FGX Native и FMX. Поговорим о перспективах развития и ознакомимся с ближайшим планом до выпуска публичной бета версии. Посмотрим в живую на новый функционал библиотеки, разработанный за последнее время. У вас будет возможность задать любые вопросы автору. Не пропусти эту возможность!
  17. 8 баллов
    Ну вот набросал примерчик. Он упрощенный, но смысл такой же примерно (код листвью со скриншота выше выложить не могу просто из-за того, что там идут зависимости от модели данных). Лично я все рисую кодом - так полный контроль того, что выводится на экран. И собственно так можно выводить практически что угодно. И не нужны никакие монструозные ТМС компоненты ListView_Schedule_Sample.zip
  18. 7 баллов
    Приступил к работе над большим демо-проектом, который призван продемонстрировать работу каждого компонента в библиотеке FGX Native. Работа будет продолжаться по мере добавления новых компонентов. Данный демо проект нужен не только показать возможности библиотеки, но он так же станет своеобразным наглядным руководством по настройкам компонентов. Ниже представлен пример страницы приложения, посвященный компоненту TfgLabel.
  19. 7 баллов
    В общем удалось решить проблему с кнопками пульта. Теперь приложение распознает все кнопки с пульта. Если кому-то нужно, прикрепил архив. (Delphi 10.3.1 Rio) fmx_androidkey_fix.zip
  20. 7 баллов
    krapotkin

    Переезд на 10.3 Rio

    сколько бед принесла уже стрельба в ногу под названием ProcessMessages как хорошо, что в Андроиде наконец всех отучат от этого крайне вредного трюка давайте формально все что там у вас "высоконагруженное" выносите в потоки и пусть они работают. Ваши "потоки" пасутся в главном (Synchronize) и никакого толка нет концепцию надо поменять. запустили поток и занимайтесь своим делом. например покажите Splash а вернется поток - вот по возвращению и сделаете то, что этот Splash закроет. и уж точно потоки не должны ничего общего иметь с формами я писал статью про потоки, там про сплеши тоже есть в блоге и про ProcessMessages отдельная боль... http://www.cyberforum.ru/blogs/469693/blog4875.html
  21. 7 баллов
    Евгений Корепов

    Runtime permissions in Delphi 10.3 Rio

    Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет) PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil); Вот так: PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason); PermissionRequestResult - это обработка ответа пользователя procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); begin if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти end else TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены') end; И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет. procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); begin TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ', procedure(const AResult: TModalResult) begin APostRationaleProc; end) end;
  22. 7 баллов
    Недавно решил одну проблемку, которая долго мучала - решил поделиться, может кому ещё пригодится. При работе с двумя мониторами или с монитором и проектором часто возникает необходимость запретить окну "исчезать" при наведении курсора мыши на миниатюру другого приложения в панели задач. Чтобы это сделать надо: uses ... Winapi.DwmApi ... TMainForm = class(TForm) ... protected procedure CreateHandle; override; ... end; ... procedure TMainForm.CreateHandle; var Val, Res: Integer; begin inherited CreateHandle; Val := 1; Res := DwmSetWindowAttribute(FormToHWND(Self), DWMWA_EXCLUDED_FROM_PEEK, @Val, SizeOf(Val)); {$IFDEF DEBUG} if Res <> S_OK then ShowMessage(SysErrorMessage(Res)); {$ENDIF} end; Спасибо @Alex7wrt за наводку
  23. 7 баллов
    Рад со всеми поделиться, что 13 ноября я принимаю участие в запуске RAD Studio 10.3 в Москве и выступаю с двумя докладами: один по FMX, второй про мою библиотеку FGX Native. На мероприятии в живую покажу возможности библиотеки, поговорим об особенностях, планах и сделаем нативное андроид приложение в прямом эфире. Не пропустите. Ссылка на регистрацию: http://softlinemail.ru/delivery/010918/zayvka1960/index.html
  24. 7 баллов
    dnekrasov

    FMX Form

    Не за что. Маленькое уточнение - это хорошо работает только если один монитор. Вообще правильнее эмулировать максимизацию окна следующим образом: SetBounds(Screen.DisplayFromRect(Bounds).WorkAreaRect);
  25. 7 баллов
    Написал в XE10.1 простой модуль для вывода кривых на TImage в виде графика - есть возможность вывода столбцов для диаграмм, меток с надписями и прочей мелочи. В виде компонента не оформлял... Смысл: вводим массив точек - график сам подбирает область вывода чтобы влезли надписи и выводит с указанными параметрами и стилем кривые (имею в виду зависимости Y от X). Есть комментарии в коде - есть пример для тестов - см. проект https://github.com/willi-spb/arTrassing желательно тестирование, возможно я что-то упустил - сам модуль: https://github.com/willi-spb/arTrassing/blob/master/FMX.arCurveClasses.pas
  26. 7 баллов
    В этом участке кода есть одна маленькая ошибка. Иногда это приводит к тому, что на некоторых кадрах теряется прозрачность. Я заменил на вот такое : GIF_DISPOSAL_BACKGROUND: begin LFrame.FDisbitmap.Clear(LLocalPalette[LGraphicsCtrlExt.ColorIndex].Color); MergeBitmap(tmp, LFrame.FDisbitmap, Bounds(0, 0, LFrameWidth, LFrameHeight), LFrame.FPos.x, LFrame.FPos.Y); end;
  27. 7 баллов
    Задачу решил. Вот измененная процедура, ну и добавил вытягивание параметра sound private Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) { int icon = this.mContext.getApplicationContext().getApplicationInfo().icon; Builder mBuilder = new Builder(this.mContext); mBuilder.setSmallIcon(icon); mBuilder.setTicker(msgTitle); mBuilder.setContentTitle(msgTitle); mBuilder.setContentText(msgText); mBuilder.setContentIntent(contentIntent); // savage if (msgSound == "") { mBuilder.setSound(RingtoneManager.getDefaultUri(2)); } else { mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/"+msgSound)); } // return mBuilder; } Звуковой файл надо добавить в Deployment Расположение res/raw/ При формировании push-сообщения имя файла указывается без расширения. К примеру, если звуковой файл был event1.mp3, то в пуше посылаем "sound":"event1" Во вложении патченый файл. Сборка fmx.jar и classes.dex как в этой теме NotificationPublisher.zip
  28. 7 баллов
    Набросал простенькую программу для создания стилей под все платформы на основе указанного. Программа только меняет информацию о платформе, никаких других измений со стилем не делает. К примеру есть стиль для Android - указываем его программе, - она создает стили для Windows, Mac, iOs на основе указанного. Затем их можно добавлять в StyleBook, запускать и отлаживать этот Android стиль под Windows, что сэкономит массу времени. Exe файл находится в \Win32\Release\Styles4Platforms.exe An app to convert current firemonkey style to other platforms based on the specified *.Style file. App only changes the information about the platform and does not do any other changes with the style. Styles 4 Other Platforms.7z
  29. 7 баллов
    Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
  30. 6 баллов
    Brovin Yaroslav

    [FGX Native] Релиз!!!

    Поздравляю всех с наступающим новым годом и рад сообщить вам о релизе FGX Native. Это были 3 года плодотворной работы над этим проектом. За это время была проделана колоссальная работа. И еще многое предстоит преодолеть и реализовать. Рад, что успел зарелизить проект до 2020 года. Спасибо всем участника альфа и бета тестирования за оказанную помощь, обратную связь и поддержку. Надеюсь, что вам понравится полученный продукт и с каждым днем он будет лучше и интереснее. Так же рад поделиться, что в моей команде прибыл один разработчик Виктор. Который помог мне подготовить релиз и продолжить трудится со мной над развитием проекта FGX Native. Это позволит делать больше крутых фич и естественно заниматься поддержанием качества продукта. Триал можно скачать здесь: https://forum.fgx-native.com/. Продажа начнется 1 января 2020 года. Всех с новым "безбажным" годом.
  31. 6 баллов
    Год назад в одной из веток проскочила ссылка на китайский сайт (http://www.raysoftware.cn/?p=559), где предлагалось готовое решение для показа анимированных гифок средствами FireMonkey на любых платформах. Сейчас эта ссылка, как и весь сайт raysoftware.cn, упорно не открывается; по счастью, контент сохранился в гугловском кэше. Я скопировал оттуда код юнита и перевел гуглом все китайские комментарии на английский, добавив их в скобках. Там был еще сопроводительный текст, в котором автор излагал мотивы, побудившие его взяться за эту проблему; каких-то важных технических деталей я в этом тексте не увидел. Привожу весь юнит ниже и очень надеюсь, что кто-нибудь из продвинутых коллег объяснит мне, как именно этим кодом можно воспользоваться, чтобы показать пользователю анимированный файл в формате GIF. Моей программерской квалификации, к сожалению, не хватает.
  32. 6 баллов
    сделано на Datasnap - 3х звенка MsSql- Сервис Https - Клиент ( Андроид, Ios, Win, Mac) Личный кабинет пациента клиники (www.familydoctor.ru) открывает зарегистрированным пользователям доступ к медицинской карте (результаты лабораторных исследований и функциональной диагностики, описание приемов врачей, направления и рекомендации, истории посещений клиники (дата, время, специалист), программам медицинского наблюдения (перечень, период прикрепления), информации о движении средств по депозитам. Для пересылки выписок (файлов) из медицинской карты используется электронная почта (в системе должен быть настроенный Майл Агент на отправку почты).Полной версией приложения могут воспользоваться только пациенты, подключившие услугу "Личный кабинет" в регистратуре любого корпуса клиники "Семейный доктор".В новой версии изменен дизайн, появились новые функции и разделы:вход по номеру медкарты или ФИО;запрос нового пароля;заявка на онлайн запись;отмена приема;прейскурант услуг клиники;справочник адресов клиники. сервис оплаты услуг клиники через приложение.В ближайшем будущем функционал личного кабинета будет дополнен онлайн расписанием специалистов, возможностью электронной записи на приём. в гугл плее https://play.google.com/store/apps/details?id=com.familydoctor.FD Есть тестовый вход, обращайтесь.
  33. 6 баллов
    Это приложение для OS Windows выполняет: 1.Расчёт сцепления: -расчёт и подбор геометрических параметров нажимного и ведомого дисков, муфты выключения; -проверка параметров по теплонагруженности пар трения; -расчёт всех наиболее нагруженных деталей сцепления (пружины, пластины, подшипник). 2.Расчёт пневмогидравлического привода сцелпения: -подбор и проверка управляющего и исполнительного органов; -объём жидкости. 3.Возможность вноса и редактирования исходных данных и результатов в БД. 4.Распечатку всего расчёта с исходными данными, формулами, графиками, используемой литературой и результатами в MS Word. 5.Просмотр и изучение нажимного, ведомого дисков и муфты выключения в 3D. Изначально для работы в приложении необходимы некоторые знания конструкции сцепления и теории расчёта. Автор: Олег Киреев-ведущий инженер-конструктор, kireevoleg1966@gmail.com, +375 29 676 13 84 БЕЛАРУСЬ, г.Минск. Приму Ваши замечания и предложения. По совету Равиля Зарипова РАЗМЕСТИЛ на файлообменнике 12.08.2019г по этой: https://mega.dp.ua/a27WmeXKwY ссылке. На этом ресурсе обещают хранить 90 дней. Интересно услышать Ваши отзывы.
  34. 6 баллов
  35. 6 баллов
    dnekrasov

    Перехват сообщений в Windows

    Делаем как обычно, если надо переопределить какое-то событие окна interface uses {$IFDEF MSWINDOWS} Winapi.Windows, Winapi.Messages, FMX.Platform.Win, {$ENDIF} System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private procedure CreateHandle; override; {$IFDEF MSWINDOWS} procedure WMIMENotify(var Msg: TMessage); message WM_IME_NOTIFY; {$ENDIF} public end; var MainForm: TMainForm; implementation {$R *.fmx} {$IFDEF MSWINDOWS} var OldWndProc: Pointer = nil; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var Mess : TMessage; begin case Msg of WM_IME_NOTIFY: begin Mess.Msg := Msg; Mess.WParam := wParam; Mess.lParam := lParam; Mess.Result := 0; MainForm.Dispatch(Mess); Result := Mess.Result; end; else Result := CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; end; {$ENDIF} { TMainForm } procedure TMainForm.CreateHandle; begin inherited CreateHandle; {$IFDEF MSWINDOWS} OldWndProc:= Pointer(SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, Integer(@NewWndProc))); {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMainForm.WMIMENotify(var Msg: TMessage); begin {что-то делаем} end; {$ENDIF}
  36. 6 баллов
    Tumaso

    Переход на новую модель разрешений

    @Alex7wrt, устанавливают в том числе и новые пользователи на старых версиях андроида, и у них работает. minSdkVersion для этого. Что касается targetSDK, то этим значением приложение уведомляет операционку, что возможно будет использовать api вплоть до данной версии. targetSDK 27 пока не использовал, только 26, и все что надо работает. В самом коде делаю анализ текущей версии SDK, и в зависимости от нее возможно делаю дополнительные действия. Вот например, работа с правами: {$IFDEF ANDROID} // для Android 6+ требуется дополнительная работа с правами if TJBuild_VERSION.JavaClass.SDK_INT >= 23 then begin if (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_READ) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) or (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_WRITE) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) then begin // необходимо запросить разрешение на использование галереи LIsWaitPermissions := True; TAndroidHelper.Activity.requestPermissions( CreateJavaStringArray([PERMISSION_FILE_READ, PERMISSION_FILE_WRITE]), BUTTON_FILE ); end; end; {$ENDIF}
  37. 6 баллов
    Друзья. Будьте просто уважительны друг к другу! Не стоит ссориться, тем-более - по пустякам. Далеко не каждый!!! может себе позволить - покупать ПО по таким ценам, которые предлагает абракадабра. А те, кто говорит, что может себе это позволить - лукавят) Потому-что, чаще всего, это не те версии, которые действительно требуются... Стоит "копнуть чуть глубже", - окажется, что этим разработчикам самим нужна более расширенная версия. А там стоимости уже сопоставимы с ценой на новый автомобиль... (И не надо меня ни в чем тут убеждать и спорить)) - я знаю о чем я говорю). (И еще. Не говорите тут (да и вообще) - что у других все бесплатно и прекрасно))) Бесплатного нет ничего и ни у кого! Если Вы так говорите - Вы просто еще не дошли до той стадии, когда Вам потребуется отвечать за использование этих продуктов (любой IDE), согласно тем же условиям и соглашениям, которые большинство "подписывают", даже не читая..) Давайте начнем с того - что тут большинство право! И те кто хает среду разработки и те, кто ее поддерживает. Во-первых - среда (IDE) как была глючной, так и остается ею, до сих пор. Причем, чем дальше - тем больше. (А уж после того как разогнали наших разработчиков из абракадабры - совсем дело пошло хреново. Потому, до сих пор, и сижу на Берлине, и пока не собираюсь с него переходить. А уж сколько "родного" кода было исправлено и заменено - ...) Однако! Продукт все же как-то развивается. И, как ни странно, - у него даже есть перспективы! (Это я и про разработки Ярослава (которых мы очень ждем) и про Евгения Крюкова и другие). Это во-первых. Во-вторых - альтернативы как небыло, так и нет! Повторюсь - альтернативы нет! Кто тут будет рассказывать про C# и Visual Studio, про Android Studio и прочие "обвески" - тогда чего Вы тут вообще делаете? На этом форуме? А? А раз Вы тут, значит и Вы понимаете, - ничего, пока, действительно стоящего, нет! Ну вот нет такой среды, где так просто можно создавать продукт для разных платформ одновременно. Я прекрасно понимаю, что абракадабра движется не в том направлении, в каком стоило бы... Мы, в большинстве своем, все это понимаем. Но потому и Ярослав и другие разработчики движутся в другом направлении! И хотя концепция их продуктов в принципе отличается от FMX, - они двигаются в верном направлении, я думаю. Пару слов в защиту платных курсов Ярослава (без подтекста, как есть!) Ярослав не меценат, как я думаю)) Ему, как и всем нам, нужно кушать самому, кормить семью, и т.д. и т.п. Он тратил свои собственные силы и время, создавая эти курсы. Почему он должен их раздавать бесплатно? Он и так создал этот форум, за что ему огромное спасибо! Где он и другие участники отвечают на вопросы. Что касаемо самих курсов. Если бы они появились раньше - я бы сам, с удовольствием, с ними бы познакомился (купил). Потому-что время, потраченное мной на изучение FMX, начиная с самой первой версии, исчисляется многими месяцами. И оно того не стоило бы - если бы данные курсы появились бы раньше. Просто ознакомившись с ними, Вы получите самое главное - огромное количество сэкономленного времени! Собственно, это все что я хотел сказать... И так написал что-то дофига... Простите за такой холст... З.Ы. Всем успехов и удачи!
  38. 6 баллов
    есть более интересный и по-мне, более правильный способ по нажатию в меню не сразу выполняете что-то, а ЗАПИСЫВАЕТЕ действие, которое ВЫПОЛНИТСЯ по событию закрытия мультивью тогда реакция наступает визуально правильная и дальше крутите колеса, запускайте потоки и все такое
  39. 6 баллов
    ENERGY

    Что невозможно сделать на Delphi для Android?

    Delphi хоронят уже лет 15, это все слова. Нет идеальных инструментов. У всех какие то косяки, втч и у нативных средств, ведь все это придумывают люди, люди не роботы. На деле Delphi отличное средство для мультиплатформенной разработки вполне сложных программ. Мне как фрилансеру вполне хватает. Производительность гораздо лучше чем у Angular\Ionic, которые по факту WebView - веб в браузере - очень тормозное решение и подходит только для формочки "логин\пароль". Также по производительности и глюкам Delphi имхо лучше чем ReactJS, и Xamarin aka Mono. Во фрилансе огромная конкуренция, в основном индусы, в этом плане с Delphi можно быстрее разработать ПО чем предлагают сроки остальные. Проблема Делфай в том что оно дорогое, и не так распространено - (это взаимосвязанный фактор) - таким образом сложно найти команду и мало проектов на нем разрабатывается, меньше сообщество и меньше документации и библиотек с готовыми решения Поэтому для одиночек это больше подходит. Но конечно нужно смотреть на развитие - вот Токио получилась очень сырым продуктом, я до сих пор на Берлине пишу под 4 платформы, если следующая версия выйдет такой же ультраглючной, то следует задуматься. А вообще хороший программист - это тот кто знает несколько языков, не бойтесь учить новое - опыт ускорит разработку с любым инструментом.
  40. 6 баллов
    ENERGY

    [Отклонение] TFloatAnimation и TFrame

    Столкнулся с такой же проблемой, если любой компонент (в моем случае TImage ) лежит на фрейме не работает TFloatAnimation вообще. Решение: При создании фрейма нужно указывать Self формы, а не nil. : MyFrame := TMyFrame.Create(Self);
  41. 6 баллов
    ENERGY

    Как нарисовать круглый TImage

    С помощью маски можно любую форму.TBitmap.CreateFromBitmapAndMask(). В результате получим изображение с прозрачностью, в данном случае звезда и прозрачный фон. procedure TForm1.Button1Click(Sender: TObject); var ImageRes: TResourceStream; Result: TBitmap; tmpMS : TMemoryStream; begin ImageRes := TResourceStream.Create(HInstance, 'IMAGE', RT_RCDATA); try Image1.Bitmap.CreateFromStream(ImageRes); Image2.Bitmap.LoadFromFile('c:\temp\MaskedBitmap\Images\Mask.png'); Result := TBitmap.Create; Result.CreateFromBitmapAndMask(Image1.Bitmap, Image2.Bitmap); // applying alpha channel to Bitmap - workaround. If you can improve write here how tmpMS := TMemoryStream.Create; Result.SaveToStream(tmpMS); Result.LoadFromStream(tmpMS); tmpMS.Free; Image3.Bitmap.Assign(Result); finally ImageRes.Free; Result.Free; end; end; MaskedBitmap.zip
  42. 6 баллов
    ophion

    Записать картинку с камеры в BLOB

    Вот пример того, как писать и читать BLOB procedure SaveToFireDACBlob; var MemStream: TMemoryStream; begin FireDAC.Connected := True; MemStream := TMemoryStream.Create; try Image1.Bitmap.SaveToStream(MemStream); MemStream.Seek(0,0); FDQueryInsert.ParamByName('Media').LoadFromStream(MemStream,ftBlob); FDQueryInsert.ParamByName('MType').AsString := '0'; FDQueryInsert.ExecSQL(); except on e: Exception do begin ShowMessage(e.Message); end; end; MemStream.Free; FireDAC.Connected := False; end; procedure LoadFromFireDACBlob; var BlobStream: TStream; begin FireDAC.Connected := True; try FDQuerySelect.Open; FDQuerySelect.First; while(not FDQuerySelect.EOF)do begin // access a stream from a blob like this BlobStream := FDQuerySelect.CreateBlobStream(FDQuerySelect.FieldByName('Media'),TBlobStreamMode.bmRead); // access a string from a field like this if (FDQuerySelect.FieldByName('MType').AsString='0') then begin // load your blob stream data into a control ImageViewer.Bitmap.LoadFromStream(BlobStream); end; BlobStream.Free; FDQuerySelect.Next; end; except on e: Exception do begin //ShowMessage(e.Message); end; end; FireDAC.Connected := False; end; {источник http://www.fmxexpress.com/read-and-write-a-blob-field-using-firedac-with-firemonkey-on-android-and-ios/} Касательно работы с изменением качества/размера, считаю что необходимо использовать TBitmapSurface (unit FMX.Surfaces)
  43. 5 баллов
    Практически любое мобильное приложение сложно представить без стандартной навигации. В FMX меню обычно делается на базе TListBox. Однако, при всей гибкости данного компонента зачастую создать меню, которое будет следовать гайдлайнам ОС довольно сложная задача, поскольку она требует хороших навыков работы со стилями. Именно с этой целью разработан новый компонент TfgListMenu для FGX Native, который значительно упрощает создание меню навигации в вашем приложении. Компонент полностью построен с использованием концепций материал дизайна для андроида и следует всем его рекомендациям. Данный компонент использует заранее разработанные стили пунктов меню, которые позволяют быстро и гибко создать навигацию по примерам, изображенным ниже. Помимо этого компонент поддерживает несколько режимов выделения итемов. Начиная от работы без выделения и заканчивая множественным выделением элементов. На уровне каждого пункта меню в отдельности можно настроить реакцию пукнта меню на выделение и нажатие. Screenrecorder-2018-05-23-03-34-12-146.mp4
  44. 5 баллов
    Обновлена серия статей на тему использования Uses Permissions. Uses Permissions: Теория Uses Permissions: Добавляем метод onRequestPermissionsResult в приложение (для Delphi 10.1/10.2) Uses Permissions: Практика (для Delphi 10.3) Автор: Андрей Ефимов
  45. 5 баллов
    Пока тестировал хелпер в боевом проекте он потихоньку оброс исрпавлениями/улучшениями: Загрузка из потока сделана через TBitmapSurface - это позволяет избежать множества глюков. LoadFromStream вынесен из Synchronize (основного потока) в поток HTTPClient - по результатам бенчмарка операция оказалась самая жручая. После исправления интерфейс перестал залипать совсем. Добавлен overload вариант с передачей в процедуру TListItemImage - для использования в TListView и корректной перерисовки подгруженных картинок через AListItemImage.Invalidate. unit BitmapAsyncLoader; interface uses FMX.Graphics, FMX.Surfaces, System.Net.HttpClient, System.Types, System.Classes, FMX.ListView.Types, FMX.ListView.Appearances; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromURLAsync(const AUrl : String); overload; procedure LoadFromURLAsync(const AUrl : String; const AListItemImage : TListItemImage); overload; end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self)then Assign(ABitmapSurface); ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self) and Assigned(AListItemImage) then begin AListItemImage.BeginUpdate; Assign(ABitmapSurface); AListItemImage.Invalidate; AListItemImage.EndUpdate; end; ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end. Тестовый проект, на этот раз с ListView (по кнопке добавляется 100 итемов) прилагаю. BitmapAsyncLoaderListView.7z
  46. 5 баллов
    Slym

    Артефакты на экране (Android)

    Боролись как-то с артефактами отображения (мы их прозвали "крокодилами" из-за сходства на первом скриншоте с этим багом)... Могли отображаться также левые спрайты, или обрезки скролившихся контролов... Коллега выяснил что не надо трогать Form.Fill, из-за переключения в недрах FMX нативной и не нативной канвы: если нужен фон - брось Rect по контенту и в нем делай заливку...
  47. 5 баллов
    Fedor K

    JAVA и Delphi

    @Pavel M, Судя по вашей обертке класса и самой JAR: Нужно удалить все не статические методы из описания интерфейса наследуемого от JObjectClass: JUserClass = interface(JObjectClass) ['{A4B29440-8C8B-4C1F-A8E7-B7612D4FEEB4}'] function init(uuid : JString; secondName : JString; firstName : JString; inn : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; function init(uuid : JString; secondName : JString; firstName : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; end; У класса User нету конструктора по умолчанию, поэтому вызов такого кода вызовет ошибку: //неправильный вариант с ошибкой TestClass := TJUser.Create; //правильный вариант TestClass := TJUser.JavaClass.init( StringToJString('uuid'), StringToJString('secondName'), StringToJString('firstName'), StringToJString('phone'), StringToJString('pin'), StringToJString('roleUuid'), StringToJString('roleTitle') ); Если к проекту подключаете любые JAR файлы, то следите, чтобы вместе с ними были подключены и все остальные .jar библиотеки с классами, на которые ссылаются исходники. Например, в Вашем примере при вызове вышеприведенного конструктора первым делом выскочит ошибка: Вам нужно найти все такие подключения и найти сборки, в которых они валяются: Если в проекте в Android Studio включено копирование всех сторонних библиотек в папку libs, то после компиляции всего преокта практически все либы можно найти: папка libs; output папке проекта; папка Android SDK. п.с. Тему лучше перенести в раздел Android, так больше шансов получить помощь.
  48. 5 баллов
    sinuke

    Ошибки при переходе в Токио

    Как я понимаю модуль FMX.FontGlyphs.Android.pas подключен из Берлинской версии студии. Вам нужен этот файлик для Токио. Как я понимаю, используете что-то типа FontAwesome. Например, на гитхабе Равиля этот файл есть версии и для Берлин и для Токио.
  49. 5 баллов
    Кривяков Виталий

    Асинхронный NetHTTPClient

    Добрый день! Все проще, гораздо. Net := THTTPClient.Create; Net.BeginPost( procedure (const Value : IAsyncResult) begin AsyncResult(Value); // Вот тут можно вызвать любую процедуру, или просто обработать результат. end, URL, InputStream, OutputStream, Headers); В анонимной процедуре просто вызываете нужную процедуру, для интерактивной одну, для периодических запросов другую.
  50. 5 баллов
    Brovin Yaroslav

    Приведение типа - as

    Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть: 1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию. procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом. procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end;
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...