По итогу месяца работы на 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) А на этот с виду несложный вопрос я так и не нашел ответа..