Найти в Дзене

Выпадающий список в ячейке TStringGrid

В Delphi и Lazarus, когда вы используете таблицы для ввода-вывода данных, иногда (впрочем, довольно часто) необходимо, чтобы в каком-то столбце была возможность не просто вводить текст, а выбирать значение из списка. При работе с базами данных это можно сделать, например, с помощью TDBGrid с полем lookup. Но, если вы не используете базу данных, а таблица вам нужна для отображения каких-то временных данных или для выгрузки в файл (загрузки из файла), то проще использовать TStringGrid. Однако в таблице этого вида нет стандартных возможностей сделать ячейку с выпадающим списком. Что же делать? Без паники. Потому что всегда есть нестандартные решения. Об одном из таких решений я сегодня расскажу. Основная идея: При начале редактирования ячейки вы можете подставить вместо стандартного редактора (TEdit) компонент TComboBox, наполнить его нужными значениями и после выбора записать результат в ячейку. Как это сделать? 1) Разместите на форме TStringGrid и TComboBox. Комбобокс можно сделать неви

В Delphi и Lazarus, когда вы используете таблицы для ввода-вывода данных, иногда (впрочем, довольно часто) необходимо, чтобы в каком-то столбце была возможность не просто вводить текст, а выбирать значение из списка. При работе с базами данных это можно сделать, например, с помощью TDBGrid с полем lookup.

Но, если вы не используете базу данных, а таблица вам нужна для отображения каких-то временных данных или для выгрузки в файл (загрузки из файла), то проще использовать TStringGrid. Однако в таблице этого вида нет стандартных возможностей сделать ячейку с выпадающим списком. Что же делать?

Без паники. Потому что всегда есть нестандартные решения. Об одном из таких решений я сегодня расскажу.

Основная идея: При начале редактирования ячейки вы можете подставить вместо стандартного редактора (TEdit) компонент TComboBox, наполнить его нужными значениями и после выбора записать результат в ячейку.

Как это сделать?

1) Разместите на форме TStringGrid и TComboBox. Комбобокс можно сделать невидимым, он будет появляться только при редактировании определённых ячеек.

2) Настройте StringGrid:

  • Установите Options → goEditing в True.
  • В событии OnSelectEditor напишите код, который для нужных столбцов (или ячеек) подставляет комбобокс.

3) Обработайте выбор в комбобоксе, чтобы перенести значение в ячейку и завершить редактирование.

Дополнительно нужно обработать событие OnChange (или OnCloseUp) комбобокса, чтобы при выборе значения оно сразу попадало в ячейку и редактирование завершалось.

Правда, есть ещё одна проблема - размер формы может меняться, в таблице может быть множество строк. А нам надо, чтобы комбобокс при редактировании ячейки находился именно на этой ячейке, а не где попало. Это, конечно, тоже решается.

Вот итоговый пример кода. Обработчик события StringGrid1SelectEditor:

Обработчик события ComboBox1Change:

-2

А выглядеть всё это будет примерно так:

-3

Что нужно предусмотреть

  1. Разместите ComboBox на форме, но сделайте его невидимым в обычном состоянии. Проще всего установить Visible := False в инспекторе объектов или в обработчике события FormCreate. При редактировании видимость включится автоматически.
  2. Убедитесь, что ComboBox не перекрыт другими элементами управления. Он должен быть «свободным» (не внутри панели с Align = alClient и т.п.), иначе автоматическое изменение границ может работать некорректно. Лучше всего поместить его прямо на форму (или на панель, но без ограничений по размещению).
  3. Настройте стиль и поведение комбобокса:
  • Если хотите только выбор из списка, установите Style := csDropDownList.
  • В обработчике OnChange (или OnCloseUp) записывайте выбранное значение в ячейку и завершайте редактирование, как было показано в примере.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.