Перейти к содержанию
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. добавьте эту строку в исходник проекта... будете получать сообщения при выходе из программы если будут утечки памяти (под windows)... с ними надо сразу разбираться... нажмите на вашу кнопку два раза и получите сообщение об утечке памяти при выходе...
  2. Кнопки не проблема, Скачал просто ,искал по запросу кнопки png (pngwing.com по памяти) А как сделать TButton в таком виде ,? Информации 0.1 % Все оказалось просто. kalkulator.zip
  3. Столкнулся с такой же проблемой. Использую «RAD Studio 10 Seattle». Каждый раз, когда у TMediaPlayer задаешь новый FileName, идёт утечка памяти – это баг Firemonkey. Скорее всего, ошибка находится в файле «FMX.Media.pas». Как исправить эту ошибку? Что и как исправлять в файле «FMX.Media.pas»? Проверил на «RAD Studio 10.2 Tokyo» - проблема утечки памяти тоже присутствует. Просто в цикле задаешь новый (или даже тот же самый) TMediaPlayer.FileName, и каждый раз идёт утечка памяти, и очень скоро программа падает из-за недостатка памяти. Функция TMediaPlayer.Clear не помогает, ибо память не освобождается. Из-за этого бага TMediaPlayer является неработоспособным и TMediaPlayer просто невозможно использовать в реальных проектах. Как решить эту проблему?
  4. Подскажите, пожалуйста, не будет ли утечки памяти, если пользователь несколько раз подряд нажмёт кнопку воспроизведения?
  5. Crony Auto - Лаунчер, целью которого является обеспечение удобства, целостности дизайна и обеспечение достаточного функционала для работы без использования стандартных приложений вашей Android магнитолы. Основные возможности: - Просмотр, запуск и удаление приложений - Прослушивание аудио с памяти устройства или плейлистов радио онлайн - Работа как в режиме воспроизведения с флешки, так и создание плейлистов - Просмотр погоды - Работа с OBD2 по Bluetooth - Виджет яндекс-навигации с указанием пути движения - Темы оформления Текущая версия: 0.4.0.402 Ссылка на приложение: 4PDA
  6. 100% правильная мысль. андроид + файрмонкей = глюки в проекте серьезнее калькулятора. я уже пытаюсь переписать на java свой проект. плюсы огнеобезьяны для меня в том что можно базу данных шифровать и достать от туда данные простому человеку будет очень и очень трудно. на андроиде то же можно шифровать, НО только сторонними библиотеками, а из-за них могут быть проблемы совместимости с новыми версиями андроида. минусы, из тех что я обнаружил, причем на последней версии - попробовал передать в ватсап или телегу текст из своей программы, да текст ушел но после возвращения в программу шрифт у листвью резко изменился почему-то, стал какой то странный, одна буква большая другая маленькая, хз от куда такой шрифт прицепил. из-за нехватки памяти что ли такое произошло, но произошло. скорость прорисовки - раза в три хуже чем на java, хотя странно, тут код нативный, и работает медленнее чем java. да на новых телефонах не заметно но у меня есть старый телефон с 7 андроидом и там это все заметно. ну и самое веселое - новые версии андроида часто несовместимые со старыми версиями делфи. программа написанная на java пашет и не падает, на делфи просто перестала запускаться на 11 андроиде. для меня лично огнеобезьяна хороша только для десктопных приложений, да никакой там красоты современной не получишь, гридов нормальных нет, бесплатных именно, редакторов текста типа ричедита так же нет нормальных, есть два варианта, от tms но у него картинку можно только в один ряд поставить с текстом, обтекать нельзя, ну и htmlcomponent использовать, все что надо есть, но цена у него кусачая. под линукс только через стороннюю библиотеку крюкова, которая без исходников. генератор отчетов только один - фастрепорт. в остальном более-менее рабочее ПО кросплатформенное написать можно.
  7. Segmentation Fault в Android - это как Access Violation под Windows. То есть идет недопустимое обращение к памяти
  8. Написал программу на delphi 10.4 под андроид, в программе есть запрос на доступ к файлам чтения и записи, вот такой: procedure TForm1.Button1Click(Sender: TObject); begin //запрашиваем и узнаем что дал права PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason); end; procedure TForm1.FormCreate(Sender: TObject); begin //заносим значения при открытии FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; procedure TForm1.FormShow(Sender: TObject); begin //запрашиваем и узнаем что дал права PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason); end; procedure TForm1.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); begin //PermissionRequestResult - это обработка ответа пользователя if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти form1.CheckBox1.Visible:=True; form1.Button1.Enabled:=False; end else begin TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены'); form1.CheckBox1.Visible:=false; form1.Button1.Enabled:=true; end; end; procedure TForm1.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); begin //И ExplainReason - если пользователь сдуру не дал разрешение, // то вам нужно объяснить ему что без этого приложение работать не будет. TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ', procedure(const AResult: TModalResult) begin APostRationaleProc; form1.CheckBox1.Visible:=false; form1.Button1.Enabled:=true; end) end; end. и все работает, но в телефоне я посмотрел права у программы, и там только доступ к медиафайлам. Подскажите как сделать ко всем файлам доступ?
  9. Добрый день! Помогите с решением проблемы... имеется терминал оплаты на android, когда отправлю функцию принять оплату картой запускается системное приложение терминала для считывания карты оплаты, производим оплату, системное приложение закрывается и отправляет статус об оплате, но в момент когда оплата проходит мое приложение остается на фоне и андроид его закрывает. Подскажите как мне сделать что бы мое приложение оставалось в памяти и не закрывалось чтобы после оплаты я вернулся к своему приложению обработал ответ от приложения и продолжил работу. флаг persistent не помог. терминал слабенький и возможно из-за нехватки ресурсов android закрывает фоновое приложение
  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. Здравствуйте, хотел бы получить советы как правильно удалять TTreeViewItem(и не только его, вопрос скорее общий для всех подобных случаев), если стилизовал данный объект, стиль изменен следующим образом: К стандартному стилю просто добавлена кнопка, которая подразумевает что при нажатии на неё данный TTreeViewItem будет удалятся из дерева и выгружатся из памяти(DisposeOf). Хотел бы получить советы как сделать такое удаление правильным, ведь не верно же писать в обработчике такой кнопки удаление данного айтема верно? Если поставить EurekaLog то можно явно увидеть что это исключение/ошибка под название EUserAfterFreeError. Как пример проще если не прибегать к стилизации: На форму положили обычную кнопку TButton, допустим что она называется Button1, в обработчике написали: procedure Button1Click(Sender: TObject); begin Button1.DisposeOf; end; При таком подходе получим ошибку о чем нас уведомит EurekaLog: EUserAfterFreeError
  12. Имя rt используется как параметр для компоновщика (в *nix системах ), а он, в свою очередь, компонует библиотеку, которая называется librt.so или librt.a (если используется статическая, версия библиотеки rt). Поэтому в Delphi нужно писать так: Unit Posix.Shm; // Посмотрите, может уже такой модуль есть ? Interface function shm_open(name : PAnsiChar; oflag : LongInt; mode : mode_t); Implementation Const LibRT = 'librt.so'; // Имя библиотеки. Нечего эту константу светить в секции Interface ! function shm_open(name : PAnsiChar; oflag : LongInt; mode : mode_t); external LibRT name 'shm_open'; End. PS: Рекомендую почитать книгу: Уильям Стивенс UNIX взаимодействие процессов. Там описано, если я точно помню, 2 механизма разделяемой памяти для Unix систем: Разделяемая память систем, являющихся потомками Unix Sys V. Разделяемая память Posix.
  13. нет. готовых компонентов, которые позволяют не держать в памяти полную модель данных, вы, скорее всего не найдете. ListView всего лишь не создает ненужные компоненты для каждого item, как это делает ListBox, но данные для своего отображения может запросить любые в любой момент. В принципе, это достаточная виртуализация imho Кроме того для десктопа пара тысяч элементов в ListView особых проблем обычно не вызывает
  14. Спасибо за совет, я не видел данного видео. ListView существенно экономнее расходует ОП, но вопрос был о том, имеется ли в FMX функционал, подобный виртуальному ListBox из VCL. Я посмотрел исходные коды для ListView и наверное, я сумею изобразить, что-то похожее, на виртуальный ListBox, установив свойство Adapter, у ListView, на определенный мной, класс - наследник от IListViewAdapter. Но увиденное в исходных кодах, немного настораживает, т.к. ListView, в некоторых своих методах, обращается, одновременно, и к элементу номер X, и к элементу номер Y - т.е. предполагается, что в данный момент времени, они оба существуют (Скорее всего, предполагается, что существуют элементы в диапазоне от 0 до Adapter.Count ). Я же, хотел избежать, выделения памяти, для структуры из элементов TListViewItem, содержащей Adapter.Count элементов. Именно этим свойством обладает виртуальный ListBox из VCL. Естественно, столько элементов не будет, но потенциально, может быть сколько угодно. И нужно быть к этому готовым. Данный функционал, нужен для настольного приложения под Linux. В Windows хватает и VCL. На смартфонах приложение разворачивать не планирутся никогда.
  15. Не могу решить проблему и уже прихожу в отчаяние( Пишу на Berlin проект для Android, состоящий из довольно большого количества форм и фреймов (>20). Сначала делал отдельные приложения, которые реализовывали часть задачи. Всё компилировалось и запускалось. Потом начал объединять все подпрограммы и модули в один проект. Под Windows всё компилируется и работает. Под Андроид выскакивает ошибка (на этапе создания apk): Troubleshooting: Cannot Deploy an Application for Android Ошибка заключается в [PAClient Error] Error: E2312 Unable to execute (тут длинный путь, который начинается с "C:\Documents and Settings\User\AppData\Local\Android\android-sdk\build-tools\24.0.1\aapt.exe" package -f -M и т.д.) Что делать? Может памяти компьютеру не хватает? Небольшие проекты для Андроида без проблем создаются.
  16. Тогда все было несколько проще - видеопамять была просто частью оперативной памяти, и видеокарта просто отрисовывала на экране содержимое памяти начиная с заданного адреса. 1 байт = 1 пиксел. Ширина экрана 320 пикселей. Вы говорили видеокарте установить смещение в 1000 байт и она отрисовыла все начиная с тысячного байта. Потом вы устанавливали смещение видеобуфера в 1320 байт (+1 строка) - и вот уже кадр на экране сместился на 1 пиксель выше. Повторяем на каждый тик - и у вас картинка скроллится снизу вверх. Сейчас у видеокарт все организованно сложнее, но принимая во внимание их безумную производительность, вы можете 50 раз в секунду рисовать абсолютно новую картинку. Но рисовать приходится каждый кадр с нуля. И только заслуга программистов что вы видите скроллы, коридоры, бегущих монстров и т.д. Естественно все это рисуется с помощью специальных интерфейсов взаимодействия с GPU (CUDA, Vulkan, OpenCL). Для вашей задачи вы вполне можете использовать эти мощнейшие механизмы - грузить в видеопамять картинки (текстуры), аппаратно натягивать их на плоскость, аппаратно скроллить эту плоскость. Все инструменты для этого есть в стандартной палитре компонентов Delphi.
  17. Здравствуйте. Не могу разобраться с TWebBrowser на андроиде. TWebBrowser упорно грузит старый вариант страницы. Ввожу ссылку в Хроме - все нормально, вижу новый вариант страницы. Выгружаю программу полностью из памяти. Компилирую. Запускается по новой на устройстве и вижу старый вариант страницы. Пробую создать TWebBrowser динамически, не помогает, показывает старый первый вариант страницы. RAD10.4.1. Clean проекта не помогло. Подскажите, что не так? Спасибо. procedure TForm2.FormShow(Sender: TObject); var WebBrowser: TWebBrowser; begin WebBrowser := TWebBrowser.Create(Self); WebBrowser.Parent := Self; WebBrowser.Align := TAlignLayout.Client; //упорно отображает старый вариант страницы, а в хроме или опере все нормально WebBrowser.Navigate('http://91.199.194.34/radionews.html'); end;
  18. Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на 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
  19. Я за ~полгода поправил кучу ошибок разработчиков FMX, многие из которых, кстати, до сих пор в основной поставке остались. Это были как просто глюки с отрисовкой/перерисовкой, так и утечки памяти и AV из-за того, что долбики сначала убивали что-то а потом из другого места с нему лезли. Качество кода говорит о том, что его писали программисты, получавшие за свою работу в пределах $500-800. Т.е. кого эмба за 3 копейки нашла, того и наняла. Ну они на 3 копейки и нарабатывали, так что тут всё чётко, ни каких претензий. Надо было сразу внимательно код смотреть. В Борланде были высококлассные спецы, я к этому привык... Ну даладно. Затем впёрся в AV после закрытия формы с браузером. Даже здесь просил помощи, но ни кто ничего не подсказал. Так как программа является частью CRM по доставке еды, и браузер с картой - это очень важная её часть, все было переписано на VCL. Использование FMX было заложено что бы сделать ещё 5 приложений на единой кодовой базе под андроид/яос. Но после первого из них стало понятно, что FMX очень тяжёлый, и на целевых телефонах - телефонах наших курьеров банально нет под это приложение столько памяти. Поэтому эти проекты были свёрнуты после первых испытаний. Надеюсь донёс свою точку зрения. И кто-нибудь прочитав этот пост не совершит мою ошибку, и обойдёт FMX стороною. Повторюсь VCL стабильна. Но её писала не Эмба.Да и стандартных компонент из поставки думаю ни только мы, а вообще ни кто не использует. Практически всегда есть бесплатный и более качественный аналог.
  20. В ходе экспериментов, удалось выяснить, что проблема проявляется только при DropDownKind = native. Если включить кастом, то ошибок нет. Из чего делаю вывод: - что-то сломано внутри компонента, когда выпадающий список наполняешь значением + объект, что в дальнейшем приводит к ошибкам с памятью. - место которое затрагивает баг - передача списка значений для отображения (при DropDownKind = native). (Причем, если вместо DropDown, вывести самому список сообщением, то все элементы есть и ошибок не вызывает) п.с. Насчет .Free - он ничего не делает при ARC. И я что-то не встречал упоминаний, что создавая объекты их не нужно удалять за собой. Сами они не удаляются из памяти до смерти приложения.
  21. всем привет! кто подскажет, решен ли вопрос с утечкой памяти в новых версиях RAD Studio?
  22. Подскажите в какую сторону копать? После обновления с Андройд 5.0.2 на Андройд 6.0.1 перестал работать FTP-клиент. Сервер находится на рабочей станции по Win7, а Клиент на Андройде, все пути верные ничего не менялось, адреса и потры тоже, запись на сервер идет нормально, слетает только при скачивании! проверил, слетает именно на этой строчке: IdFTP1.Get('ff1.txt', '/sdcard/Arxiv_telefon/zz/Client/ff1.txt', True); каталог Client находится в памяти телефона
  23. Я бы не стал доверять стандартному диспетчеру задач. Не знаю, что означает "пиковая память", но скорее всего - это максимальное значение памяти, которое процесс занимал в физической оперативке. Это совсем не соответствует тому, сколько процесс реально взял памяти у системы. 32 разрядному процессу доступно в теории 4Гб. На практике - больше 2Гб (а в подавляющем большинстве случаев - 1,5Гб) получить не удается. Пардон, а как работать дальше? На каждый чих, на почти каждую строчку кода требуется выделение памяти. Где ее взять, если она закончилась? Правильно процесс вылетает.
  24. Добрый день. Хочу узнать как правильно возвращать объекты в функции, что бы не было утечки памяти. Данная проблема на данный момент воспроизводится в проекте TelegaPI. Ниже упрощенный код с проекта для запросов на сервер: function TTelegramBot.API<T>(const Method: String; Parameters: TDictionary<String, TValue>): T; var lHttp: THTTPClient; lHttpResponse: IHTTPResponse; lApiResponse: TtgApiResponse<T>; lURL_TELEG: String; begin lHttp := THTTPClient.Create; try lURL_TELEG := 'https://api.telegram.org/bot' + FToken + '/' + Method; // Преобразовуем параметры в строку, если нужно if Assigned(Parameters) then lHttpResponse := lHttp.Post(lURL_TELEG, ParamsToFormData(Parameters)) else lHttpResponse := lHttp.Get(lURL_TELEG); lApiResponse := TtgApiResponse<T>.FromJSON(lHttpResponse.ContentAsString); Result := lApiResponse.ResultObject; finally FreeAndNil(lHttp); { Ниже утечка памяти. Если расскоментировать - тогда не будет возращаться результат функций } // if Assigned(lApiResponse) then // lApiResponse.Free; end; end; В таком виде не освобождается lApiResponse - в результате утечка памяти. Если раскоментировать 2 последние строки - тогда в результате функции будет пустой объект. Прошу опытных людей в этом плане рассказать что мне нужно подправить. Спасибо.
  25. Да, все работает на основном потоке. Теперь возникает ошибка нарушения памяти после того, как вы начали использовать этот способ Splash, и следующее у меня есть функции, которые находятся в разделе «Public» моего frmPrincipal, который я назвал другой формой ... теперь, когда я вызываю их ошибку доступ к памяти, может кто-нибудь мне помочь ??? Я действительно не знаю, почему эти ошибки, так как во время выполнения я меняю MainForm приложения Application.MainForm: = FrmPrincipal;
×
×
  • Создать...