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

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

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

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

  • Посещение

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

    1

Алиса Романец стал победителем дня 25 июля 2020

Алиса Романец имел наиболее популярный контент!

Информация о Алиса Романец

  • День рождения 12.12.1996

Информация

  • Пол
    Женщина
  • Город
    Хабаровск

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения Алиса Романец

  1. Есть приложение, написанное ещё в 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. К моему сожалению, я не такой профессионал Delphi, чтобы полноценно переписать код, что там был. Лучшее, что я смогла сделать - ниже. Однако, тень осталась такой же, как на скрине. procedure TForm1.CreateHandle; begin inherited CreateHandle; var hWnd: HWND := FormToHWND(Self); SetClassLong(hWnd, GCL_STYLE, GetClassLong(hWnd, GCL_STYLE) or CS_DROPSHADOW); var m: MARGINS; m.cxLeftWidth := 0; m.cxRightWidth := 0; m.cyTopHeight := 0; m.cyBottomHeight := 1; DwmExtendFrameIntoClientArea(hWnd, m); end;
  3. Решение, написанное ХрисТ'ом: во-первых для VCL (кто-то ранее на форуме уже объяснял, почему в Мартышке нет процедур CreateParams и WndProc), во-вторых - часть его решения уже была переписана вручную (см. обновление к вопросу). Мне нужно решение именно для FireMonkey, потому и пришла на этот форум.
  4. Добавляешь в проект POSIX uses Posix.Stdlib, Posix.Unistd; После, в нужном тебе событии вызываешь __system(PAnsiChar('/путь/к/приложению & disown')) Команда в PAnsiChar зависит от дистрибутива. Но принцип работы такой, что POSIX отправляет в Терминал команду. Так что, можно отправить в Терминал команду на открытие сторонней программы и методом & disown открепить её от процесса Терминала.
  5. Попробуй открыть .dproj файл в текстовом редакторе, найти там тег <Platforms> и внутри либо вписать нужную платформу, либо указать ей значение True.
  6. Доброго времени суток, форумчане! Столкнулась с проблемой при стилизации границ формы окна в FireMonkey на Windows. Как только появляется стиль границ - форма начинает вести себя, как прозрачная - то есть, теряет тень. Кто-то из добрых людей уже замечали эту проблему, но в текущих реалиях прикостылить их решения я не смогла. CreateParams в FMX не существует, а вручную добавлять TShadowEffect в стиль не принесло никаких результатов, кроме съехавшего стиля формы и тормозного изменения размеров. Может ли кто пояснить за этот момент, как вообще тень обрабатывается в MS Windows и есть ли какой-нибудь workaround для её ручной активации через WinAPI? Потому что с тенью в macOS всё прекрасно (однако, там и границу окна не стилизуешь, as long as у вас не веб-приложение, хехе). Скрины проблемы прикрепила к посту. Стиль полностью векторный. Обновление (19.12.2019 11:44 МСК) Путём перехвата процедуры CreateHandle и с использованием SetClassLong удалось создать тень, ноо... До тени, что выдаёт Windows 10 ей далеко ? type TForm1 = class(TForm) private {$IFDEF MSWINDOWS}procedure CreateHandle; override;{$ENDIF MSWINDOWS} public { Public declarations } end; begin {$IFDEF MSWINDOWS} procedure TForm1.CreateHandle; begin inherited CreateHandle; var hWnd: HWND := FormToHWND(Form1); if hWnd <> 0 then SetClassLong(hWnd, GCL_STYLE, GetClassLong(hWnd, GCL_STYLE) or CS_DROPSHADOW); end; {$ENDIF MSWINDOWS} end. Результат:
  7. ... Я, если честно, не могу даже представить связь между откреплённым дизайнером формы а-ля старый Делфи и постоянно сбрасывающейся структурой стиля, но она есть.? Включила обратно Embedded Designer - структура перестала сходить с ума. Спасибо вам огромное! с:
  8. Доброго времени суток, форумчане. Столкнулась с очень странной проблемой при попытке редактирования FMX стиля в RAD Studio 10.3 (но проблема, по крайней мере у меня, тащится ещё с 10.2) - при нажатии на любой элемент стиля в его структуре - она заменяется на структуру формы и выбранный элемент не отображается в инспекторе. При этом, нужно именно тыкнуть на элемент стиля, раскрытие групп работает и структура остаётся на месте. Единственный способ добраться до свойств элемента стиля - через Edit Custom Style на компоненте, что не очень удобно, да и не даёт целиком возможности редактировать стиль. Может я чего-то делаю не так или так и должно быть? Надеюсь на вашу помощь, ибо эти стили уже в печёнках сидят. Видео с последовательностью действий (youtube).
  9. Доброго времени суток всем! В VCL была возможность скрыть полосы прокрутки на TStringGrid. Оно не отключало скролл, но оно позволяло спокойно сделать таблицу с n-ым количеством колонок одинаковой ширины без появления горизонтальной полосы проркрутки. Есть ли что-то подобное в FireMonkey, а в особенности отключение не всех сразу, а лишь одной (горизонтальной) полосы прокрутки?
  10. Попробовала - та же проблема. Первый запуск нормально, последующие - пытается найти файлы в корне диска.
  11. Доброго времени суток, форумчане! Есть программка, которая имеет свой конфиг. И если на винде, я могу спокойно складировать этот конфиг в папку C:\ProgramData, то с маком всё сложнее. Просто так записать конфиг и папку в /Library/Application Support/ не получится, требуются права администратора. Замучавшись с попытками сохранения конфига в эту папку, я решила пойти другим путём и заставила программу сохранять этот конфиг (вместе с последующими генерируемыми программой файлами) внутрь себя (MyProgramm.app/Contents/MacOS). Первое время всё работало нормально, файлы сохранялись, генерировались в саму программу. Но, как обычно бывает, что-то пошло не так и... В результате, сейчас я имею то, что программа при первом запуске из RAD генерирует первый конфиг в себя (MyProgramm.app/Contents/MacOS/Config.cfg), запускается при запуске из RAD. НО, стоит мне запустить её независимо от студии (в надеждах, что она считает конфиг внутри себя, как она делала раньше), как она просто падает. Добавив небольшое ShowMessage(FileExists('Config.cfg').ToString()); в качестве отладки, я узнаю, что она падает из-за того, что НЕ МОЖЕТ НАЙТИ ФАЙЛ КОНФИГА, ЧТО НАХОДИТСЯ В НЕЙ САМОЙ. Затем, методом тыка было обнаружено, где именно он пытается найти этот файл - в корне диска с системой. Вопрос к вам, как пофиксить это дерьмо? Сразу скажу, код со вчерашнего дня вообще не менялся. Фрагмент работы с конфигом я приложила ниже. procedure TForm1.FormCreate(Sender: TObject); var PRGP, OUTP: String; i: Integer; begin {тут находится код для MSWINDOWS} {$IFDEF POSIX} AssignFile (CFG, 'AErenderConfiguration.cfg'); //Привязка файла, что по идее должен быть внутри софта if FileExists ('AErenderConfiguration.cfg') then //Тут ошибка вылезает, потому что он не может найти файл в корне диска begin //Чтение самого конфига Reset (CFG); Readln (CFG, LANG); Readln (CFG, PRGP); Readln (CFG, OUTP); Readln (CFG, AERPATH); Readln (CFG, DEFPRGPATH); Readln (CFG, DEFOUTPATH); projectPath.Text := PRGP; outputPath.Text := OUTP; Lang1.Lang := LANG; CloseFile (CFG); end else begin //Действия, если конфиг не существует. Тоже ошибка, потому что в macOS корень диска заблокирован для записи. Rewrite (CFG); for i := 1 to 6 do Writeln (CFG, ' '); LANG := 'EN'; Lang1.Lang := LANG; CloseFile (CFG); end; {$ENDIF POSIX} RAD Studio 10.3 Rio (26.0.32429.4364), PAServer 20.0, macOS 10.13.6 High Sierra (MacBook 13" Mid 2010).
  12. Оно идеально, правда! Как раз то, что нужно! Огромное спасибо за помощь с:
  13. Увы, не очень помогло. Везде написано, что, мол, "замена курсора в FMX не работает". Тогда вопрос возникает, как программа FL Studio 12(20) имеет спокойно кастомные курсоры внутри себя? Притом, сама явно написана на FMX, ибо кроссплатформена на macOS и имеет тонны анимаций, что VCL просто не поддерживает.
  14. Доброго времени суток! Не совсем поняла, куда именно стоит задавать вопрос, посему оставлю в Стилях. Есть FMX форма, которой нужно присвоить кастомный курсор, но не формата .cur/.ani, а именно, как изображение. На VCL делается через импорт файла .res, содержащего изображение, посредством {$R <имя_файла>.res}, что содержит изображение, а затем просто выборкой этого курсора в контекстном меню в параметрах формы. Возможно ли сделать что-либо подобное на FireMonkey или это решается только "скрытием курсора под компонентом TImage, что двигается вместе с курсором"?
×
×
  • Создать...