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

Nick Peterson

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

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

  • Посещение

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

  1. Like
    Nick Peterson получил реакцию от Mars M в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    По итогу месяца работы на 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) А на этот с виду несложный вопрос я так и не нашел ответа..
     
  2. Thanks
    Nick Peterson получил реакцию от Владимир Б. в TMemo для вывода лога тормозит   
    Спасибо @slav_z за идею, чуть допилил выделение и контекстное меню, еще бы прикрутить CTRL-C грамотно:) Впрочем уже и так отлично
    FastMemo.zip
  3. Thanks
    Nick Peterson отреагировална slav_z в TMemo для вывода лога тормозит   
    да не...  я лучше выложу так..  пилите сами... там не долго все это добавить...
    класс от TFrame. там не TLayout а TText чтобы можно было настраивать шрифт в designtime.
    короче ничего сложного.
    LogViewSource.zip
  4. Like
    Nick Peterson получил реакцию от Barbanel в TMemo для вывода лога тормозит   
    специально же приписал в конце, зачем:))
    Вопрос конечно же не в том, "как сделать TMemo на 100 000 строк"
    Вопрос в том, почему TMemo на 100 000 строк так сильно лагает.
    TMemo на 1000 стрк тоже лагает, просто не так сильно, чтобы показать это наглядно на скрине, я не знаю как наглядно аргументировать пост на форуме "TMemo на 1000 строк лагает". В приложении это чувствуется по отзывчивости UI как микрофризы. Они частично лечатся выкидыванием кода как на скрине выше.
    Именно с этими микрофризами я пытаюсь бороться, при этом сохранив возможность видеть лог в виде текста (почему не в БД? потому что запись в БД ведется параллельно, она не лагает и с ней вопросов нет. Но нужно еще и дать пользователю видеть все последние события и иметь возможноть отмотать выше на N-Ное время для сравнения, и вот в этой части как раз вопросы есть).
    А вот мемо на 100 000 лагает так, что это прекрасно видно на графике загрузки ЦПУ, я считаю что это не нормально, поскольку такое же видновое мемо ведет себя совершенно иначе. Значит, это возможно , парням из майкрософта удалось это сделать!:)) Интересно, как...
  5. Like
    Nick Peterson получил реакцию от Ingalime в TMemo для вывода лога тормозит   
    Благодарю! Стало чуть понятнее - если добавлять 1 строку без Memo.BeginUpdate; из-за какого-то другого бага FMX в процедуре TStyledMemo.DoViewportPositionChange  ContentSizeChanged выставлялся в TRUE, даже если фактические размеры не менялись. Из-за этого запускался цикл
    if ContentSizeChanged then begin for I := 0 to FLineObjects.Count - 1 do begin Line := FLineObjects[I]; if Line.Layout <> nil then FLineObjects.UpdateLayoutParams(Line.Layout); Line.InvalidateSize; end; FLineObjects.RenderLayouts; end приводящий к фризам. Если делать Memo.BeginUpdate, этого не происходит; увидеть фризы, о которых я говорю, можно растягивая форму с Memo.Align = Bottom.
    Теперь к вопросу ЦПУ: Ваш пример в работе на 1-ядерной виртуалке

     
    На домашнем компе с GlobalUseDirect2D := false;

    Прикладываю архив с тестовым проектом, кому интересно поиграться :)
    MemoSpeedTest.zip
  6. Like
    Nick Peterson получил реакцию от Евгений Корепов в TTimer в FMX не проверяет EOutOfResources, (Win) почему?   
    Реализация VCL
    procedure TTimer.UpdateTimer; begin KillTimer(FWindowHandle, 1); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then raise EOutOfResources.Create(SNoTimers); end;  
    В FMX иначе, интересно, почему так? есть какая то причина, или просто поленились дописать?
    procedure TTimer.UpdateTimer; begin {...} FTimerHandle := FPlatformTimer.CreateTimer(FInterval, Timer); if FTimerHandle = 0 then FEnabled := False; // Упс.. таймер просто молча сдохнет)) и будешь гадать что случилось с приложением, почему оно "зависло" end;  
  7. Like
    Nick Peterson получил реакцию от Ingalime в TMemo для вывода лога тормозит   
    мой скрин как бы показывает обратное
    два приложения, два одинаковых таймера (100мс в данном случае) на добавление строки. Одна и та же машина (2х ядерная виртуалка).
    1 скрин FMX приложение, второй VCL
    1 потребляет 30-50% CPU второй 6-8%
    Мне нужен след. функционал: текст, являющийся логом и позволяющий промотать хоть немного вверх и скопировать любую.часть себя. Сейчас я ограничил до 300 строк, и с учетом убирания вот этого кода

    фризы ушли. Юзеры конечно недовольны, что для просмотра остального надо жать дополнительные кнопки..
    Позвольте пока считать вопрос открытым, может у кого есть на примере компонент или идеи с функционалом , описанным выше
  8. Like
    Nick Peterson получил реакцию от Ingalime в Постоянная потеря фокуса под Wine   
    Было похожее, правда только с окном в состоянии fsStayOnTop
    Временно решил так, пока разбираюсь с более серьёзными глюками платформы))
    procedure TPumpHelper.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin If Visible and not Active then Show; end;  
  9. Thanks
    Nick Peterson отреагировална POV в Как сделать чтобы мемо не рисовало кусочки строки, которая не влезла целиком ?   
    Скроллинг обрабатывай в событии. И пролистай далее до кратного высоте строки числу пикселей. А запретить рисовать Мемо обрезанную строку, видимо, никак нельзя.
  10. Thanks
    Nick Peterson отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Хм. Сорри. Проблема есть. Но только на дефолтном стиле. Если загрузить какой-то стиль - проблема исчезает. Так что проблема не в FMX а в дефолтном стиле.
  11. Like
    Nick Peterson получил реакцию от Barbanel в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    По итогу месяца работы на 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) А на этот с виду несложный вопрос я так и не нашел ответа..
     
  12. Like
    Nick Peterson получил реакцию от Anatoliy в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    По итогу месяца работы на 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) А на этот с виду несложный вопрос я так и не нашел ответа..
     
  13. Thanks
    Nick Peterson отреагировална dnekrasov в Вытащить главную форму поверх всех окон   
    Попробуйте SetForegroundWindow(FormToHWND(Self))
  14. Thanks
    Nick Peterson отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Прописан дефолтный шрифт в FMX.Platform.Win.pas
    function TPlatformWin.GetDefaultFontFamilyName: string; begin if TOSVersion.Check(6) then Result := 'Segoe UI' else Result := 'Tahoma'; end; Копируете этот юнит к себе в папку проекта и меняете название шрифта на нужный Вам. Более простого пути нет.
  15. Thanks
    Nick Peterson отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Есть. У любого TStyleObject есть свойство SourceLookup в котором указывается название стиля в котором хранится изображение. Ищем его в дереве стилей и уже с ним работаем как с обычным TImage (находим свойство MultyResBitmap и с его помощью сохраняем или загружаем изображение).
    А с помощью свойства SourceLink (ActiveLink, HotLink и т.д.) указываем область изображения из которой берётся вид контрола для нужного состояния.
    Вы вполне можете добавить свой стиль (TImage), чтобы не редактировать исходное изображение, и использовать его в качестве SourceLookup для своих стилей
  16. Thanks
    Nick Peterson отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?   
    Совершенно верно
×
×
  • Создать...