Тема работы со шрифтами в FireMonkey, а теперь уже в FM Platform живет. Началось все с того, что решил я перенести один свой проектик на Android. Помните была такая программка «Хронометр«? Вот её-то я и решил перенести на мобильные рельсы.
Можно было бы и клиент для DelphiFedds перенести, но, прикинув сколько в каком проекте кода надо будет изменить, а то и вообще выкинуть, пришел к выводу, что перенести «Хронометр» будет значительно проще — вся «сложность» только в том, чтобы переписать «морду», а все остальное должно прекрасно заработать в Android, в том числе и БД SQLite. Вот в процессе работы над интерфейсом своего первого мобильного приложения я и натолкнулся снова на работу со шрифтами.
Захотелось реализовать мне такую простецкую вещь — если пользователь отмечает в списке задачу как «завершенную», то текст этой задачи становится зачеркнутым. Я полагаю, что многие видели такое поведение в списках задач…ну, например, в тех же Google Tasks. Всё достаточно просто…но, думаю, что для тех, кто переходит на Delphi XE5, например, из Delphi XE2, может оказаться не совсем очевидно :) Итак, по крайней мере, в Delphi XE5 у элементов TListBoxItem появилось свойство Font:
Это просто отлично и замечательно. Вначале пробуем сменить стиль в design-time — сделаем текст у элемента жирным и перечеркнутым:
Запускаем программку на устройстве:
Как видите, все замечательно. Теперь, по логике вещей, я могу в run-time сделать вот так:
procedure TForm5.Button1Click(Sender: TObject); var LI: TListBoxItem; begin LI:=TListBoxItem.Create(ListBox1); LI.Parent:=ListBox1; LI.Text:='ListBoxItem_2'; Li.Font.Style:=[TFontStyle.fsStrikeOut,TFontStyle.fsBold] end;
И получить ровно тот же самый результат. Разве не так? Оказывается нет. Результат выполнения этого кода представлен на скриншоте ниже:
Как видите, элемент списка добавился, но стиль текста вообще не изменился. В чем загадка? Первое, что вспомнилось на тему стилей текста в FireMonkey — это статья «Установка параметров текста в Fire Monkey 2» в блоге Сергея Рощина (разработчика платформы FM (ex/ FireMonkey)). Судя по информации из этой статьи, решение проблемы может быть следующим: изменяем у создаваемого элемента списка свойство StyledSettings таким образом, чтобы самим задавать стиль текста и только после этого меняем его (стиль текста) у элемента. То есть, преобразуем код выше следующим образом:
procedure TForm5.Button1Click(Sender: TObject); var LI: TListBoxItem; begin [...] LI.StyledSettings:=[TStyledSetting.ssSize, TStyledSetting.ssFamily, TStyledSetting.ssFontColor,TStyledSetting.ssOther]; LI.Text:='ListBoxItem_2'; Li.Font.Style:=[TFontStyle.fsStrikeOut,TFontStyle.fsBold]; [...] end;
Проверяем:
Ровно то же, что и в приведенном выше коде, происходит и в design-time, т.е. как только вы меняете что-либо в свойство Font — автоматически изменяется и свойство StyledSettins. Можете проверить это — выставить в свойстве StyledSettings все значения в True, потом изменить, например, стиль текста и посмотреть, что будет содержать после этого действия StyledSettins.
Остается только добавить, что, если Вы решите задавать все свойства текста самостоятельно, то по умолчанию в Android используются шрифты из семейства Droid (Droid Sans, Droid Sans Mono, Droid Serif, Droid Logo) или Roboto. Roboto есть в списке шрифтов:
Удачных вам разработок под Android в Delphi XE5 и до новых встреч на страницах блога WebDelphi :)
Спасибо за статью, было бы замечательно, если бы Вы рассказали как использовать свой шрифт в приложении для андроид.
Мои попытки реализовать посредством ресурсов, пока не дали результатов, но, возможно, я что-то делаю не так.
Хорошо сделано. Я уже долго работаю в среде Delphi XE5 и могу сказать что лучше и проще пока никто не придумал.