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

Алиса Романец

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

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

  • Посещение

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

    1

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

  1. Like
    Алиса Романец получил реакцию от Brovin Yaroslav в Приложение на macOS не отправляет уведомления   
    Есть приложение, написанное ещё в RAD Studio 10.3 и мигрировавшее на 10.4. При миграции на 10.3.3 у приложения просто исчезла возможность отправлять уведомления. TNotificationCenter на macOS выдавал ошибку AccessViolation, в то время как на Windows всё работало отлично, уведомления приходили, никаких проблем.
    Спустя какое-то время, приложение мигрировало на RAD Studio 10.4, где переписали компонент TNotificationCenter и исправили баг в Macapi.Foundation (что позволило адекватным способом отправлять уведомления напрямую через Cocoa). Но теперь вылезла другая проблема - формы с компонентом TNotificationCenter стали падать, даже не доходя до события OnCreate с ошибкой в консоли PAServer
    2020-07-21 01:05:06.361 AErenderLauncher[11672:433325] *** Assertion failure in +[UNUserNotificationCenter currentNotificationCenter], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UserNotifications/UserNotifications-279/UNUserNotificationCenter.m:47 2020-07-21 01:05:06.362 AErenderLauncher[11672:433325] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'application bundle identifier for LSApplicationProxy with bundle identifier (null)' То есть, как я поняла, проблема именно в компоненте TNotificationCenter, который стал фаталить всю прогу. Убрала этот компонент со всех форм, ограничила его {$IFDEF MSWINDOWS} в коде - прога стала прекрасно запускаться на macOS. Тут уже у меня возникли некоторые вопросы, потому что в новых приложениях такой ошибки не возникало (там возникала другая, что TNotificationCenter не может спросить разрешения у системы на отправку уведомлений). Решила я найти способ, как можно отправлять уведомления напрямую из Cocoa, и нашла следующий код на Swift
    @IBAction func sendNotification(_ sender: Any) { let notification = NSUserNotification(); notification.title = "Notification Title"; notification.subtitle = "Foo Bar"; notification.informativeText = "Very informative. Such notification!"; notification.soundName = NSUserNotificationDefaultSoundName; let notificationCenter = NSUserNotificationCenter.default; notificationCenter.deliver(notification); } Перепишем на Object Pascal, получим
    procedure TMainForm.Button1Click(Sender: TObject); begin var ANotification: NSUserNotification := TNSUserNotification.Wrap(TNSUserNotification.Alloc.init); ANotification.setTitle(StrToNSStr('Notification Title')); ANotification.setSubtitle(StrToNSStr('Foo Bar')); ANotification.setInformativeText(StrToNSStr('Very informative. Such notification!')); ANotification.setSoundName(NSUserNotificationDefaultSoundName); var ANotificationCenter: NSUserNotificationCenter := TNSUserNotificationCenter.Wrap(TNSUserNotificationCenter.OCClass.defaultUserNotificationCenter); ANotificationCenter.deliverNotification(ANotification); end; И в результате имеем ту же самую проблему - во всех новых приложениях данный код работает, как надо (и разрешение на отправку уведомлений приходит, и уведомления отправляются, даже запланированные работают), а в основной программе, что долго гуляла по студиям - тишина, вообще ничего не происходит, даже ошибок никаких нет. То есть, код выполняется, но абсолютно безрезультатно. Скажите пожалуйста, с чем это может быть связано?
    macOS Catalina 10.15 / PAServer 21.0 / RAD Studio 10.4
  2. Like
    Алиса Романец получил реакцию от AES в Запуск внешней программы   
    Добавляешь в проект POSIX
    uses Posix.Stdlib, Posix.Unistd; После, в нужном тебе событии вызываешь
    __system(PAnsiChar('/путь/к/приложению & disown')) Команда в PAnsiChar зависит от дистрибутива. Но принцип работы такой, что POSIX отправляет в Терминал команду. Так что, можно отправить в Терминал команду на открытие сторонней программы и методом & disown открепить её от процесса Терминала.
  3. Like
    Алиса Романец отреагировална Andrey Efimov в Как получить объект стиля?   
    Вроде как можно искать объект стиля, например иконку в ListBoxItem:
    var   StyleObject: TFmxObject;   StyleIcon: TControl; begin   // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки    StyleObject := Item.FindStyleResource('icon');   if (StyleObject <> nil) and (StyleObject is TControl) then   begin     StyleIcon := TControl(StyleObject);     // и дальше работаем как с обычным контролом   end; end; попробуйте, может поможет.
  4. Like
    Алиса Романец отреагировална OnePeople в Определение цвета заголовка окна Windows 10 [WinAPI]   
    var Reg:TRegistry; begin     Reg:=TRegistry.Create;     reg.RootKey:=HKEY_CURRENT_USER;     reg.openKey('SOFTWARE\Microsoft\Windows\DWM',true);     value:=reg.ReadInteger('ColorizationColor');     Reg.CloseKey;     Reg.Free;     TAlphaColorRec(Value).R:=Round(TAlphaColorRec(Value).R /100 *35);     TAlphaColorRec(Value).G:=Round(TAlphaColorRec(Value).G /100 *35);     TAlphaColorRec(Value).B:=Round(TAlphaColorRec(Value).B /100 *35); Color:=Value;
    Я делаю так!
×
×
  • Создать...