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

krapotkin

Пользователи
  • Постов

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

  • Посещение

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

    209

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

  1. Thanks
    krapotkin получил реакцию от Aleks133 в Работа с БД в класс   
    Хорошей практикой является следующая концепция.
    Есть модель данных (МД) - набор классов, описывающий все, что происходит в вашей программе, и хранящий все нужные данные. 
    А есть отдельный модуль, который отвечает за загрузку и сохранение этой МД. В нем класс-"загрузчик". Чтобы вам было удобнее, можно в качестве такого модуля сделать Datamodule, в котором будут все нужные все компоненты и методы.
    При этом становится не суть важно, откуда идет загрузка, хоть из интернета, хоть из БД.
    Вопросов с выделением этих процессов в отдельные потоки не будет, только нужно помнить только одно - один поток - один Datamodule. Т.е. создавать их надо динамически.
    создали объект модели данных, создали datamodule, вызвали некий метод для загрузки данных в объект. 
    Хорошим тоном будет не создавать/уничтожать Datamodule каждый раз заново, потому что процесс подключения к БД довольно длительный по сравнению с простым запросом в БД. Поэтому можно создать какой-то пул(массив, список) уже созданных DM  и брать одну штуку из него для совершения операции, и возвращать обратно по ее окончанию.
    Получается, что каждый поток будет иметь свой Datamodule и следовательно свой FDConnection и свой FDQuery для каждой операции.
    Надеюсь, я ответил на ваш вопрос
  2. Like
    krapotkin получил реакцию от gonzales в Динамическое удаление объектов и форм (опять...)   
    В том числе. Также все созданные формы будут удалять не себя а именно form1
  3. Like
    krapotkin получил реакцию от Ingalime в После обновления на Андроид 6.01   
    пока не перестанете писать по хардкодному пути, можете не присылать ни apk ни код
    попробуйте записать в System.IOUtils.TPath.GetSharedDownloadsPath
  4. Like
    krapotkin получил реакцию от Ingalime в После обновления на Андроид 6.01   
    вот почему-то ну не верится и все. 
    наоборот бы я еще мог придумать закрытые порты, фаерволлы и т.д.
    но мобильные-то блокируют только сайты по списку РПН
    а тут FTP...
     
  5. Like
    krapotkin получил реакцию от Tumaso в После обновления на Андроид 6.01   
    на всех андроид устройствах нет смысла пользоваться прямым указанием папки
    доступные программе папки перечислены в class TPath из System.IOUtils.pas
    пример
    uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');  
  6. Like
    krapotkin получил реакцию от Android в После обновления на Андроид 6.01   
    в Android начиная уже с 6 вы должны запрашивать разрешение на запись в файл у пользователя каждый раз при попытке этой записи
    пример есть в делфи
  7. Like
    krapotkin получил реакцию от Ingalime в После обновления на Андроид 6.01   
    в Android начиная уже с 6 вы должны запрашивать разрешение на запись в файл у пользователя каждый раз при попытке этой записи
    пример есть в делфи
  8. Like
    krapotkin получил реакцию от Ingalime в После обновления на Андроид 6.01   
    на всех андроид устройствах нет смысла пользоваться прямым указанием папки
    доступные программе папки перечислены в class TPath из System.IOUtils.pas
    пример
    uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');  
  9. Like
    krapotkin получил реакцию от Ingalime в RadStudio 10.3.3 и эмулятор BlueStacks: проблемы.   
    Сама Делфи к любым андроид-эмуляторам, -компиляторам, -утилитам, и вообще всему, что нужно для Андроид-разработки, никакого отношения не имеет. Все это - Google SDK. Этот SDK меняется каждый год. Туда добавляются и пропадают самые разные вещи. В том числе и AVD manager и SDK manager. Полный SDK теперь вообще можно поставить только вместе с Android Studio, и потом в Делфи указать пути к нему. Так что никаких изъятий инструментов мобильной разработки Rad Studio не производит.
    Далее.
    В мобильной разработке совершенно не будут работать те подходы, которые применяются на десктопах.
    Например, упомянутые диалоги открытия и сохранения файлов бессмысленны, если доступа к файловой системе по сути и нет вовсе, как на IOS, или частично и только по специальному разрешению как в Андроид. Поэтому их и нет и не может быть для мобил.
    На бесплатный TChart тоже я бы не стал возлагать большие надежды. Если честно, вам гораздо проще будет либо самостоятельно нарисовать график на Canvas. либо изготовить некий веб-сервер и с помощью к-нить JS-библиотеки подготовить данные, после чего открыть пользователю страницу с графиком.
    При этом, до определенного предела вполне работает подход, когда программа пишется на FMX на Win32/64, (с характерными для телефона размерами окна, конечно) отлаживается, а потом время от времени запускается на Android. Я лично так делал. Но там нужно держать в голове серьезные отличия по работе с памятью вследствие ARC - Automatic Reference Counting. И соответственно, писать универсальный код.
  10. Like
    krapotkin получил реакцию от Ingalime в RadStudio 10.3.3 и эмулятор BlueStacks: проблемы.   
    я понимаю, доверия ко мне нет, когда пара статей 2015 года говорит, что все зашибись
    тогда почитаем Marco Cantu - продакт-менеджера Delphi
    Posted November 6, 2019
    https://en.delphipraxis.net/topic/1920-64bit-testing-hardwareemulation/?do=findComment&comment=15048
    As for emulators, the issue is they are mostly Intel-based, so Java apps run fine, but native ones require a ARM emulator like libHoudini (this was an Intel library, but I think they stopped all development since they exit the Android world)
    Что касается эмуляторов, проблема в том, что они в основном основаны на Intel, поэтому приложения Java работают нормально, но для нативных требуется эмулятор ARM, такой как libHoudini (это была библиотека Intel, но я думаю, что они остановили всю разработку, так как они вышли из мира Android)
  11. Like
    krapotkin получил реакцию от Ingalime в Оптимизация поток и AniIndicator   
    логика должна быть такой
    в главном потоке запускаем индикатор и доп. поток.
    При окончании работы доп. поток например в событии OnTerminate прячет индикатор. 
    Всё.
    Если есть прямо жестокая необходимость, чтобы доп. поток как-то отчитывался о прогрессе, пусть отправляет сообщения в главный поток.
    Никаких других знаний друг о друге у обоих потоков быть не должно.
    Это идеальная универсальная схема. Ессн бывают всякие обстоятельства, но в целом она рабочая всегда.
    подробнее я писал об этом тут
     
  12. Haha
    krapotkin получил реакцию от Евгений Корепов в [Android] Воспроизводить аудио   
    в оригинале нет такого слова AApplication
    посмотрите, что реально загрузилось
    обратите внимание, что delphi в 2021 все еще не умеет считать символы если перевод строки #10 а не #13#10 
    поэтому показывает на экране верно, а если что-то автоматически вставить, то промахивается 
    я бы рекомендовал пересохранить ваши файлы с переводом строки #13#10
     
  13. Like
    krapotkin получил реакцию от Ingalime в Возможность реализации экспорта/импорта данных приложения в виде файлов   
    вот уж точно базу отправлять по почте это странно
    отправил по почте табличку с данными, можно даже HTML, да и все
    и пусть себе начисляет
  14. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    в оригинале нет такого слова AApplication
    посмотрите, что реально загрузилось
    обратите внимание, что delphi в 2021 все еще не умеет считать символы если перевод строки #10 а не #13#10 
    поэтому показывает на экране верно, а если что-то автоматически вставить, то промахивается 
    я бы рекомендовал пересохранить ваши файлы с переводом строки #13#10
     
  15. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    насколько я понимаю, там целая система, состоящая из программы, сервиса и примочек, которые позволяют делать кнопки в нотификейшн
    Делфи это не осилит, надо идти в натив
  16. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    но при этом звуком телефона из программы рулить можно)
  17. Like
    krapotkin получил реакцию от gonzales в Свой APK updater. Использование Fileprovider   
    У меня в работе два приложения, и оба они не предназначены для 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.
    Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

     
     
     
     
     
  18. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    begin Result := false; это вот это. там по-любому потом переписывается значение, поэтому она говорит, что строка лишняя
  19. Thanks
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    в целом статус не нужен. он появляется от сервера. это значит инет есть.
    т.е. 
    /// Result := aResp.StatusCode < 400; Result := true; и ниже достаточно
    check := CheckInet; If not check Then ...  
  20. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    круто. Никогда не писал в поддержку! )))
     
  21. Thanks
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    Простой способ реализовать это-использовать этот атрибут для вашего AndroidManifest.xml , где вы разрешаете все http для всех запросов:
    android:usesCleartextTraffic="true"
  22. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    есть еще предположение, что надо разрешить http на android. По умолчанию только https работает
     
  23. Like
    krapotkin получил реакцию от Ingalime в [Android] Воспроизводить аудио   
    я все равно не понимаю, для чего там ANSI 
    url: PChar значит просто 'xxxxxxx' и все. если не понравится, то pchar('xxxxxxx'), она поймет
    ну и раз возвращает HSTREAM это не указатель, а просто число, значит не =NIL а =0
  24. Like
    krapotkin отреагировална Ingalime в [Android] Воспроизводить аудио   
    Создание приложения для Андроид с использованием BASS.
    1. Скачиваем с офф.сайта архивы для Андроид и Windows.
    2.
    a) Для Дельфи 10.3.3 открываем из архива для Windows файл bass.pas. Вместо AnsiChar пишем Byte, место PAnsiChar пишем MarshaledAString. Это для версии Дельфи 10.3.3.
    b) Для С++ Builder 10.3.3 открываем bass.h и комментируем объявление //typedef uint32_t DWORD;
    с) Включаем эти файлы в проект uses/include.
    3. Добавляем в Deployment проекта файлы SO из папок armeabi/armeabi-v7a/arm64-v8a и указываем в Deployment пути Remote path (library\lib\armeabi-v7a и других).
    4. В опциях проекта добавляем в Seach Path путь к папке arm64-v8a.
  25. Like
    krapotkin получил реакцию от Ingalime в Ошибка java.lang.IllegalArgumentException: Unable to load native library... libProject1.so   
    на 10.3.3 и Redmi 5А все абсолютно штатно шло, проверял
    На скриншоте вкладка SDK Android 64-bit, 5А - старый, 32-битный
×
×
  • Создать...