Nick Peterson

Пользователи
  • Публикаций

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

  • Посещение

Информация о Nick Peterson

  • Звание
    Пользователь

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

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

  1. Точно, спс! Этого я проверить не сообразил, уже легче
  2. Что значит " у меня " ?)) И при чем тут состояния? в проекте нет ни 1 строки кода, на форме ни одно состояние не тронуто, все дефолтное (кроме свойста StaysPressed). Немного не понял, что Вы имели в виду - если допустить, что баг существует, как именно его можно поправить при помощи модели (в данном тестовом примере)? У меня пока не получилось найти решения. Баг существует на 10.2.3 и 10.3, более ранних версий нет под рукой
  3. Почему? да просто накидал по быстрому тестовый пример. В реальном проекте нет кучи кнопок, там даже при 2х кнопках вылезает баг, но редко. Если кинуть 20 кнопок , то баг вылезет сразу же Фокус он держит Тестовый проект для удивления прикладываю:)) Bugs.zip
  4. Вот наткнулся на очередной баг, его исправить быстро уже не удается.. Вы как это решили? или просто не заметили? Суть бага: берем TVertScrollBox кидаем в него кучу кнопок (так, чтобы не все кнопки были в видимой части скролбокса) Запускаем, жмем 1 кнопку. Затем скролим пару раз, и видим что нажато стало много кнопок:) 1) Запустили, нажали SpeedButton9 2) покрутили скролл туда-сюда, и видим (багрепорт https://quality.embarcadero.com/browse/RSP-22933?filter=-2 )
  5. Близко:) У меня анализ данных, графики и прочее
  6. По итогу месяца работы на FMX хочу сказать - это глюкодром адский!:)) Вернулся бы обратно на VCL, но жаль потраченного месяца работы :)) Несколько моментов, может кому будет интересно, кто пойдет по этому пути перевода проекта с VCL: 1) рисование в буфере перед выводом на PaintBox (знаю что не обязательно, но именно в моей проге нужно, разные куски картинки готовятся в разное время) Инфы в одном месте не найти. Даже на этом форуме она не полна и в одном месте ошибочна:) XScale := GetWndScale(FormToHWND(OwnerForm)); // только так! Другие методы получения Scale не работают при // перетаскивании проги на другой монитор. w:=trunc(XScale * Image.Width); h:=trunc(XScale * Image.Height); // при перетаскивании на второй мониторе с другим масштабом Image.Width и Image.Height могут станут неверными. // Помогает только пересоздание хэндла формы (баг) If (bm.Width<>w) or (bm.Height<>h) then bm.SetSize(w,h); bm.Canvas.BeginScene; bm.Canvas.SetMatrix(TMatrix.CreateScaling( XScale, XScale) * Matrix); 1.1) Как нарисовать линию толщиной 1 пиксель? Этот простой вопрос отнял у меня пол дня:) Пришлось править код FMX.Canvas.D2D, по-другому никак не отключить антиалиасинг в битмапе. На форме его можно отключить свойством Quality, вот только его значения перепутаны - HighQuality на самом деле означает худшее качество с размытой графикой. Даже после отключения AA нужна еще 1 хитрость - чтобы линия (горизонтальная или вертикальная) получилась толщиной ровно 1 пиксель, у меня получился примерно такой код procedure TCanvasHelper.LineToPix(xFrom, yFrom, xTo, yTo, Opacity: single); var pFrom, pTO: TPointF; xs: single; begin xs := Max(1, Matrix.m11); If xs > 1.1 then begin pFrom := PointF(xFrom, yFrom).Round; pTO := PointF(xTo, yTo).Round; end else begin pFrom := PointF(round(xFrom) + 0.5, round(yFrom) + 0.5); pTO := PointF(round(xTo) + 0.5, round(yTo) + 0.5); end; Stroke.Thickness := 1/xs; DrawLine( pFrom, pTO, Opacity); end; 2) Шрифты. Это жуть!:) Впрочем об этом пишут везде. Заставить в D2D канве (винда) работать ClearType не удалось (хотя при рисовании в битмапе как написано выше он у меня заработал, путем очередной правки FMX.Canvas.D2D. Надо еще отметить, что править системные коды я никогда не любил, и на VCL приходилось всего 1 раз, тут же у меня исходники очень быстро лишились девственности:)) 2.2) Шрифты и так выглядят не очень, но еще круче их портит свойство TAlign.Scale, из-за которого позиции контролов принимают не целые значения. Просто киньте на форму пару Label'ов с TAlign.Scale , запустите и начните медленно растягивать, наблюдая как мерцают и размыливаются буковки:)) Вообще по итогу шрифты оказались самым неприятным моментом, все остальное кое-как правится, кроме внешнего вида приложения с замыленными шрифтами... (отключать D2D канву не предлагать!) Почему не доделали SetTextRenderingParams в FMX.Canvas.D2D.pas, почему не работает SetTextAntialiasMode - для меня пока загадка. 3) Сворачивание приложения кликом по таскбару. Оно не работает:) (Почему за столько лет существования FMX никто этого не заметил? всем плевать, или никто не пользуется?) Да, на форуме есть пара решений, но они не идеальны, если у вас внимательные юзеры, они обязательно заметят странное мелькание приложения при разворачивании. Очередная правка системных кодов. 4) FMX.TrayIcon.Win - штатного нет, но код выложенный на этом форуме работает идеально. Респект его автору. С ужасом думаю, что буду делать на MacOS..:) 5) Если в TEdit нажать CTRL-V при пустом буфере, вылезает AV:) Правится не сложно, но блин, очередной системный юнит легко лишился девственности:)) 6) Выделение дабл-кликом на TEdit не работает..... (10.3) Хорошо что FMX.Edit.pas уже лежит в папке с проектом, долго искать не пришлось:)) 7) А на этот с виду несложный вопрос я так и не нашел ответа..
  7. Такая же ошибка есть и в проге на 10.2.3, еврикой не пробовал ее поймать? у меня правда еврика не ловит почему-то
  8. Nick Peterson

    Eurekalog в FMX

    Как заставить эврику генерить багрепорты из потоков ? в VCL работало так, в FMX не работает почему-то (10.2.3) procedure TTestThread.Execute; begin try raise EAbstractError.Create('Hi!'); except ApplicationHandleException(nil); end; {...}
  9. Конечно речь идет о FMX, на форуме FireMonkey это предполагается по дефолту :)))
  10. Как поменять стиль на дефолтный (скажем win10style) после того, как был установлен кастомный? TStyleManager.TrySetStyleFromResource('win10style'); работает только 1 раз, второй раз не срабатывает из-за этой проверки class procedure TStyleManager.SetStyle(const Context, Style: TFmxObject); if FStyleResources.TryGetValue(StyleResource, OldStyle) and (OldStyle = Style) then Exit; Стили меняю так (в ресурсах у меня zip архив со стилями): If CurrentStyle > 0 then begin StylesPack[ CurrentStyle - 1 ].Position := 0; S := TStyleStreaming.LoadFromStream(StylesPack[ CurrentStyle - 1 ]); If S <> nil then TStyleManager.SetStyle(S); end else TStyleManager.TrySetStyleFromResource('win10style'); // не работает
  11. Работает, если приложение не было свернуто перед этим. Остается вопрос, как его развернуть корректно с учетом этой темы:))
  12. Как программно вытащить главную форму приложения наверх? (Винда) Перепробовал все, стабильно ничего не работает // Вариант 1 WindowState := TWindowState.wsMinimized; Show; WindowState := TWindowState.wsMaximized; // Вариант 2 If TPlatformServices.Current.SupportsPlatformService(IFMXWindowService, ws) then ws.BringToFront(self); // Вариант 3 PostMessage(FormToHWND(Self), WM_ShowWindow, SW_PARENTOPENING, 1); // Вариант 3b PostMessage(ApplicationHWND, WM_ACTIVATEAPP, 1, 0);
  13. Данный код не решает вопрос полностью, главное окно сворачивается на десктоп.. Вот полный лог сообщений, которые проходят по нажатию на иконку в таскбаре 00:31:19.313 WM_NCACTIVATE 0 0 00:31:19.313 WM_ACTIVATEAPP: 0 10176 00:31:19.401 SW_PARENTCLOSING 0 1 00:31:19.404 WM_ACTIVATEAPP: 1 0 00:31:19.410 WM_NCACTIVATE 0 8784630 00:31:19.416 WM_NCACTIVATE 1 3213944 00:31:19.422 WM_NCACTIVATE 2097152 8784630 00:31:19.425 WM_ACTIVATEAPP: 0 5628 /// нажали снова чтобы развернуть 00:31:22.349 WM_ACTIVATEAPP: 1 10176 00:31:22.352 WM_NCACTIVATE 1 8784630 00:31:22.383 WM_NCACTIVATE 0 8784630 00:31:22.385 SW_PARENTOPENING 1 3 00:31:22.388 WM_NCACTIVATE 1 8784630 00:31:22.393 WM_NCACTIVATE 0 8784630 Пока что я придумал только совсем дикое решение - повесить второй аналогичный хук на FMX.Platform.Win.ApplicationHWND с целью игнорировать второе "лишнее" WM_ACTIVATEAPP с wParam=1 P.S. Забавный парадокс, начал переходить на мультиплатформенный фреймворк - пришлось плотнее углубиться в изучение WinAPI:))) (эта тема плюс
  14. Nick Peterson

    ClearType в D2D канве (Windows)

    Как сделать ClearType в десктопном приложении на DirectX канве? Чисто для эксперимента прописал procedure TTextLayoutD2D.DoDrawLayout(const ACanvas: TCanvas); .... TCanvasD2D(ACanvas).FTarget.SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE); И вот странное дело - TLabel стал рисовать правильно, с ClearType, зато TEdit вообще не отрисовывает:) (проверяю на 10.2.3, Windows 10, новый тестовый проект без единой строки кода, за исключением правки в FMX.Canvas.D2D.pas )
  15. Nick Peterson

    Разные канвы в одном приложении

    Всем привет! Можно ли использовать разные классы канвы в 1 приложении? я ставлю FMX.Types.GlobalUseDirect2D:=false; для лучшей отрисовки текста в UI, но при рисовании графики на PaintBox хочу использовать GPUCanvas (только для данного PaintBox'a), поскольку производительность в данном случае важнее красивого шрифта. Можно так сделать?