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

Ingalime

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

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

  • Посещение

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

    5

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

  1. Like
    Ingalime отреагировална #WAMACO в Посоветуйте облачную бд   
    http://www.myclouddata.net/#/home
    + компоненты для приятной, комфортной работы с этим хранилищем
    https://www.tmssoftware.com/site/tmsfmxcloudpack.asp
     
  2. Like
    Ingalime отреагировална gonzales в Задать стиль текста в RunTime   
    Все работает, в запаре забыл галки снять с StyleSettings
  3. Like
    Ingalime отреагировална Tumaso в Не помпилируеться под Ios   
    Не, этот патч устанавливается на всё, от delphi 1 до 10.3.3. И не важно, что это патч исключительно для 10.4.1))))
  4. Like
    Ingalime отреагировална DENWEB в Посоветуйте облачную бд   
    Пока остановился на azure, вроде по демкам не сложно
  5. Like
    Ingalime отреагировална krapotkin в Работа с БД в класс   
    Хорошей практикой является следующая концепция.
    Есть модель данных (МД) - набор классов, описывающий все, что происходит в вашей программе, и хранящий все нужные данные. 
    А есть отдельный модуль, который отвечает за загрузку и сохранение этой МД. В нем класс-"загрузчик". Чтобы вам было удобнее, можно в качестве такого модуля сделать Datamodule, в котором будут все нужные все компоненты и методы.
    При этом становится не суть важно, откуда идет загрузка, хоть из интернета, хоть из БД.
    Вопросов с выделением этих процессов в отдельные потоки не будет, только нужно помнить только одно - один поток - один Datamodule. Т.е. создавать их надо динамически.
    создали объект модели данных, создали datamodule, вызвали некий метод для загрузки данных в объект. 
    Хорошим тоном будет не создавать/уничтожать Datamodule каждый раз заново, потому что процесс подключения к БД довольно длительный по сравнению с простым запросом в БД. Поэтому можно создать какой-то пул(массив, список) уже созданных DM  и брать одну штуку из него для совершения операции, и возвращать обратно по ее окончанию.
    Получается, что каждый поток будет иметь свой Datamodule и следовательно свой FDConnection и свой FDQuery для каждой операции.
    Надеюсь, я ответил на ваш вопрос
  6. Like
    Ingalime отреагировална Ra72 в Не помпилируеться под Ios   
    У меня получилось:
    1. Снес новый xCode.
    2. Загрузил xCode 11.6 по ссылке, указанной выше. (xCode_11.6.xip)
    3. Распаковал архив утилитой распаковки на MacBook. Это долго. (Диск на Маке заканчивается, поэтому так сложно)
    4. Скопировал распакованный xCode в папку "Программы".
    5. Удалил все SDK в менеджере на Delphi.
    6. Добавил SDK iOS 13.6.
    Все заработало. Delphi 10.4. (Patch 3)
  7. Like
    Ingalime отреагировална sinuke в FPushService.DeviceTokenValue = nil Что делать?   
    Получилось получить DeviceToken? А то у меня такая же проблема...
     
    Upd: В чате выяснилось, что код создания подключения и получения токена нужно выполнять в отдельном потоке. Например так:
    TTask.Run( procedure () begin FPushService := nil; FPushServiceConnection := nil; {$IF defined(ANDROID)} FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := ANDROID_SEND_ID; {$ENDIF} if Assigned(FPushService) then begin FPushServiceConnection := TPushServiceConnection.Create(FPushService); FPushServiceConnection.OnChange := OnServiceConnectionChange; FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent; FPushServiceConnection.Active := True; FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; TThread.Synchronize(TThread.CurrentThread, procedure () begin Log('DeviceID: ' + FDeviceID); Log('DeviceToken: ' + FDeviceToken); end); end; end);  
    Так все работает!
  8. Like
    Ingalime отреагировална Vitaldj в Внезапно перестал работать TNetHTTPClient   
    Вроде, да. Такая проблема только с LetsEncrypt. Но вы же понимаете, что с андроидом 4 никто уже ничего не гарантирует.
  9. Like
    Ingalime отреагировална Vitaldj в Внезапно перестал работать TNetHTTPClient   
    LetsEncrypt не будет больше работать на Андроиде менее 6 версии. Гугл больше не подписывает их корневые сертификаты. 
  10. Like
    Ingalime отреагировална Tumaso в XSuperObject   
    Скажи, а зачем вообще использовать библиотеку, которая не развивается?
  11. Like
    Ingalime отреагировална x11 в XSuperObject   
    Ну вот я использовал библиотеку, которая развивается и что из этого вышло?
    Один и тот же код в разных версиях Дельфи (Rio и Sydney) дает разный результат
     
    procedure TForm1.btnReadArrayClick(Sender: TObject); const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false]}'; var Iterator: TJSONIterator; Reader: TJsonTextReader; TextReader: TStringReader; begin TextReader := TStringReader.Create(sJSon); Reader := TJsonTextReader.Create(TextReader); Iterator := TJSONIterator.Create(Reader); try while Iterator.Next do begin if Iterator.&Type = TJsonToken.StartArray then if Iterator.Recurse then while Iterator.Next do begin Memo1.Lines.Add('Key: ' + Iterator.Key); Memo1.Lines.Add('Index:' + Iterator.Index.ToString); end; end;//while finally FreeAndNil(TextReader); FreeAndNil(Iterator); FreeAndNil(Reader); end; end; Речь, о встроенной в Дельфи джейсон-библиотеке (Readers and Writers JSON Framework), которая поставляется, начиная с Seatle
    вот здесь есть описание на русском https://webdelphi.ru/2019/03/rabota-s-json-v-delphi-10-3-rio-2/

  12. Like
    Ingalime отреагировална slav_z в XSuperObject   
    все сторонние библиотеки рано или поздно превращаются в "камень в ботинке"... вопрос только во времени когда это случится...  и если написано уже много кода, то переписывание и тестирование заново всего - это очень неприятная ситуация... я бы не стал самому себе на будущее подкладывать такую свинью... только когда стандартными компонентами не обойтись никак.. или время жизни проекта 3-4 года...
  13. Like
    Ingalime отреагировална Равиль Зарипов (ZuBy) в Seattle Android Ошибка exited with code 1   
    поставил Берлин не снимал галки с установки SDk создал новый проект для андроида сразу ошибку выдал скачал SDK android 6.0, установил дефолтным поставил последний JDK (для уверенности и 32 бита и 64 бита) теперь компилирует, собирает библиотеку, но не создается апк Все это запущено на виртуалке, чтобы рабочую сиетл не грохнуть
    что можно еще предпринять?
    дело было в sdk, скопировал из сиетла и норм
  14. Like
    Ingalime отреагировална mazayhin в Служба + перехват номера   
    Описать BroadcastReceiver в приложении, а из сервиса слать сообщение (интент) с необходимыми данными.
    На форуме есть пример даже с сервисом 
     
  15. Like
    Ingalime отреагировална ENERGY в [Статья]Как создать простой Android Broadcast Receiver. How to implement simplest Android Broadcast Receiver in Delphi   
    Как создать простейший Android Broadcast Receiver.
    Создайте класс, для приема Intent уведомлений:
     
    uses Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText; type TMyReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener) public constructor Create; procedure onReceive(context: JContext; intent: JIntent); cdecl; end; uses Androidapi.Helpers, Androidapi.JNI.JavaTypes; { TMyReceiver } constructor TMyReceiver.Create; begin inherited; end; procedure TMyReceiver.onReceive(context: JContext; intent: JIntent); begin Log.d('Broadcast Received = ' + JStringToString(intent.getAction)); end;  
    Регистрируем тип уведомлений и приемник в событиях формы:
     
    type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { private } FMyListener: TMyReceiver; FBroadcastReceiver: JFMXBroadcastReceiver; public { public } end; procedure TForm1.FormCreate(Sender: TObject); var Filter: JIntentFilter; begin FMyListener := TMyReceiver.Create; FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FMyListener); Filter := TJIntentFilter.JavaClass.init; Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_OFF); Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_ON); TAndroidHelper.context.getApplicationContext.registerReceiver (FBroadcastReceiver, Filter); end; procedure TForm1.FormDestroy(Sender: TObject); begin TAndroidHelper.context.getApplicationContext.unregisterReceiver (FBroadcastReceiver); end; Все.
    Теперь когда вы запустите программу и выключите\включите экран, лог покажет :
    FMX: BroadcastSample: Broadcast Received = android.intent.action.SCREEN_OFF FMX: BroadcastSample: Broadcast Received = android.intent.action.SCREEN_ON Takashi Yamamoto
  16. Like
    Ingalime отреагировална Brovin Yaroslav в Средства логирования в FireMonkey   
    RAD Studio XE5 предоставляет несколько способов логирования под платформы Андроид и iOS. Давайте их рассмотрим:
    Встроенный в FIreMonkey механизм логирования (кроссплатформенный). Использование системных функция каждой платформы для логирования Использование файлов для вывода логов. Использование сети для передачи сообщений лога 1. Встроенный механизм логирования
    FireMonkey содержит специальный класс FMX.Types.Log для осуществления логирования на всех платформах.
    Этот класс использует на каждой платформе системные средства вывода лога.
    Log = class abstract public class procedure d(const Msg: String); overload; class procedure d(const Fmt: String; const Args: array of const); overload; class procedure d(const Tag: String; const Instance : TObject; const Msg : String); overload; class procedure d(const Tag: String; const Instance : TObject; const Method : String; const Msg : String); overload; class procedure TimeStamp(const Msg: String); overload; class function ObjToString(const Instance : TObject) : String; class function ArrayToString(const AArray : TEnumerable<TFmxObject>) : String; overload; class function ArrayToString(const AArray : TEnumerable<TFmxObject>; MakeStr : ToStringFunc) : String; overload; class procedure DumpFmxObject(const O: TFmxObject; Nest: Integer = 0); end; Он предоставляет довольно много методов по вывода лога. 
    Чтобы его использовать достаточно вызвать любой нужный классовый метод. Например в моем приложении по нажатию на кнопку я буду выводить сообщение: "Log message from FireMonkey application"
    procedure TFormPhone.Button1Click(Sender: TObject); begin Log.d('Log message from FireMonkey application'); end; Далее нужно понять, куда будет выведено это сообщение.
     
    1.1. Андроид
    Под андроид это сообщение попадает в системный журнал. Прочитать его можно в утилите Андроида LogCat - это специальная утилита для просмотра системного лога. Ее можно запустить двумя способами:
    C GUI оболочкой Из командной оболочки (консольный вариант). Первый способ (с GUI). В Eclipse с Android SDK открыть Window->ShowView->LogCat. Откроется окно с GUI интерфейсом, в котором вы сможете увидеть все сообщения, которые отправляют все приложения на телефоне. Стоит отметить, что это вариант LogCat в эклипсе содержит ряд полезных функций по фильтрации лога и его управлению. Поэтому я предпочитаю этот способ, нежели использовать консольный вариант этой же утилиты. Сразу же перед использования советую полностью очистить текущий журнал логов телефона, так как он вначале будет содержать огромное количество сообщений. Для очистки нажмите кнопку очистки лога в окне (кнопка с листком и красным крестиком).

     
    Второй способ (консольный режим). Второй вариант запуска утилиты LogCat заключается в вызове утилиты из командной строки. Утилита просмотра журналов логов входит в общую утилиту ADB.exe. Чтобы запустить лог изз командой строки воспользуйтесь следующей командой:
    .\sdk\platform-tools\adb.exe logcat Утилита лежит в папке platform-tools Android SDK. В вашем случае вы должны указать свой путь к этому файлу. Ключ logcat запускает просмотр журнала логирования.
    Так же как и в первом варианте я советую предварительно очистить лог вызвав logcat с ключом -c:
    .\sdk\platform-tools\adb.exe logcat -с Описание всех ключей утилиты logcat: logcat
    После того, как мы открыли Logcat любым из предложенных способов, запускаем нашу программу и смотрим сообщение в логе:

     
    1.2 Йос
    В йос лог попадает в два журнала в зависимости от того, где вы запускаете свою программу (Симулятор или устройство).
     
    iOS Симулятор. Открываем журнал лога в меню симулятора Отладка->Открыть системный журнал...
     
     
    iOS устройство. Открываем XCode Органайзер и выбираем вкладку Console у вашего устройства.

     
    2. Использование системных функций логирования
    Для тех, кто по каким-то причинам не хочет использовать FireMonkey для этих целей может использовать на каждой платформе системные функции логирования.
     
    2.1 Андроид
    Для андроида в Delphi предусмотрены системные функции из Androidapi.Log:
    { Helper functions } function LOGI(Text: MarshaledAString): Integer; function LOGW(Text: MarshaledAString): Integer; function LOGE(Text: MarshaledAString): Integer; function LOGF(Text: MarshaledAString): Integer;  Каждая из которых выводит сообщение с указанным типом (I - информационное сообщение, W - предупреждение, E - ошибка, F - фатальная ошибка)
     
    2.2 iOS
    В IOS вы можете использовать системную функцию iOSapi.Foundation.NSLog.
    procedure NSLog(format: PNSString); cdecl; varargs; external libFoundation name _PU + 'NSLog'; 3. Логирование в файл
    Является самым стандартным средством. Для его использования вы можете использовать стандартные способы работы с текстовыми файлами, которые полностью работают на всех платформах.
     
    4. Логирование по сети
    Этот способ так же имеет место быть и заключается в создании простого TCP клиента на стороне вашего приложения и FTP сервера на Windows. С приложения вы просто шлете на указанный адрес сервера сообщения, а на стороне сервера просто отображаете. Для этих целей можно использовать стандартные Indy компоненты. 
  17. Like
    Ingalime отреагировална Android в Delphi 10.4 и Android 4.1   
    http://docwiki.embarcadero.com/RADStudio/Sydney/en/Android_Devices_Supported_for_Application_Development
    RAD Studio does not support the following Android versions:
    Lollipop (Android 5.0) KitKat (Android 4.4) Jelly Bean (Android 4.1.x, 4.2.x, 4.3.x) Ice Cream Sandwich (Android 4.0.3 and 4.0.4) Honeycomb (Android 3.x) Gingerbread (Android 2.3.3 – 2.3.7) Tegra 2 devices (NEON support is required)
  18. Thanks
    Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио   
    Последний параметр ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
    И этот флаг должен совпадать с манифестом
  19. Thanks
    Ingalime отреагировална OnePeople в [Android] Воспроизводить аудио   
    Ну так в 29 
    public final void startForeground (int id, Notification notification, int foregroundServiceType)  
  20. Like
    Ingalime отреагировална krapotkin в После обновления на Андроид 6.01   
    пока не перестанете писать по хардкодному пути, можете не присылать ни apk ни код
    попробуйте записать в System.IOUtils.TPath.GetSharedDownloadsPath
  21. Like
    Ingalime отреагировална krapotkin в После обновления на Андроид 6.01   
    вот почему-то ну не верится и все. 
    наоборот бы я еще мог придумать закрытые порты, фаерволлы и т.д.
    но мобильные-то блокируют только сайты по списку РПН
    а тут FTP...
     
  22. Like
    Ingalime отреагировална Tumaso в После обновления на Андроид 6.01   
    а причем тут способ доступа к серверу FTP, если проблема в записи в локальный файл? Кто его знает, какой там у вас код записи.
    UPD. Может быть проблема и не в записи, а в сетевом доступе. Под отладкой вообще запускали?
  23. Thanks
    Ingalime отреагировална Tumaso в [Android]RAD10.4.1   
    @Ingalime
    у меня в 10.4.1 sdk лежит в C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.38860.1461 (так инсталлятор установил), соответственно всё лежит там, включая Android SDK Manager
    в 10.3.3 sdk лежит в C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows
  24. Thanks
    Ingalime отреагировална Android в [Android]Правила публикации в маркете   
    By August 3, 2020, new apps must target at least Android 10 (API level 29). By November 2, 2020, all apps that are being updated must target at least Android 10 (API level 29).
  25. Like
    Ingalime отреагировална krapotkin в После обновления на Андроид 6.01   
    в Android начиная уже с 6 вы должны запрашивать разрешение на запись в файл у пользователя каждый раз при попытке этой записи
    пример есть в делфи
×
×
  • Создать...