Сетка FireMonkey с разными элементами управления в одном столбце

Что вы можете сделать, если вам нужны разные элементы управления ячейками в одном столбце сетки в FireMonkey. Кажется, что элемент управления ячейкой принадлежит столбцу, но бывают ситуации (например, редактор свойств), где для некоторых строк требуется флажок, а для других строк — поле со списком или элемент управления редактированием.

Заранее спасибо.


person TheRoadrunner    schedule 29.05.2012    source источник


Ответы (4)


Арно уже ссылался на мою статью в своем ответе. В статье рассматриваются основы сеток, столбцов и ячеек. Следующие шаги должны помочь вам начать работу:

  • Создайте стиль, добавьте в него элементы управления, которые вы хотите отобразить (например, TCheckbox, TCombobox и TEdit). Добавьте их в TLayout и установите StyleName для каждого элемента управления на что-нибудь запоминающееся.
  • В ваших ячейках ApplyStyle используйте FindStyleResource для извлечения элементов управления, которые вы добавили выше, используя их имена стилей.
  • Когда сетка вызывает метод SetData вашей ячейки, вам необходимо установить свойство Visible для каждого элемента управления, чтобы отображался только соответствующий элемент. Если вы не можете определить это по переданным данным, добавьте в ячейку обработчик событий, чтобы получить данные.
  • Вам нужно будет разобраться с обработкой клавиатуры, которая становится довольно грязной. Если память не изменяет, вам нужно передать ключи из сетки/ячейки в элемент управления (или это перехватывает клавиши движения из элементов управления и передает их в сетку? Извините, если я забыл точную деталь).

Извините, я не могу дать более подробный ответ, но полное освещение этого заняло бы целую серию сообщений в блоге.

person Mike Sutton    schedule 29.05.2012

Решение вы найдете в этой статье, я думаю.

Пример пользовательской ячейки сетки

Вам нужно будет создать собственный класс ячеек.

person Arnaud Bouchez    schedule 29.05.2012

Используйте стиль — установите стиль ячейки, когда вы устанавливаете данные ячейки — затем используйте событие onapplystyle, чтобы сделать что-нибудь умное, что вам нужно, с ячейкой с новым стилем.

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

Подсказка - FindStyleResource здесь ваш друг :-)

person Paul Foster    schedule 29.05.2012

Мне также понадобился редактор свойств, и я искал способ разместить разные типы ячеек в одном столбце. Использование разных стилей для каждой строки может быть решением, как было предложено выше, но поскольку сетка Firemonkey не резервирует какой-либо элемент управления ячейкой для определенной строки, каждый раз, когда элемент управления ячейкой будет отображаться в строке, к нему будет применяться истинный стиль. Это не большая проблема для редактора статических свойств, однако для реальной сетки, которая имеет несколько строк и разные типы ячеек в каждой строке, требуется другая стратегия. Поэтому я придумал другое решение, я рассмотрел прокси типа ячейки между TColumn и элементами управления ячейкой, чтобы каждый прокси ячейки резервировал элементы управления ячейкой, за которые отвечает. Во-первых, у меня есть новая TColumn (TvariantColumn), которая отвечает за топовую стратегию.

vColumn := TVariantColumn.Create(Self);
vColumn.Header := 'Variant Column';
vColumn.OnGetCellProxyIndex := GetCellProxyIndex;
Grid1.AddObject(vColumn);

Затем создайте любые прокси, например

vColumn.NewCellProxy(TTextProxy); 
vColumn.NewCellProxy(TColorComboProxy);
vColumn.NewCellProxy(TComboColorProxy);

Вы также можете обрабатывать определенные задания прокси-сервера после его создания, например

with TProgressProxy(vColumn.NewCellProxy(TProgressProxy)) do //4
begin
  Min := 0;
  Max := 100;
end;

with  TPopUpProxy(vColumn.NewCellProxy(TPopupProxy)) do //5
begin
  Items.Add('Istanbul');
  Items.Add('Paris');
  Items.Add('NewYork');
end; 

Я разместил свой метод в блоге на своем веб-сайте и опубликовал подробный статья, где можно найти дополнительную информацию по теме.

person mehmed.ali    schedule 21.11.2012