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

Anatoliy

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

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

  • Посещение

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

  1. Like
    Anatoliy отреагировална Yuriy2606 в API level 26 ??? Всё таки как выложить приложение на Play Market?   
    Большое спасибо за ответ. Еще раз внимательнее все проверив у меня все таки получилось динамически запросить разрешения при помощи KastriFree  в Berline
       
    Запрос сделал так
    {cPermissionACCESS_COARSE_LOCATION = 'android.permission.ACCESS_COARSE_LOCATION'; cPermissionACCESS_FINE_LOCATION = 'android.permission.ACCESS_FINE_LOCATION'; cPermissionACCESS_NETWORK_STATE = 'android.permission.ACCESS_NETWORK_STATE'; cPermissionCALL_PHONE = 'android.permission.CALL_PHONE'; cPermissionCAMERA = 'android.permission.CAMERA'; cPermissionINTERNET = 'android.permission.INTERNET'; cPermissionREAD_EXTERNAL_STORAGE = 'android.permission.READ_EXTERNAL_STORAGE'; cPermissionREAD_PHONE_STATE = 'android.permission.READ_PHONE_STATE'; cPermissionWAKE_LOCK = 'android.permission.WAKE_LOCK'; cPermissionWRITE_EXTERNAL_STORAGE = 'android.permission.WRITE_EXTERNAL_STORAGE'; } FRequester.RequestPermissions([cPermissionACCESS_FINE_LOCATION,cPermissionACCESS_COARSE_LOCATION,cPermissionREAD_EXTERNAL_STORAGE, cPermissionWRITE_EXTERNAL_STORAGE, cPermissionCAMERA], cPermissionsCodeExternalStorage); Обработка так
    procedure TForm1.PermissionsResultHandler(Sender: TObject; const ARequestCode: Integer; const AResults: TPermissionResults); begin case ARequestCode of cPermissionsCodeExternalStorage: begin if AResults.AreAllGranted then DoShow; //Что-то делаем else ShowMessage('You need to grant all required permissions for the app to be able to take photos!'); end; cPermissionsCodeSMS: begin if AResults.AreAllGranted then ShowMessage('SMS permissions granted') else ShowMessage('You need to grant all required permissions for the app to be able to handle SMS!'); end; end; end; Там в коде примера KastriFree все описано более подробно
    https://www.delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
    Вот ссылка, это для тех, у кого Berlin
  2. Like
    Anatoliy отреагировална Tumaso в API level 26 ??? Всё таки как выложить приложение на Play Market?   
    @Yuriy2606, нужно динамически запрашивать необходимые разрешения у пользователя.
    Наверное, правильнее будет установить 10.3 CE, там поддержка получения разрешений идет из коробки (модуль System.Permissions). Плюс 10.3 поддерживает android 9
    Что касается получения ключа, то проверьте, что у вас в hosts и нет ли блокировки доступа bds.exe к Интернет на уровне антивируса
  3. Like
    Anatoliy отреагировална IVGSoft в Обработка анимированных GIF по рецепту китайского коллеги   
    В конце концов получилось исправить.
    Для interlaced гифок проблема была вообще пустяковая. Одна строчка не в том месте. А вот для optimized все оказалось несколько сложней, но в итоге теперь все гифки отображаются правильно.
    Пользуйтесь на здоровье!
    FMX.GifUtils.zip
  4. Like
    Anatoliy отреагировална Евгений Корепов в Обработка анимированных GIF по рецепту китайского коллеги   
    Принцип работы такой:
    На форму кладете стандартный TImage Создаете экземпляр TGifPlayer Задаете свойство FGifPlayer.Image:=Image; где Image это лежащая на форме TImage Загружаете гифку FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); Запускаем проигрывание гифки FGifPlayer.Play; Вот код:
    unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.GifUtils, FMX.Objects; type TFormMain = class(TForm) Image: TImage; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } FGifPlayer : TGifPlayer; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin FGifPlayer:=TGifPlayer.Create(Self); FGifPlayer.Image:=Image; FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); FGifPlayer.Play; end; end. Вот демо проект во вложении:
     
    FMX.GifUtils.Demo.zip
  5. Like
    Anatoliy отреагировална ENERGY в Gif File   
    Попробуйте этот же модуль, только с исправленными багами.
    http://fire-monkey.ru/topic/5029-обработка-анимированных-gif-по-рецепту-китайского-коллеги/  
  6. Like
    Anatoliy отреагировална FREEFAR в Gif File   
    кому интересно кто искал как воспроизвести GIF на Image
    китайский брат постарался))
    http://www.raysoftware.cn/?p=559
    на Win и Andriod все четко
  7. Like
    Anatoliy отреагировална Brovin Yaroslav в Не могу вывести локальное уведомление   
    В 10.3 расширено апи уведомлений для возможности указывать канал уведомлений для андроида. Это должно решить вашу проблему.
  8. Haha
    Anatoliy получил реакцию от #WAMACO в PUSH Notification не работает после публикации   
  9. Like
    Anatoliy отреагировална FREEFAR в PUSH Notification не работает после публикации   
    Всем доброго времени суток. 
    Казалось бы. Во время разработки и перед тем как подписали приложение сертификатом Distribution, пуши приходили норм. Но после того как прошли аудит Apple пуши куда-то пропали. FCM возвращал ошибку InvalidRegistration.
    Оказалось все достаточно просто. На сервере с которого мы отправляем пуш, В php скрипте, который отправляет пуши надо выставить
    sandbox = false
    Ура! Всем удачи)
  10. Like
    Anatoliy отреагировална Tumaso в Андроид. Не удаётся установить приложение.   
    Удалите вручную приложение с телефона перед установкой новой версии.
    Можно еще попробовать установить -cleaninstall в Run->Parameters, далее в появившемся диалоге в дереве  слева выбираете Debugger, справа в поле Parameters и указываете -cleaninstall
  11. Like
    Anatoliy отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Совершенно верно
  12. Like
    Anatoliy отреагировална OnePeople в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Не знаю куда уж проще?
    Кидаешь на форму StyleBook и в свойствах формы выставляешь его.

    Создаешь свой прогрессбар например.
    Кликаешь по нему правой кнопкой мыши и выбираешь изменить стиль по умолчанию или же создать свой новый стиль для компонента.

    Затем редактируешь его как компонент содержащий в себе другие компоненты, причем не обязательно как я сделал для примера из прямоугольников, можно сделать и из картинок, главное чтобы названия StyleName совпадали c родными.

     
  13. Like
    Anatoliy отреагировална #WAMACO в TMapView завешивает программу   
    Сходите на Android Studio! После мытарств там, ждем обратно! ?
    По-делу.... что конкретно не получается?
  14. Like
    Anatoliy отреагировална #WAMACO в TMapView завешивает программу   
    Отключите создание маркеров при переключении на другую задачу...
    При возвращении... продолжайте выставлять!
  15. Like
    Anatoliy отреагировална dnekrasov в Перехват сообщений в Windows   
    Делаем как обычно, если надо переопределить какое-то событие окна
    interface uses {$IFDEF MSWINDOWS} Winapi.Windows, Winapi.Messages, FMX.Platform.Win, {$ENDIF} System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private procedure CreateHandle; override; {$IFDEF MSWINDOWS} procedure WMIMENotify(var Msg: TMessage); message WM_IME_NOTIFY; {$ENDIF} public end; var MainForm: TMainForm; implementation {$R *.fmx} {$IFDEF MSWINDOWS} var OldWndProc: Pointer = nil; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var Mess : TMessage; begin case Msg of WM_IME_NOTIFY: begin Mess.Msg := Msg; Mess.WParam := wParam; Mess.lParam := lParam; Mess.Result := 0; MainForm.Dispatch(Mess); Result := Mess.Result; end; else Result := CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; end; {$ENDIF} { TMainForm } procedure TMainForm.CreateHandle; begin inherited CreateHandle; {$IFDEF MSWINDOWS} OldWndProc:= Pointer(SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, Integer(@NewWndProc))); {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMainForm.WMIMENotify(var Msg: TMessage); begin {что-то делаем} end; {$ENDIF}  
  16. Like
    Anatoliy отреагировална Slym в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве   
    1. для упрощения кода работы с JSON давно можно использовать сложные пути
    ABase64:=JSON.GetValue<string>('body.nextStep.pdf');
    2.  ну нельзя так: 
    AStreamSource.WriteBuffer(Pointer(ABase64)^, Length(ABase64) * 2); так безопасней AStreamSource:=TBytesStream.Create(TEncoding.UTF8.GetBytes(ABase64));
    3. И сохранять лучше сразу в TFileStream - меньше расход памяти 
    4. не забываем finally Free (их выше нету)... хоть оно и может AUTOREFCOUNT (а может и нет!), но правила хорошего тона никто не отменял
  17. Like
    Anatoliy отреагировална Евгений Корепов в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве   
    Накидал вам функцию (проверил - работает):
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.JSON, System.NetEncoding, System.IOUtils; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } function ExtractPDFContentBase64(const AJSONString : String; out AFileName : String) : boolean; end; var Form1: TForm1; implementation {$R *.fmx} function TForm1.ExtractPDFContentBase64(const AJSONString : String; out AFileName : String) : boolean; Var AJSONObject, AJSONObjectBody, AJSONObjectNextStep : TJSONObject; ACode : Integer; AStreamSource, AStreamDest : TMemoryStream; ADecodeByteCount : Integer; ABase64 : String; begin // Выставляем результат функции в False Result:=False; // Парсим JSON строку в JSON объект AJSONObject:=TJSONObject(TJSONObject.ParseJSONValue(AJSONString)); if Not Assigned(AJSONObject) then exit; // Проверям поле code на предмет содержания http code 200 (это я домыслил, можно удалить) if Not AJSONObject.TryGetValue('code', ACode) then exit; if ACode <> 200 then exit; // Извлекаем body if Not AJSONObject.TryGetValue('body', AJSONObjectBody) then exit; if Not Assigned(AJSONObjectBody) then exit; // Из body извлекаем instanceId - будем использовать как имя файла if Not AJSONObjectBody.TryGetValue('instanceId', AFileName) then exit; // Склеиваем полное имя файла // AFileName:=TPath.Combine(TPath.GetSharedDownloadsPath, AFileName + '.pdf'); AFileName:=TPath.Combine(TPath.GetSharedDownloadsPath, AFileName + '.jpeg'); // Я тестил на картинке // Извлекаем nextStep if Not AJSONObjectBody.TryGetValue('nextStep', AJSONObjectNextStep) then exit; if Not Assigned(AJSONObjectNextStep) then exit; // Содаем поток-источник и помещаем в него base64 AStreamSource:=TMemoryStream.Create; if Not AJSONObjectNextStep.TryGetValue('pdf', ABase64) then exit; AStreamSource.WriteBuffer(Pointer(ABase64)^, Length(ABase64) * 2); // Длину строки умножаем на 2, так как строка юникод AStreamSource.Position:=0; // Создаем поток-назначение AStreamDest:=TMemoryStream.Create; // Декодируем base64 из текста в потоке AStreamSource в бинарные данные в поток AStreamDest ADecodeByteCount:=TNetEncoding.Base64.Decode(AStreamSource, AStreamDest); // Проверяем сколько байт было декодировано if (ADecodeByteCount > 0) then begin AStreamDest.Position:=0; try // Сохраняем поток с бинарными данными в файл с ранее собранным именем AStreamDest.SaveToFile(AFileName); except exit; end; end; // Выставляем результат функции в True Result:=True; end; procedure TForm1.FormCreate(Sender: TObject); Var AJSONString : String; AFileName : String; begin AJSONString:=TFile.ReadAllText('d:\JSON_example.txt'); if ExtractPDFContentBase64(AJSONString, AFileName) then begin // Что то делаем с PDF файлом AFileName end; end; end.  
  18. Like
    Anatoliy отреагировална ENERGY в Приложение для получения информации о составе основных комплектующих, входимостей по моделям автобусов и троллейбусов МАЗ на смартфонах v.11.52.   
    Зайдите в гугл картинки и поищите что-то типа mobile UI design.
    Также у Delphi есть пакет премиум скинов - Firemonkey premium styles. 
  19. Like
    Anatoliy отреагировална kami в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве   
    А в чем загвоздка?
    Достать поле из JSON - вроде просто, обычная работа с JSON далеко не самой сложной структуры.
    Раскодировать из Base64 - uses System.NetEncoding; TNetEncoding.Base64.DecodeStringToBytes и сохранить их в файл
    Потом открыть файл через интент.
  20. Like
    Anatoliy отреагировална ENERGY в TScrollBox или TPresentedScrollBox поворот на 180   
    А зачем скрол переворачивать то?
    TPresentedScrollBox  у него есть Content, установите Content высоту на размер больше, добавляйте вниз сообщение (в невидимую область ниже) и программно с анимацией прокручивайте вниз.   
  21. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    Вообще не совсем понятно зачем делать отправку письма из приложения.
    Я придерживаюсь мнения что захардкоренные места не нужно держать в приложении, при обновлении параметров smtp сервера вы никак не сможете починить быстро
    самый простой способ это хостинг ну или текущий сайт компании, там реализовать отправку письма как предлагал @ENERGY
  22. Like
    Anatoliy отреагировална ENERGY в В Embarcadero отсутствует Android Service   
    Совет. Не пишите под Android на Delphi ниже последней версии Берлина (10.1 upd 2).
    А если выше, то точно не Токио первых версий, только последние версии Токио, иначе все будет тормозить и глючить.
  23. Like
    Anatoliy отреагировална #WAMACO в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    Слишком много ЕСЛИ.... 
    Задачи разные бывают и приложения тоже. Мы говорим про конкретную задачу отправки письма из приложения. Способов несколько, использование Indy позволяет это сделать без стороннего хостинга.
    А через неделю и Ваш хостинг может загнуться, ввиду не оплаты, форс мажора и т.д.
  24. Like
    Anatoliy отреагировална Barbanel в Отладка Indy   
    Если вы видите что в одной процедуре кружки есть, а в другой нет - это значит что этот код (который без кружка) не скомпилирован и в данном не используется.
    Говоря по другому, вы не можете эту процедуру продебажить потому что ее никто не вызывает (ни вы, ни сам компонент).
    В данном случае - это не глюк)
  25. Like
    Anatoliy отреагировална Barbanel в [Apple store]отказ публикации из-за локации   
    Я не знаю что такое CoreLocation и что оно делает, но беглый гуглеж дает некоторые ссылки.
    Вы это: http://edn.embarcadero.com/article/41715 смотрели?
    PS
    Ваше приложение предоставляет инфо о траве, которая нелегальна во всех странах где приложение доступно.
    Ключевое слово "во всех". Вы уверены что вы правильно настроили страны?
×
×
  • Создать...