Я переписываю компонент VCL, показывающий настроенный TCustomListbox
на Firemonkey в Delphi 10.2. При настройке использовалось переопределенное значение DrawItem
, в основном добавление отступов и установка цвета текста в зависимости от текста и индекса элемента.
DrawItem
сделал это довольно просто, но в FMX вроде бы ничего подобного нет. Я могу переопределить PaintChildren
и нарисовать каждый элемент сам, но тогда он выглядит по-другому, и мне самому приходится иметь дело с прокруткой и всем остальным. Я только начинаю работать с FMX, и у пока нет исходников.
Есть ли
DrawItem
замена в FMX? Возможно, я это пропустил.Если нет, как получить необходимую информацию? В основном это прямоугольник, который нужно нарисовать, и в идеале используемый стиль.
Проблемы
Решение Ганса работает, но имеет несколько серьезных проблем:
Цвет
Установить цвет не получается, текст всегда черный. Я пробовал разные возможности, включая этот:
PROCEDURE TMyItem.Paint;
BEGIN
TextSettings.FontColor := TAlphaColorRec.Red;
INHERITED;
END;
Скорость
Открытие коробки со 180 предметами занимает около двух секунд. Нам нужно такое количество элементов, и их количество на самом деле является причиной, по которой нам нужен настраиваемый блок (мы обеспечиваем фильтрацию, используя TEdit
часть нашего компонента). Версия, использующая строки без TMyItem
, была быстрее (хотя, вероятно, медленнее, чем версия VCL), но использование этих элементов, похоже, замедляет ее еще больше (это медленнее, чем заполнение списка HTML с аналогичным стилем).
Или что-то другое? Не имея исходников и практически никакой документации, сказать не могу.
Я попытался кэшировать элементы для повторного использования, но это не помогло.
Похоже, что использование настраиваемых элементов на самом деле быстрее, чем использование строк (время в миллисекундах):
nItems String TMyItem
200 672 12
2000 5604 267
20000 97322 18700
Проблема скорости, кажется, накапливается, когда контент изменяется несколько раз. Я использовал FListBox.Items.Clear;
, потом попробовал
n := FListBox.Items.Count;
FOR i := 0 TO n-1 DO FListBox.ListItems[n-1-i].Free;
и, наконец, FListBox.Clear;
, что имеет наибольший смысл (и которое я нашел последним). Тем не менее, в итоге, кажется, требуется 2 мс на элемент.
Paint
и добавив другие элементы управления (например, текст / метку) в методе Create. - person Hans   schedule 04.05.2018TCustomListbox
использоватьTMyListBoxItem
? - person maaartinus   schedule 04.05.2018TListBoxItem
жестко запрограммировано внутри реализацииTListBox.Items
, вы не можете его переопределить. Может, что-то изменилось в Берлине или Токио, я не знаю. Вам нужно будет проверить исходный кодTListBox
вFMX.ListBox.pas
, чтобы узнать, позволяет ли он указать определяемый пользователем класс (но я сомневаюсь в этом, я ничего не вижу в _ 5_ документация об этом). - person Remy Lebeau   schedule 05.05.2018MyItem.TextLabel.TextSettings.FontColor
. Что касается скорости, нормальное поведение TListBox работает быстрее? - person Hans   schedule 15.05.2018TListBoxItem.TextLabel
. - person maaartinus   schedule 15.05.2018StyledSettings
, и они перекрыли мой цвет - даже когда стиля нет вообще. Я даже не знал, что они существуют. У проблемы скорости есть тривиальное решение:BeginUpdate / EndUpdate
. Опять плохо (я не очень знаком с Delphi и я новичок в FMX). - person maaartinus   schedule 16.05.2018ListBoxItem
. Я сделал это для некоторых своих задач, но я предпочитаю решение в своем ответе, потому что оно очень гибкое. - person Hans   schedule 16.05.2018