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

Поиск сообщества

Показаны результаты для 'размер приложения'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Общие вопросы
    • Анимация
    • Графика
    • Стили
    • Базы данных и REST
    • Компоненты
    • Положение, размеры, выравнивание
    • Работа с текстом
    • Приложение и формы
    • Отладка
    • Развертывание приложений
    • Вопросы по языку Object Pascal и RTL
    • Общая информация о TControl
    • События
    • Прочие вопросы
  • Вопросы по платформам
    • Android
    • iOS
    • OSX
    • Windows
    • Windows Phone
    • Linux
  • Вопросы по использованию RAD Studio
    • Лицензирование
    • Сборка проектов
    • Multi-Device Designer
    • Редактор кода
    • Вопросы
  • Обучение
    • Основная информация
    • Вопросы
    • Отзывы
  • Поиск специалистов по FireMonkey
    • Консультации
    • Ищу подрядчика
  • Дополнительные ресурсы по FireMonkey
    • Сторонние компоненты
    • Приложения, написанные с использованием FireMonkey
    • Примеры
    • Руководства
    • Шаблоны
    • Статьи и заметки
    • Информация о версиях RAD Studio
    • Новости
  • Организация работы данного форума

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


StackOverflow


Защита от ботов


Город


Интересы

  1. Вспомнил о приложении-скринсейвере, на который наткнулся ещё в "лохматые" годы. Morph3D. Исходники лежат тут: Исходники.RU - Информационный сервер для программистов: исходники со всего света. (sources.ru) Откомпилировал на Александрии, заменив PChar на PAnsiChar. Исходник увеличился в 2.5 раза... Почему так произошло?
  2. Когда вы говорите, что приложения на Андроиде весят 400КБ и используют библиотеки Java размером 2ГБ, вы, по-видимому, имеете в виду разницу между размером исполняемого файла приложения и размером всех библиотек, которые оно может использовать во время выполнения. Современные фреймворки, такие как Java для Android или .NET, часто используют большое количество библиотек, которые содержат общий код, используемый многими приложениями. Эти библиотеки обычно устанавливаются один раз и затем используются множеством приложений, поэтому их размер не влияет на размер каждого отдельного приложения. С другой стороны, приложения, созданные с использованием Delphi, обычно компилируются в нативный код и включают в себя все необходимые библиотеки и зависимости. Это может привести к тому, что исполняемые файлы будут больше, чем если бы они использовали общие библиотеки, но они не зависят от установленных библиотек времени выполнения. С точки зрения конечного пользователя, размер приложения часто не является ключевым фактором, особенно с учетом того, что современные устройства имеют большое количество памяти. Однако для разработчиков может быть важно минимизировать размер приложения, чтобы сократить время загрузки и уменьшить использование ресурсов. В итоге, вопрос "маленькие или большие приложения" зависит от контекста и требований конкретного приложения. В некоторых случаях использование общих библиотек может быть выгодно, в других - предпочтительнее иметь самодостаточное приложение с включенными в него всеми необходимыми библиотеками.
  3. Ради интереса снес Seattle поставил Berlin и удивился, что пустое приложение на Berlin занимает 31 метр, а на Seattle пустое приложение весило около 6 метров. На устройстве. Как это так может быть? Я озадачен. Есть у кого соображения?
  4. Не знаю из за чего так случилось, но размер примитивного приложения достиг до 45 мб. Открыл архив apk lib\armeabi-v7a\ там один лишний so файл. Один вот такого вида "libIzohli lugat.so" а другой такой "libIzohli_lugat.so" откуда оно появляется никак не пойму.
  5. Здравствуйте! Прошу прощения, если не в тот раздел написал Вопрос: У меня есть планшет и телефон Телефон имеет ОС Android 4.4 Планшет имеет ОС Android 4.2.2 Когда компилирую приложение на телефон - его размер, уже установленного =~60 мб Когда компилирую приложение на планшет - его размер, уже установленного =~ 20 мб Почему такая разница?
  6. Привет всем! Имеется несколько устройств, используемых для отладки: 1. Samsung GT-I9082 - Android 4.2.2 2. Sony Ericsson XPERIA Neo (MT15i) - Android 4.0.4 3. Sony Ericsson XPERIA ArcS (LT18i) - Android 4.0.4 После сборки и запуска приложения из RAD Studio XE7 (Delphi): На Samsung GT-I9082 - 14,45 МБ; На Sony Ericsson XPERIA Neo - 47,95 МБ; На Sony Ericsson XPERIA ArcS - 47,95 МБ. Размер смотрел в устройствах в меню Настройки-Приложения... Чем вызвана такая разница в объемах? Разные способы подсчета? Под более старые версии Андроид-систем требуется больше упаковать кода? Под какое устройство производить итоговую компиляцию и сборку, если оборудование конечного потребителя неизвестно? Какие есть подводные камни? Поделитесь, пож-та, опытом...
  7. Здравствуйте, коллеги. У меня такой вопрос. А у всех ли, приложения собранные для iOS, занимают так много места? У меня, например, небольшое приложение с несколькими TabControl и парой ListBox занимает почти 17 Мб в итоге. Для AppStore это значительный объем. Это как-то связано с самой средой Delphi? Спасибо.
  8. Скажите, возможно ли уменьшить размер приложения? Неужели приложение тянет за собой такой большой фрейм, что даже hello world весит ~25мб?!
  9. Если говорить о размере приложения. То первоначально нужно понять, что входить в состав пакета? Затем определить, что нужно и не нужно? Давайте посмотрим на примере состав пакета небольшого Андроида приложения, написанного в RAD Studio XE5 Delphi. В качестве примера, я взял приложение PhotoEditorDemo, доступный на официальном Open Source проекте примеров RAD Studio XE5 Это пример кроссплатформенного простого фоторедактора: Описание примера: http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMX.Mobile.PhotoEditorDemo_Sample_(Delphi) Исходники: http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE5_Update/FireMonkeyMobile/Delphi/PhotoEditorDemo/ Размер сжатого приложения Собираем приложение и смотрим на результирующий пакет PhotoEditorDemo.apk (Он располагается в директории .\Android\Debug\PhotoEditorDemo\bin относительно корня проекта). После сборки приложения его размер ~6 760 КБ (в зависимости от Debug or Release сборки). Это размер сжатого пакета нативного приложения. Размер распакованного приложения Если мы распакуем ZIP архиватором этот файл, то увидим его содержание: В распакованном виде, пакет занимает 21,7 МБ. Состав пакета Что же входит в его состав: lib - место хранения собранных натиных библиотек приложения. Поскольку приложение нативное, то оно работает на основании библиотеки .so. res - место хранения ресурсов приложения (картинки, иконки и тд) META-INF - хранение подписи приложения, контрольные суммы файлов ресурсов (картинок, звуков и т.д.) AndroidManifest.xml - манифест приложения (расширенный аналог VersionInfo в Windows) classes.dex - файл с java реализацией дополнительного функционала FireMonkey. resources.arsc - таблица ресурсов. В этом файле собраны xml-описания всех ресурсов. Самый значительный вклад в размер пакета вносят: libPhotoEditorDemo.so (20 060 КБ) - непосредственно сам бинарник приложения classes.dex (1 948 КБ) - частичная реализация FireMonkey на java. Размер самого приложения большой потому, что включает в себя полностью все Delphi библиотеки, которые используется FireMonkey. А это: RTL Хедеры для доступа к Android API Нативные стили для Android (три стиля - 1х, 1.5x, 2х, 3х скалирования экрана). Каждый стиль содержит исходную png картинку нативного стиля. Фильтры и эффекты FireMonkey Вся остальная реализация FireMonkey. Довольно большой набор того, что нужно включить в пакет и тяжело выбросить. Если говорить о приложении написанном в Eclipse, то приложение включает в себя только часть пользовательского кода. И размер мал за счет того, что весь Android API находится перманентно на самом устройстве (не в пакете). Если бы используемая часть библиотек FireMonkey находилась на каждом устройстве, то размер приложения сократился бы раза в четыре. Вывод Размер установочного пакета приложения, написанного на FireMonkey не большой для нативных приложений порядка 6 760 КБ для реализации простого фоторедактора (Хотя для кого-то это может быть много). В установленном виде приложение занимает от 20 000 КБ. Основная причина полная интеграция используемых библиотек в пакет приложения. Вероятность уменьшить этот размер маловероятна. Однако увеличение функционала приложения не так сказывается на дальнейший рост приложения. Можно попробовать сделать усеченные библиотеки, сократить функциональность. Но это не даст ощутимого уменьшения результирующего размера приложения. На сколько важен размер приложения для конкретной работы приложения каждый заказчик решает сам. P.S. Цель этого ответа дать подробный ответ о причинах такого размера, а не попытка вызвать обсуждение на тему сравнения сред разработки. Каждый framework обладает своими достоинствами и недостатками. И выбор средства разработки диктуется совокупностью требования заказчика.
  10. Подключить Firebase не получилось. Напишу по памяти, так как время прошло уже прилично и это мои собственные умозаключения не претендующие на истину. Было много различных попыток подключить Firebase , основная проблема, что нет в наличии библиотеки jar, последняя библиотека лежит в maven репозитории и она уже устарела, по-моему от 2019 года. Ссылка на maven репозиторий Firebase, да и многие другие предлагают использовать только Gradle, что не дает мне возможность использовать это для Delphi . После общения с поддержкой от Firebase (если сильно упростить), мне предложили изменить среду разработки. Но приложение уже было полностью готово для двух мобильных платформ, и мне пришлось искать другие SDK. Я перебрал многие, которые предлагали помимо установки с помощью Gradle, скачать SDK в виде файла jar или aar (из aar иногда можно добыть jar, но это только иногда, например в последних firebase его там нет) Забыл сказать, что для всех манипуляций, обязательно нужна установленная и запущенная Android Studio, и подключенный телефон, на который Delphi устанавливает приложение. В Android Studio я собрал проект с таким же именем, как и у моего Delphi приложения, для удобства отладки и контроля логов logcat. В приложение на Android Studio я подключил через Gradle нужное мне SDK и проверил его работоспособность, скопировал логи правильной работы приложения, отследил результаты на сайте аналитики, увидел что они действительно появились, и все данные телефона (размер экрана, марка ...) пришли в аналитику. Включил режим debag на стороне аналитики. Эти действия я проделывал и с Firebase, приложение написанное на Android Studio запускалось без проблем, приложение написанное на Delphi, в силу отсутствия новой библиотеки jar не запускалось и сыпало в logcat целые "простыни" ошибок, никакие данные в аналитику не приходили. Я пробовал вытащить нужную мне библиотеку Firebase из собранного в Android Studio dex файла, рабочего приложения. Затем вычленить из него нужные мне файлы и прикрепить их Delphiпроекту в виде jar библиотеки, но появлялась новая проблема, конфликты с уже установленными библиотеками на Delphi, отключение которых уже не позволяло собрать dex файл для Delphi проекта. Остановился я на SDK AppsFlyer, интеграция была возможна, так как сервис предлагал добавление SDK с помощью Gradle и возможность скачать и установить вручную. Саму библиотеку я подключил, но возникла проблема с получением событий, которые приходили например от google play Вот пример того что не получилось сделать: AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } Эти события, никак не удалось получить, и решить проблему не удалось, информации я не нашел. Было принято решение попробовать другое SDK. На этот раз это была Yandex AppMetrica, эта интеграция получилась. Для начала у них в доках по интеграции написано что есть возможность скачать jar и что все библиотеки (старые версии мне в дальнейшем тоже пригодились) есть в maven репозитории Далее я добавил библиотеку в проект, и приступил к созданию файла моста, для связи Вот сама библиотека: com.yandex.androidmobmetricalib3.20.1.jar.7z Файл мост я создавал с помощью утилиты java2op, которая находится в ... Embarcadero\Studio\21.0\bin\converters Но, при создании я получил ошибку, что-то там дублировалось и что-то мешало. Пытался проделать это с конкретным классом, но ничего не получилось. Оставалось только или делать файл ручками, или надеяться что в одной из старых библиотек все сгенерируется. Эмпирическим методом была найдена старая библиотека, в которой название методов нужного мне класса осталось прежним, а ошибка с дубликатами ушла. Файл мост был создан. Android.JNI.Yandex.pas.7z Осталось подключить его к моему приложению. Был создан класс, который работал с нужными мне методами SDK Yandex аналитики (Android.JNI.Yandex): unit YandexAnalytics; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Android.JNI.Yandex, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Os, Androidapi.JNI.App, {$ENDIF} FMX.Types; type TYandexMetrica = class private public {$IFDEF ANDROID} YAC : JYandexMetricaConfig; YA : JYandexMetrica; {$ENDIF} constructor Create; procedure SendEvent(Category, Action, LabelName : String; LabelValue : Integer); end; implementation constructor TYandexMetrica.Create; var AnKey, AnRepKey : JString; begin try AnKey := StringToJString('86e64a77-XXXX-XXXX-XXXX-XXXXXXXcbbc'); AnRepKey := StringToJString('20799a27-XXXX-XXXX-XXXX-XXXXXXX14180'); YAC := TJYandexMetricaConfig.JavaClass.newConfigBuilder(AnKey).withLogs().build; YA := TJYandexMetrica.Create; TJYandexMetrica.JavaClass.activate(TAndroidHelper.Context, YAC); TJYandexMetrica.JavaClass.enableActivityAutoTracking( TAndroidHelper.Activity.getApplication ); Log.d('================= TYandexMetrica.Created ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.Create -> ' + E.Message ); End; END; end; procedure TYandexMetrica.SendEvent(Category, Action, LabelName : String; LabelValue : Integer); begin {$IFDEF ANDROID} try Log.d( 'TRY YandexMetrica.SendEvent -> ' + Category + ',' + Action + ',' + LabelName + ',' + LabelValue.ToString ); TJYandexMetrica.JavaClass.reportEvent(StringToJString(Category), StringToJString('{"Action":"' + Action + '", "LabelName":"' + LabelName + '", "LabelValue":"' + LabelValue.ToString + '"}')); Log.d('================= Event Sended ======================'); EXCEPT on E : Exception do Begin Log.d( E.ClassName + 'YandexMetrica.SendEvent -> ' + E.Message ); End; END; {$ENDIF} end; end. В событии приложения onCreate создал экземпляр класса, и отправил событие YA := TYandexMetrica.Create; YA.SendEvent('AppEvent','Started',User.Client_Id, 0); Было добавлено в файл AndroidManifest.template.xml (информация из яндекс документов по интеграции) <%services%> <service android:name="com.yandex.metrica.MetricaService" android:enabled="true" android:exported="true" android:process=":Metrica"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="com.yandex.metrica.IMetricaService" /> <data android:scheme="metrica" /> </intent-filter> <meta-data android:name="metrica:api:level" android:value="16" /> </service> <receiver android:name="com.yandex.metrica.MetricaEventHandler" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.yandex.metrica.intent.action.SYNC" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> <data android:scheme="package" /> </intent-filter> <!-- Необходимо для трэкинга кампаний --> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> Пример логов из logcat, из которых видно что библиотека инициализирована, и отправлены два события [AppEvent] и [Balance] 2021-07-01 14:02:17.108 15138-15168/? I/AppMetrica: [ru.yandex.mobile.appmetrica] : [27889a6e-xxxx-xxxx-xxxx-xxxxxxxx3c64] Initializing of Metrica, Release type, Version 3.5.3, API Level 76, Dated 30.01.2019. 2021-07-01 14:58:48.979 18460-18460/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: Activate AppMetrica with APIKey 86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Enable activity auto tracking 2021-07-01 14:58:49.033 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"Started", "LabelName":"2905202123125", "LabelValue":"0"} 2021-07-01 14:58:49.034 18460-18531/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:58:49.233 18542-18567/? I/AppMetrica: Initializing of Metrica, Release type, Version 3.20.1, API Level 94, Dated 14.04.2021. 2021-07-01 14:58:49.263 18542-18567/? I/AppMetrica: Activate reporter with APIKey 20799a27-xxxx-xxxx-xxxx-xxxxxxxx4180 2021-07-01 14:59:13.975 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: AppEvent. With value: {"Action":"ProfilesDeleted", "LabelName":"alex", "LabelValue":"319"} 2021-07-01 14:59:31.368 18460-18531/? I/AppMetrica: [com.soclikes_ig] : [86e64a77-xxxx-xxxx-xxxx-xxxxxxxxcbbc] Event received: Balance. With value: {"Action":"TrStart", "LabelName":"2905202123125", "LabelValue":"3"} Вот такие данные пришли в аналитику. +1 пользователь +2 события
  11. Hi All, Delphi 10.3.3, FMX, Android 32bit 1) Есть основная форма приложения Form1. Есть форма приложения для логина Form2 (на ней пара TEdit, пара TButton). Вызываю из Form1 форму Form2 в модальном режиме с асинхронной процедурой обработки выбора. Все работает, но есть один момент: окно Form2 открывается на весь экран смарта (полностью закрывая собой основное окно Form1), а хотелось что бы оно было небольшого размера по центру основного окна (по типу ShowMessage).. Вопрос: Как это сделать ? 2) И еще небольшой вопрос. В качестве Android устройства у меня смартфон Thl 5000 (с экраном 5"). В IDE в ModelView я соответственно выбираю строку Android 5" Phone. Но когда на смартфоне запускает приложение, то я вижу что размер формы созданный Delphi в ModelView больше чем реальный размер окна (часть элементов на нем не видна, она получилась за границами экрана). Вопрос: В чем тут может быть причина ? 3) Кидаю на форму GroupBox, внутрь помещаю TEdit и устанавливаю у него Align = Top. В результате TEdit залазит на заголовок (Caption) у GroupBox'a. Если такое же сделать в VCL, то там все нормально и TEdit располагается ниже GroupBox.Caption. Вопрос: Это что какая то особенность FMX или это ошибка FMX ? Можно ли как то это поправить ?
  12. Если с самого начала, при проектировании приложения задать произвольный шрифт, например 12 , то потом можно программно его изменить через TextSettings.Font.Size := xxx; Но если оставить шрифт Default , то потом шрифт программно нельзя изменить. Есть какие-то методы, чтобы можно было изменить размер шрифта в любом случае?
  13. Мне кажется, что проблема в расхождении ожиданий пользователей и заявлений IDERA ! Когда слышишь про RAD Studio и читаешь описание, создается иллюзия (по крайней мере у новичков), как будто надо просто накидать визуальных компонентов на форму, нажать "Запустить" и скомпилировать для всех платформ! И затем наступает разочарование, что не все так просто и есть ньюансы, но "осадочек остается"! Ключевое слово - "разочарование" - в этом суть проблемы (психологии), как мне кажется! Я бы предложил, например, новичкам, начать с разработки на Android Studio и Xcode мало мальски разработки простого приложения, покувыркаться там и потом нечто похожее сделать на RAD Studio и поверьте, многие вещи, типа "размер приложения", "легкие подлагивания" - станут умеренными и не такими основными аргументами.... пример, посмотрите последний пасьянс "Косынка" от Microsoft, обратите внимание на интерфейс... все не по гайдлайнам, все в разрез, но разработчики заявили "ну работает же ведь, у нас сделано так и все!" "все в .опу!" некоторые вообще пытаются оправдать не популярность своего приложения или чужого, некими не соблюдениями гайдов, это важно - не спорю, или размером приложения и т.д., НО МАРКЕТИНГ приложения гораздо важнее... вот серъезно, начихать мне какой размер у приложения (пошел да докупил памяти, сколько надо), главное чтобы работало и выполняло исправно свою работу! херовый телефон? так поменяй его уже!
  14. Ярослав, сегодня, вновь тестируя различные размеры шрифтов, обнаружил, что если по умолчанию выставить размер шрифта 14 (под Андроид), расчет все равно неверный - не хватает буквально 5% высоты, добавлять ее вручную не хочется, потому как при всех других размерах все корректно. Если изменить размер шрифта в рантайме - и вернуть на 14, то все опять корректно. Неправильный подсчет только при запуске приложения и в случае, если размер стоит = 14. Вышел из положения добавляя при расчете 0.1 к размеру шрифта: Drawable.Font.Size := spnBoxFontSize.Value + 0.1; // при старте программы размер выставляется относительно значения SpinBox'а
  15. Вообще несколько вопросов по данной теме, буду рад если тыкните на документацию embarcadero. В данный момент apk моего приложения весит ~90мб и помещается оно на sd-карту. 1. Сколько весит пустой apk с одной формой? 2. Как устанавливать apk на телефон? Где можно это указать в IDE? 3. Как можно уменьшить размер apk? Убрать лишние библиотеки? Может как-то еще? 4. В своем приложении я использую много картинок, каждая в среднем занимает ~100кб. Это нормальный размер для картинок? Или можно и лучше использовать меньший размер? Но тогда качество будет ужасным.
  16. Добрый день Есть приложение, которое работает в полноэкранном режиме. Первый раз тестил его на экране с соотношением сторон 18:9 (Xiaomi Redmi 5). По умолчанию приложение открывается с черными полосами сверху/снизу либо слева/справа (смотря какая ориентация) В недрах настроек телефона есть опция "полноэкранный режим", где любому приложению можно разрешить/запретить работу на весь экран. При активации этой опции для моего приложения, размер экрана все равно определяется неверно (должно быть 1440*720, а получаю 1344*720), и из-за этого при отрисовке элементов интерфейса вблизи границ экрана получаю не то, что должно быть. Например, есть элемент шириной W, тогда при отрисовке элемента в точке с горизонтальным значением Point.X:=20 и в точке с Point.X:=Screen.Width - W - 20, получаю разные расстояния от элемента до левой и правой стороны экрана соответственно (альбомная ориентация). При этом для "обычных" экранов все работает отлично.Подозреваю, что это как-то связано с наэкранными кнопками меню, но не знаю, это особенность Xiaomi или вообще всех таких современных экранов. Кто в теме, подскажите.
  17. Всем привет! Не реклама, просто думаю это будет интересно. Был в прошлый четверг на семинаре от TMS, где они представляли свою новую разработку: создание приложений для Web на Delphi, прямо в IDE. Пайплайн примерно такой: -в студию устанавливается плагин, который добавляет в опции проекта и опции ИДЕ настройки для веб -создается приложение на основе ихнего шаблона, и использует FNC-компоненты (ессно от TMS) -приложение пишется практически как обычное VCL-приложение на языке Delphi, только в пространстве имен FNC -для использования контролов на форме (т.е. в окне браузера) они перевели практически все необходимые контролы -после компиляции студия запускает браузер, и ваше приложение работает в браузере. Как это работает: -под капотом ихний собственный т.н. DelphiToJavaScript Compiler, построенный на основе опенсорсного FPC -этот компилятор читает дельфи-код и преобразовывает его в яваскритп -есть возможность использовать как шаблон формы свой собственный HTML -HTML также может быть сгенерирован компилятором автоматически -можно использовать CSS -можно подгружать свои собственные js-библиотеки (не показывали как, но утверждают что можно) -после запуска студия открывает браузер и стартует ваше приложение в браузере -приложение можно дебажить, НО: -а) только в браузере -б) браузер получает от студии map-файл с инфой для отладки, и отображает исходный код на дельфи (это показали, действительно в браузере код на дельфи, и деже отображаются значения переменных) -можно подключаться к БД посредством REST-технологии, все запросы к БД при этом работают асинхронно дополнение) можно писать серверное приложение, которое будет принимать и обрабатывать эти запросы к БД, т.е. аналог фронтэнда и бэкэнда можно писать на дельфи -приложение выполняется полностью в браузере -минимальный размер приложения был от 250кб, утверждалось что если пройтись спец. оптимизатором по ява-коду, то будет еще меньше Мое личное имхо: очень интересно, мы будем это у себя пробовать. Лично я раньше не очень уважал TMS и их поделки, но пообщавшись с их командой изменил свое мнение, эта работа действительно очень впечалила. PS. это не реклама и я никак не причастен к TMS и этой разработке, просто считаю что это интересная тема, и залуживает чтобы ее немного осветили.
  18. Вышло обновление до версии 1.5.0: - Исправлены переходы в глоссарии - Значительно уменьшен размер приложения - Настройки автоматической проверки обновлений - [Windows] Переработка приложения для Windows - [Windows] Добавлены анимации перехода - [Windows] Минимальные размеры окна ограничены 800 пикселями по ширине и 600 по высоте - [Android] Системная строка подкрашивается в "фирменный" синий во всех режимах работы приложения - [Android] Отключена анимация перетаскивания элементов бокового меню - [Android] Индикатор загрузки - [Android] Навигационная панель больше не перекрывает интерфейс приложения - [Android] Исправлена ошибка с сохранением PDF-документа - [Android] Увеличена скорость вывода информации и тестирования - [Android] Немного изменен внешний вид экрана вывода результата тестирования Ссылка на скачивание Android-версии: https://yadi.sk/d/edIZR2VuuRFce Ссылка на скачивание Windows-версии: https://yadi.sk/d/iIeC0OE8ukMoi
  19. FeLDMARShaL

    Font.Size и высота в TEdit

    Очень серьезный баг который раньше обходил всякими разными способами, но сейчас уже не получается. Воспроизводится стабильно. 1) Delphi XE8.1 2) Создаем новый проект для различных устройств 3) Кладем на форму TEdit 4) Делаем выравнивание по верху (просто так, чтобы не подгадывать с размерами, и чтобы после компиляции на устройство он не пропал) 5) Из StyleSettings убираем галочку напротив Size (чтобы можно было изменять размер шрифта в рантайме) 6) Ложим на форму TButton 7) Делаем выравнивание по верху (тоже просто так чтобы не потерялся контрол) 8) Создаем событие клика у этой кнопки, в котором уменьшаем на единицу размер шрифта у TEdit: Edit1.TextSetting.Font.Size := Edit1.TextSetting.Font.Size - 1; Компилируем на андроид устройство (любое, ошибка везде наблюдается) После успешного запуска приложения вводим в TEdit какую нибудь фразу из нескольких слов. И если тыкать по полю, то видим как каретка всегда ставится в от место которое тыкнули, т.е. у нас есть возможность тыкнуть на 2 букву и исправить ее. После чего начинаем уменьшать размер шрифта тыка по кнопке. И в один прекрасные момент у нас каретка жестко становится в самом начале и мы не можем изменить ее положение
  20. Делаем так, в dll метод создания формы может быть таким procedure Init(ParentWindow: HWND; const Rect: Windows.TRect); stdcall; begin try StartupInput.DebugEventCallback := nil; StartupInput.SuppressBackgroundThread := False; StartupInput.SuppressExternalCodecs := False; StartupInput.GdiplusVersion := 1; GdiplusStartup(gdiplusToken, @StartupInput, nil); Form1 := TForm1.Create(nil); Form1.Show; if ParentWindow <> 0 then begin //Скроем иконку приложения с панели задач ShowWindow(ApplicationHWND, SW_HIDE); //Сменим стиль окна что бы оно не перехватывало фокус с родительского окна SetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE, GetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE) and (not WS_POPUP) OR WS_CHILD); //Встроим окно в родительское Windows.SetParent(FmxHandleToHWND(Form1.Handle), ParentWindow); //Установим размеры окна такими которыми инициализирована DLL SetWindowPos(FmxHandleToHWND(Form1.Handle), 0, Rect.Left, Rect.Top, RectWidth(Rect), RectHeight(Rect), 0); end; except on E: Exception do MessageBox(0, PChar(E.Message), '', 0); end; end; Эта функция создаст форму и встроит ее на хост в vcl приложении. У формы в dfm должен быть убраны границы что бы оно вписалось. Так же для того что бы форма изменяла размеры вписываясь в хост экспортируем функцию получения хэндла function GetFormHandle: HWND; stdcall; begin Result := 0; try Result := FormToHWND(Form1); except on E: Exception do MessageBox(0, PChar(E.Message), '', 0); end; end; Собственно в хосте загружаем dll, и создаем форму кидая ее на панель Init(panel1.Handle, panel1.ClientRect); Что бы форма меняла размер как и панель - нужно создать обработчик изменения размеров панели и там менять размер встроенной формы procedure THostForm.Panel1Resize(Sender: TObject); var h: HWND; Rect: Windows.TRect; begin h := 0; Rect := Panel1.ClientRect; if Assigned(FGetFormHandleProc) then h := FGetFormHandleProc; if h <> 0 then SetWindowPos(h, 0, Rect.Left, Rect.Top, RectWidth(Rect), RectHeight(Rect), 0); end; Вот так получается втсроить FMX форму из Dll в VCL приложение
  21. У меня один раз получилось обновиться после 1 августа, а сегодня после закачки новой версии и попытки обновиться получаю ошибку: Ошибка Этот выпуск не соответствует требованиям Google Play к 64-разрядным приложениям Следующие файлы APK или наборы App Bundle доступны для 64-разрядных устройств, но содержат только 32-разрядный нативный код. Включите в приложение 64-разрядный и 32-разрядный нативный код. Используйте формат публикации "Набор Android App Bundle", чтобы каждое устройство скачивало только соответствующий его архитектуре нативный код. Это поможет уменьшить общий размер приложения. Подробнее… И кнопка "Опубликовать рабочую версию" недоступна((
  22. Окончательный вариант. Долго бился с изменением размера картинки внутри потока (к примеру что бы в ListView не грузить картинки больше чем нужно). Средствами TBitmap это оказалось сделать невозможно (именно в потоке), чтение форумов, issue Эмбаркадеро, привело к туманному выводу что проблема в архитектуре FMX. В Токио, TBitmap стал потокобезопасным - это означает что никогда не пытайтесь использовать Bitmap в потоке, рано или поздно получите артефакты и глюки. Я решил проблему отказавшись от работы с TBitmap в потоке, и использовав для этого TBitmapSurface (загрузка из stream, изменение размеров). Что умеет хелпер: 1. Загрузка картинки в Bitmap и подгонкой размера (размер можно и не менять - не передавайте параметр ASize) procedure LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); overload; 2. Загрузка картинки в TListItemImage ListView. После Окончания загрузки хелпер выполнит AListItemImage.Invalidate в основном потоке приложения для отрисовки картинки. procedure LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); overload; 3. Создание картинки. Тоже самое что и предыдущие, но можно сэкономить строчку кода ABitmap:=TBitmap.Create ? constructor CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); По картинкам в ListView - можете на свой страх и риск грузить 100500 картинок, но лучше использовать загрузку только для видимой части (+- еще сколько то итемов). Хелпер тупо грузит картинки и не обеспечивает механизм оптимальной загрузки. Протестировано на Windows и Android. Ответы на вопросы которые мне задавали: Почему не создавать отдельный поток для каждой картинки, в нем создавать THTTPClient и делать запрос - пробовал этот вариант, он медленнее на порядок, даже под виндой это чертовски медленно. AHTTPClient.BeginGet и так создает отдельный поток на каждый запрос. Почему AHTTPClient глобальный для юнита - в хелпере нельзя вводить свои переменные, а создавать AHTTPClient внутри функции не выйдет - он убьется до завершения потока. И текущий вариант быстрее. Код хелпера и архив с тестовым проектом: unit BitmapAsyncLoader; interface uses System.Net.HttpClient, System.Net.URLClient, System.SysUtils, System.Types, System.Classes, FMX.Graphics, FMX.Surfaces, FMX.Types, FMX.ListView.Types; type TBitmapAsyncLoader = class helper for TBitmap private function ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; procedure SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); procedure StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); public procedure LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); overload; procedure LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); overload; constructor CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); end; implementation type THTTPClientListener = class class procedure HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); end; var AHTTPClient : THTTPClient; constructor TBitmapAsyncLoader.CreateFromUrlAsync(const AURL : String; const AListItemImage : TListItemImage = nil); begin Create; LoadFromURLAsync(AURL, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); var AWidth, AHeight : Integer; begin if Assigned(AListItemImage) then begin AWidth:=Round(AListItemImage.Width); AHeight:=Round(AListItemImage.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight, AListItemImage); end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const ASize : TControlSize = nil); var AWidth, AHeight : Integer; begin if Assigned(ASize) then begin AWidth:=Round(ASize.Width); AHeight:=Round(ASize.Height); end else begin AWidth:=-1; AHeight:=-1; end; StartHTTPThread(AURL, AWidth, AHeight); end; function TBitmapAsyncLoader.ResizeBitmapSurface(const ABitmapSurface : TBitmapSurface; const AWidth, AHeight : Integer) : TBitmapSurface; begin if (AWidth <> -1) and (AHeight <> -1) then begin try Result:=TBitmapSurface.Create; Result.StretchFrom(ABitmapSurface, AWidth, AHeight, ABitmapSurface.PixelFormat); finally ABitmapSurface.Free; end; end else Result:=ABitmapSurface; end; procedure TBitmapAsyncLoader.SynchronizeAssignFromBitmapSurface(const ABitmapSurface : TBitmapSurface; const AListItemImage : TListItemImage = nil); begin TThread.Synchronize(Nil, procedure begin Assign(ABitmapSurface); ABitmapSurface.Free; if Assigned(AListItemImage) then AListItemImage.Invalidate; end ); end; procedure TBitmapAsyncLoader.StartHTTPThread(const AURL : String; const AWidth, AHeight : Integer; const AListItemImage : TListItemImage = nil); begin AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except exit; end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, Self.CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then begin ABitmapSurface:=ResizeBitmapSurface(ABitmapSurface, AWidth, AHeight); SynchronizeAssignFromBitmapSurface(ABitmapSurface, AListItemImage); end; end; end, AURL ); end; class procedure THTTPClientListener.HTTPClientValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean); begin Accepted:=True; end; initialization AHTTPClient:=THTTPClient.Create; AHTTPClient.OnValidateServerCertificate:=THTTPClientListener.HTTPClientValidateServerCertificate; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end. BitmapAsyncLoader.7z
  23. Нужно получить размер файла под любыми платформами. Сейчас использую функцию function TFileManager.GetFileSize(APath : String) : String; Var F : file of Byte; AFileSizeByte : Integer; AFileSizeMbyte : Double; begin Result:=''; AssignFile(F, APath); FileMode := 0; // readonly try try Reset(F); AFileSizeByte:=FileSize(F); CloseFile(f); except end; finally AFileSizeMbyte:=AFileSizeByte/1048576; Result:=Format('%6.3f',[AFileSizeMbyte])+' Mbyte'; end; end; Работает, но есть одно но - под Windows, если проверяю exe файл, антивирус (в данном случае Защитник Windows) унюхивает что производится открытие файла и начинает его проверять на вирусы. Из за этого сканирование директории с большим количеством исполняемых файлов подвешивает основной поток приложения. Вопрос в следующем - нет ли другого способа получения размера? Странно что TFile, TPath или TDirectory не содержат такого полезного метода. В данный момент двигаюсь в направлении отдельного потока получения размера, но решение не красивое, хочется быстро и сразу.
  24. подскажите, а как для Android приложения понять, что чистый fgx? размер вроде огромный, не меньше FireMonkey....
  25. У нас же есть TextSettings которые задает пользователь. Есть StyledSettings которые задает какие настройки брать со стиля. И есть Font который указывает на РЕАЛЬНЫЙ размер и название шрифта в зависимости от настроек. В дизайнере Font показывает настройки заданные мною в ручную, так как о стилях мы ничего еще не знаем. А в рантайме же он должен указывать на ResultTextSettings, то есть шрифт которые реально отображается. А так как заданные параметры в дизайнере хранятся в TextSettings то они не сотрутся а будут там хранится и при изменении параметров в StyledSettings шрифт будет показан от туда. То есть параметр Font это не структура с хранением данных а лишь указатель на используемые настройки. И что будем иметь в итоге. В дизайнере можно менять хоть заменяйся и данные будут сохраняться в TextSettings. Но во время работы приложения будет указывать на ResultTextSettings отображая реальные параметры отображения текста. А ResultTextSettings в зависимости уже от StyledSettings будет брать данные или со стиля или с TextSettings. Плюсы такого подхода то что во время работы приложения можно получить реально отображенный шрифт и его размер через Font компонента. конечно можно и держать в уме все время то что Font отражает заданные данные в дизайнере а во время работы приложения надо брать настройки с ResultTextSettings, но это же не удобно и не практично особенно когда можно сделать все удобнее и практичнее.
×
×
  • Создать...