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

Перевод VCL приложения на FMX. Подводные камни, стоит ли?


Рекомендуемые сообщения

Всем привет!

Имеется приложение под винду на VCL (торговый терминал).

Возникло желание перевести на FMX для сборки под MacOS (это основная цель).

Неделя тестов, мида конвертер и ручное ковыряние и правка кода и вуаля, приложение скомпилировалось:) Однако при первом взгляде на свеже-испеченную прогу меня охватил ужас! Хотя нет, ужас охватил еще раньше, когда в одном из тестов мемо с коротеньким текстом на 2 страницы загрузило ЦПУ на 20% при скролле... Тогда я решил, что вобщем-то мои пользователи редко  будут мемо скролить. Но вот общий вид приложения, эти стремные шрифты, несоразмерные кнопочки и тп, едва не отбили желание продолжать:)

Теперь от лирики к существу: нужна консультация по вопросу, стоит ли вообще и если да, то какие подводные камни могут еще встретится и как обходить.

Дельные консультации, а также практическую помощь (стили, советы, куски кода) готов хорошо оплатить.

Изменено пользователем Nick Peterson
Ссылка на комментарий
12 часов назад, Nick Peterson сказал:

когда в одном из тестов мемо с коротеньким текстом на 2 страницы загрузило ЦПУ на 20% при скролле

Вряд ли это проблема FMX. Создайте новый проект, киньте мемо и попробуйте поскроллить - я уверен, что такой загрузки ЦПУ не будет.

12 часов назад, Nick Peterson сказал:

Но вот общий вид приложения, эти стремные шрифты, несоразмерные кнопочки и тп

Непонятно что Вы имеете ввиду. Всё это очень просто настраивается или стилем или на самой форме.

12 часов назад, Nick Peterson сказал:

Теперь от лирики к существу

По-моему, единственная Ваша проблема - это мида конвертер

По собственному опыту перевода могу сказать, что если создавать формы вручную и переносить в них логику, то всё получается довольно просто и проблем особых не возникает. Да и на MacOS практически всё работает без проблем.

12 часов назад, Nick Peterson сказал:

Дельные консультации, а также практическую помощь (стили, советы, куски кода)

Сначала опишите конкретную проблему (желательно с кусками кода), а после этого вы получите дельные консультации и, заметьте, совершенно бесплатно. А пользуясь поиском по форуму - Вы найдёте решение подавляющего числа проблем, которые у Вас возникнут.

Ссылка на комментарий

Пока что разбираюсь со стилями, форум читал, все равно не понимаю пару вопросов:

1) Как отредактировать битмап в стиле? к примеру, беру стиль Diamond из премиум пака для 10.2. Хочу в нем поменять цвет Progressbar'a. На поиск решения и на исполнение ушло 3 часа:)) (сделал как тут пишут https://stackoverflow.com/questions/27876780/how-to-extract-and-replace-png-images-in-tstylebook  путем редактирования файла со стилем и формы в блокноте. Т.е. берешь кусок текста из файла стиля, копируешь его на форму в TImage оттуда сохраняешь, правишь в фотошопе и тп) Более простого способа нет?

2) Как поменять дефолтный шрифт во всех элементах сразу? В файле со стилем не нашел записи Segoe UI, где вообще это прописано? Т.е. я хочу чтобы все Segoe UI заменились на скажем Tahoma

image.png.622296749c586abce34cd8062f7fd434.png

В интернете нашел только решение через подмену IFMXSystemFontService

3) Вообще не понял идеологию StyleBook'ов, Кинул на форму два стайлбука, в один загрузил Diamond , другой оставил как есть, ничего не трогал. Делаю все в режиме Windows - Master, (пока только для винды), View других не создавал.

image.png.ee9420a731c6980607202a0b4bb4c04b.png

3.1) Надо ли создавать View и загружать в них стили заново в стайлбуки, как пишется в справке?

3.2) Выбрал стайлбук с Diamond  и отредактировал в нем 2 Custom стиля для прогрессбаров

image.png.f70cc319c157f63c74f7fe115da46bdd.png

Применяю другой стайлбук, где у меня дефолтный стиль, но прогрессбары все равно остаются цветными!

image.png.b5f15d257c6b14c4c5d1e1f456dbb799.png

Как сделать, чтобы при применении другого стиля в StyleBook2 элементы также меняли свой вид (на дефолтный для StyleBook2 в данном случае) ?

Изменено пользователем Nick Peterson
Ссылка на комментарий

Не знаю куда уж проще?

Кидаешь на форму StyleBook и в свойствах формы выставляешь его.

373573727_(8).thumb.png.3357704eb4c39d012c75c0c49d15e472.png

Создаешь свой прогрессбар например.

Кликаешь по нему правой кнопкой мыши и выбираешь изменить стиль по умолчанию или же создать свой новый стиль для компонента.

1445293268_(11).png.c172c1410ca9fef7d72c1913e53068aa.png

Затем редактируешь его как компонент содержащий в себе другие компоненты, причем не обязательно как я сделал для примера из прямоугольников, можно сделать и из картинок, главное чтобы названия StyleName совпадали c родными.

630155015_(6).thumb.png.5e57181e48b38b191fd672ece13e2874.png

 

Изменено пользователем OnePeople
Ссылка на комментарий
4 часа назад, OnePeople сказал:

Не знаю куда уж проще?

Вы наверное даже не прочитали вопрос. Как же я сделаю два разных стиля прогрессбаров с одинаковым названием?

 

 

Ссылка на комментарий
8 минут назад, Nick Peterson сказал:

Как же я сделаю два разных стиля прогрессбаров с одинаковым названием

А зачем с одинаковым? Даёте каждому своё имя, а у контрола указываете какой использовать с помощью свойства StyleLookup

Ссылка на комментарий
12 часов назад, Nick Peterson сказал:

2) Как поменять дефолтный шрифт во всех элементах сразу? В файле со стилем не нашел записи Segoe UI, где вообще это прописано? Т.е. я хочу чтобы все Segoe UI заменились на скажем Tahoma

Прописан дефолтный шрифт в FMX.Platform.Win.pas

function TPlatformWin.GetDefaultFontFamilyName: string;
begin
  if TOSVersion.Check(6) then
    Result := 'Segoe UI'
  else
    Result := 'Tahoma';
end;

Копируете этот юнит к себе в папку проекта и меняете название шрифта на нужный Вам. Более простого пути нет.

Изменено пользователем dnekrasov
Ссылка на комментарий
12 часов назад, Nick Peterson сказал:

Надо ли создавать View и загружать в них стили заново в стайлбуки, как пишется в справке

View менять не обязательно (только если у Вас отличается внешний вид окна на разных платформах). Главное чтобы стиль поддерживал нужную Вам платформу. У меня прекрасно работает с одним View Master и на винде и на маке.

А вообще, я уже отказался от StyleBook-ов, практика показала, что они нужны только в дизайне, чтобы правильно расположить контролы. Лучше добавить файл стиля в ресурсы проекта и грузить его динамически

var
  Style: TFmxObject;
begin
  Style := TStyleManager.GetStyleResource(AResName);
  TStyleManager.SetStyle(Style);
end;

 

Ссылка на комментарий
12 часов назад, Nick Peterson сказал:

...путем редактирования файла со стилем и формы в блокноте. Т.е. берешь кусок текста из файла стиля, копируешь его на форму в TImage оттуда сохраняешь, правишь в фотошопе и тп) Более простого способа нет?

Есть. У любого TStyleObject есть свойство SourceLookup в котором указывается название стиля в котором хранится изображение. Ищем его в дереве стилей и уже с ним работаем как с обычным TImage (находим свойство MultyResBitmap и с его помощью сохраняем или загружаем изображение).

А с помощью свойства SourceLink (ActiveLink, HotLink и т.д.) указываем область изображения из которой берётся вид контрола для нужного состояния.

Вы вполне можете добавить свой стиль (TImage), чтобы не редактировать исходное изображение, и использовать его в качестве SourceLookup для своих стилей

Ссылка на комментарий
1 час назад, dnekrasov сказал:

Хотелось бы исходники глянуть

Добрый день! Благодарю за ответы!

Исходников пока нет, я эксперементирую на чистом проекте. Сделал два стайлбука, в одном из них сделал два стиля прогрессбарам - зеленый и красный (ProgressBar1Style1, ProgressBar1Style2)

В другом стайлбуке не делал, как видно на скрине, там только дефолтный стиль, несмотря на это, прогрессбары все равно рисуются со стилем из другого стайлбука (который в данный момент неактивен). Вобщем тут понял, надо в другом стайлбуке сделать стили с такими же именами, тогда все ок

image.png.6a6b7213b60ab817c82bb764bfb65ab2.png

 

2 часа назад, dnekrasov сказал:

Лучше добавить файл стиля в ресурсы проекта и грузить его динамически

Верно ли я понял, что можно редактировать стиль в стайлбуке в IDE, затем сохранить его в .style файл и засунуть в ресурсы в таком виде, удалив стайлбуки с формы?

 

Подскажите еще вопрос, привожу внешний вид интерфейса в порядок после преобразования из VCL, очень раздражает вид сплиттера между двумя мемо (на скрине увеличение x8). Есть какой-то простой способ это победить? Я имею в виду эти 2 черные линии. Если уменьшать толщину сплиттера, тогда его сложно ухватить мышкой)) Пробовал вставлять TLine с белой кистью между мемо, не получается

 

image.png.6421b801f3f5db0b0a2e4ac56a235aa7.png

Ссылка на комментарий
27 минут назад, Nick Peterson сказал:

Верно ли я понял, что можно редактировать стиль в стайлбуке в IDE, затем сохранить его в .style файл и засунуть в ресурсы в таком виде, удалив стайлбуки с формы?

Совершенно верно

Ссылка на комментарий

Такой вопрос , сделал TStringGrid для Sqlite таблицы через лайфбиндинг

Как сделать сортировку? на VCL работал такой код, на FMX не работает ("сортирует" только первую строку, остальные без изменений):

procedure TRepForm.Grid1HeaderClick(Column: TColumn);
var FieldName:  string;
begin
  FieldName:=Column.Header;
  If FSortField=FieldName
    then FSortField:=FieldName+':D'
    else FSortField:=FieldName;
  If MainQuery.Active then begin
    MainQuery.IndexFieldNames:=FSortField;
    MainQuery.First;
  end;
end;

 

Изменено пользователем Nick Peterson
Ссылка на комментарий

Методом тыка нашел вариант, не знаю, насколько он корректен?

 

procedure TForm8.Grid1HeaderClick(Column: TColumn);
var FieldName:  string;
begin
  FieldName:=Column.Header;
  If FSortField=FieldName
    then FSortField:=FieldName+':D'
    else FSortField:=FieldName;
  If MainQuery.Active then begin
    MainQuery.IndexFieldNames:=FSortField;
    MainQuery.First;
  end;

  MainQueryBinding.BeginLayout;
  MainQueryBinding.EndLayout;
end;

 

Ссылка на комментарий
  • 3 недели спустя...

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

 

Ссылка на комментарий
6 часов назад, Nick Peterson сказал:

но жаль потраченного месяца работы

Зато столько интересного для себя обнаружили и сколько обнаружите потом при переходе  на новую версию ☺️

Изменено пользователем GASCHE
Ссылка на комментарий
В 09.12.2018 в 01:09, Nick Peterson сказал:

По итогу месяца работы на FMX хочу сказать - это глюкодром адский!:))

Вы случайно не картографическое приложение пишете?
Такой use case знакомый)))

Ссылка на комментарий
15 часов назад, Barbanel сказал:

Вы случайно не картографическое приложение пишете?
Такой use case знакомый)))

Близко:) У меня анализ данных, графики и прочее

Ссылка на комментарий

Не знаю, я как то переводил старое VCL приложением на FireMonkey, все прошло очень гладко, добавил новых "красивых" фич!

Были вопросы, но они все замечательно решились.

Клиенты довольны! Странно, что у вас опыт отрицательный.

Ссылка на комментарий
2 часа назад, #WAMACO сказал:

Были вопросы, но они все замечательно решились.

Вот наткнулся на очередной баг, его исправить быстро уже не удается.. Вы как это решили? или просто не заметили?

Суть бага: берем TVertScrollBox  кидаем в него кучу кнопок (так, чтобы не все кнопки были в видимой части скролбокса)

Запускаем, жмем 1 кнопку. Затем скролим пару раз, и видим что нажато стало много кнопок:)

1) Запустили, нажали SpeedButton9

image.png.60261996ef6a8e6eaf22ab6a8460cfd8.png

 

2) покрутили скролл туда-сюда, и видим

image.png.97ab79823c600d6b98386532fbc9c91f.png

(багрепорт https://quality.embarcadero.com/browse/RSP-22933?filter=-2 )

Ссылка на комментарий
49 минут назад, Nick Peterson сказал:

Вот наткнулся на очередной баг, его исправить быстро уже не удается.. Вы как это решили? или просто не заметили?

? может у меня просто нет кучи кнопок со скролбоксом...

и почему SpeedButton, а не Button? 

и как Вы нажали и зафиксировали фокус на SpeedButton, она же не держит фокус. 

воспроизвел у себя - все отлично!

Проверил, как у Вас - тоже все отлично! не знаю, что у вас там глючит. скиньте проект, для удивления этому всему!

 

Изменено пользователем #WAMACO
Ссылка на комментарий
1 час назад, #WAMACO сказал:

и почему SpeedButton, а не Button? 

Почему? да просто накидал по быстрому тестовый пример. В реальном проекте нет кучи кнопок, там даже при 2х кнопках вылезает баг, но редко. Если кинуть 20 кнопок , то баг вылезет сразу же

Фокус он держит

image.png.07ffa4177b6c62a395d752d1b9211afc.png

 

Тестовый проект для удивления прикладываю:))

 

Bugs.zip

Ссылка на комментарий
1 час назад, Nick Peterson сказал:

Почему? да просто накидал по быстрому тестовый пример. В реальном проекте нет кучи кнопок, там даже при 2х кнопках вылезает баг, но редко. Если кинуть 20 кнопок , то баг вылезет сразу же

Фокус он держит

image.png.07ffa4177b6c62a395d752d1b9211afc.png

 

Тестовый проект для удивления прикладываю:))

 

Bugs.zip

у меня все отлично! 

на будущее вам совет, не держите состояния в ui, сделайте модель, а ui только для отрисовки используйте. меньше будет глюков и таких вопросов.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...