Что такое истина? В химии это таблица Менделеева, а в каждой другой системе знаний, соответственно своя таблица есть.
Юрий Серёжкин
Это справочный раздел по компоненту, который имеет очень много свойств и режимов работы, часть из которых доступна только при использовании скриптов.
Компонент Таблица (TdbStringGridEx)
📝 Таблица в палитре компонентов называется Table Grid, название компонента можно перепутать с одноименным названием структурного элемента базы данных, поэтому правильней её называть табличной сеткой или компонентом табличного представления данных. Но для краткости в данном разделе будет использоваться термин “таблица”, а для таблицы базы данных – “таблица БД”.
Компонент специально предназначен для отображения данных, получаемых из реляционных СУБД. Он скрывает от пользователя механизм формирования SQL-запросов, предоставляя удобный визуальный конструктор. Таблица имеет режим редактирования табличных данных, сортировку и формирование итоговой информации. Пользовательская настройка ширины колонок автоматически сохраняется при закрытии программы в файле settings.ini.

Таблица может отображать данные из как одной таблицы БД, так и из нескольких, связанных реляционными отношениями. В любом случае одна из таблиц БД должна быть главной, а остальные – связанные с ней отношением “один-ко-многим”.

Настройка колонок
В проекте “Библиотека v.1.0” мы пошагово выполняли настройку колонок для решения конкретной задачи. Теперь можно рассмотреть этот механизм подробней.
В общем виде процесс выглядит так: выберите в палитре Table Grid (1), разместите компонент на форме (2). Перейдите в свойства компонента и нажмите кнопку в строке Settings (3). Откроется окно настройки колонок. Выберите главную таблицу (4). Чуть ниже расположено дерево со всеми таблицами проекта (5), из которого нужно перенести поля, которые вы хотите отобразить, в правый список (7). Для переноса используйте двойной клик по элементу дерева или кнопки (6). В списке выбранных полей сделайте нужные подписи для колонок. Вы можете изменить порядок следования колонок с помощью кнопок (8), расположенных справа. Переключите опцию отображения данных (9) в положение “Показать все записи из таблицы” и сохраните настройки, нажав кнопку “ОК” (10).

Показать дочерние записи
Опция “Показать дочерние записи” используется, если таблица располагается на форме редактирования, а сама форма открывается с помощью кнопки с настроенной функцией “Показать запись” или “Новая запись”. В этом случае MVDB отфильтровывает записи в таблице по ключевому полю основной таблицы, для которой осуществляется редактирование или отображение данных на форме редактирования.
Если попытаться добавить данные в таблицу с опцией “Показать дочерние записи” на форме, которая открыта в режиме “Новая запись”, то происходит автоматическое сохранение главной записи. Этот механизм обеспечивает целостность ссылочных данных при одновременном редактировании двух связанных между собой таблиц.
Типичным применением этой возможности является форма редактирования накладной, когда в основной таблице находятся общие реквизиты (дата и номер документа, контрагент), а в детализации – перечень товаров или услуг.
Объединение данных из нескольких таблиц
Как уже отмечалось ранее, в список отображаемых полей вы можете включать не только поля основной таблицы (1), но и поля других таблиц (2,3), имеющих связь с основной таблицей.

В приведенном примере список товаров в накладной doc_detail ссылается на справочник номенклатуры item, который в свою очередь ссылается на справочник единиц измерения unit. Если разместить необходимые для отображения данные в настройке таблицы, то MVDB автоматически сформирует SQL-запрос, с помощью которого он объединит данные из разных таблиц БД и отобразит их в нужном порядке.
☝ Теоретически MVDB может самостоятельно связывать таблицы с неограниченной глубиной вложенности связей, но на практике с этим могут возникнуть трудности, особенно если структура связей имеет перекрещивания. Поэтому правильное связывание гарантируется только при единичной глубине вложенности, для более сложных вариантов рекомендуется создавать вычисляемые поля или использовать кнопку с действием [SQL-ЗАПРОС].
Служебные колонки
Имеются две служебные колонки: порядковый номер строки (#Auto-Number) и чекер (#Checkbox).

Таблица 10. Служебные колонки
Колонка | Назначение | Описание |
---|---|---|
#Auto-Number | Порядковый номер | Отображается порядковый номер отображаемой строки. Он не связан с хранимыми данными, используется как элемент визуального оформления. ![]() |
#Checkbox | Чекер | Отображается чекбокс, который является дополнительным элементом управления, доступ к нему (в том числе переключение при клике мышью) возможен только программным путём, с помощью скриптов.![]() |
Итоговые данные
Вы можете настроить компонент для отображения итоговой строки (footer), в которой для каждой колонки отобразить результат одной из функций:
- none – нет формулы
- Sum – подсчет суммы
- Count – количество строк
- Average – среднее арифметическое
- Maximum – максимальное найденное значение
- Minimum – минимальное найденное значение
- Distinct – подсчет количества уникальных значений
Для настройки итогов по колонке кликните на кнопку с шестерёнкой (1), в открывшемся окне выберите вкладку “Итог” (2), затем – нужную формулу (3) и нажмите кнопку ОК (4) для сохранения настроек.

Здесь же можно указать статический текст, который будет отображаться до (5) или после (6) итоговой информации.
Выравнивание
По умолчанию текст выравнивается по левому краю, а числа – по правому. В окне “Настройка колонки” можно установить нужное выравнивание колонок. Отдельно можно настроить выравнивание для заголовка колонки, который по умолчанию выравнивается по левому краю.

Сортировка по умолчанию
Как вы уже знаете, при выборке данных из реляционной БД порядок следования записей должен быть указан специальным образом. В настройке таблицы для этого служит выпадающий список “Сортировать”, в котором вы можете выбрать поле для упорядочивания (1). Упорядочивание возможно как по возрастанию, так и по убыванию значений (2).

Если вам нужно сортировать данные по нескольким колонкам, то выберите вариант “ORDER BY”, а в появившемся поле перечислите через запятую порядковые номера полей:

По умолчанию создаётся сортировка по возрастанию значений. Для указания направления сортировки вы можете использовать модификаторы: ASC – по возрастанию, DESC – по убыванию:

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

Речь идет о статической фильтрации, когда нам заранее известно, какие данные нужно оставить для отображения в таблице. Статический текст фильтра может включать названия полей, операции сравнения, скобки, логические операции, а также различные функции SQL. Фильтр – это логическое выражение, которое вычисляется для каждой строки, добавляемой в результат SQL-запроса (компонент Table Grid создаёт такой запрос на основании настроек его свойств). Если условие выполняется, то запись будет добавлена в результат. Язык запросов SQL изучается на продвинутом курсе, но вы можете запомнить и использовать основные операции, используемые для фильтрации данных.
Таблица 1. Операции сравнения и логические операции
Операция | Примечание | |
---|---|---|
= | Равно | item.name = ‘Вася’ |
<> | Не равно | item.code <> 23 |
> | Больше | doc_detail.qty > 0 |
< | Меньше | doc_detail.price < 50.5 |
>= | Больше или равно | item.code >= 100 |
<= | Меньше или равно | item.code <= 100 |
and | Логическое “И” | (item.code <> 23) and (item.name = ‘Вася’) |
or | Логическое “ИЛИ” | (doc_detail.qty > 0) or (item.name <> ‘Петя’) |
not | Логическое “НЕ” | (doc_detail.qty > 0) and not (item.name = ‘Федя’) |
is null | Пустое значение | item.name is null |
is not null | Непустое значение | item.code is not null |
Примечание. В фильтре можно указать не только обычные поля, но и вычисляемые. Для этого их необходимо заключить в фигурные скобки:
item.{CalcField} <= 0
Редактирование данных в таблице
Простейшие справочники, состоящие из одного-двух полей, бывает целесообразно редактировать непосредственно в табличном представлении, не создавая отдельную форму редактирования. Для этого необходимо выполнить соответствующие настройки таблицы. Раскрыть группу “Editable” (1) и выбрать нужные опции функций редактирования. После этого в верхней части таблицы появляется пустая строка, в которую можно вводить данные (2).

Таблица 2. Свойства, дающие возможность редактирования
Свойство | Название | Описание |
---|---|---|
AllowCreate | Разрешить добавление | В верхней части таблицы появляется строка для ввода новых данных. Запись добавляется при нажатии клавиши Enter. |
AllowCreateEmpty | Разрешить добавление пустой записи | Эта опция позволяет добавлять записи с незаполненными полями. Не отменяет контроль заполнения полей на уровне СУБД. |
AllowEdit | Разрешить редактирование | Разрешить редактирование данных прямо в таблице. Для начала редактирования кликните по ячейке. При потере редактируемой ячейкой фокуса данные сохраняются в базе. |
AllowDelete | Разрешить удаление | Разрешить удаление нажатием клавиши “Delete”. Перед удалением появляется предупреждение. |
SecondClickEdit | Редактирование по второму клику | Эта опция включает режим редактирования только после второго клика по ячейке, первый клик только выделяет запись. Не влияет на возможность открытия формы редактирования по двойному клику. |
Кроме числовых и строковых данных в таблице можно выбирать ссылочные значения, но только на один уровень вложенности по связям:

Всплывающее меню. Поиск и копирование
Дополнительный полезный функционал таблицы находится в контекстном меню: копирование данных и поиск.

Таблица 3. Состав всплывающего меню
Пункт | Действие | Описание |
---|---|---|
Show record | Показать запись | Если разместить на форме с таблицей кнопку, которая имеет действие “[ПОКАЗАТЬ ЗАПИСЬ]”, то при выборе данного пункта откроется форма редактирования. Это – действие по умолчанию, оно срабатывает при двойном клике по таблице при при нажатии клавиши Enter.![]() ![]() |
Copy cell | Скопировать ячейку | Позволяет скопировать содержимое ячейки в буфер обмена![]() |
Copy row | Скопировать строку | Копирует в буфер обмена всю строку![]() |
Copy all | Скопировать всё | Помещает всю таблицу в буфер обмена![]() |
Find | Искать | Открывается окно поиска значений в ячейке.![]() Чтобы поиск работал, установите свойство additional.options.goSelectFullRow = False, тогда в результате поиска будет подсвечиваться ячейка с искомым значением. |
Унаследованные свойства
Таблица 1. Общие свойства таблицы
Название | Свойство | Описание |
---|---|---|
Name | Название | Уникальное в пределах формы имя компонента. |
Left | Лево | Абсцисса положения верхнего левого угла компонента относительно родительского компонента. |
Top | Верх | Ордината положения верхнего левого угла компонента относительно родительского компонента. |
Width | Ширина | Ширина компонента, в пикселях |
Height | Высота | Высота компонента, в пикселях |
Visible | Видимость | Признак видимости компонента. |
Anchors | Якоря | Фиксация положение верхней, нижней, правой или левой стороны компонента относительно родительского. |
Font | Шрифт | Группа свойств для настройки шрифта (тип, размер, цвет и стиль), которым отображается заголовок и содержимое таблицы. |
Font.Color | Цвет шрифта | |
Font.Name | Имя шрифта | |
Font.Size | Размер шрифта | |
Font.Style | Стиль шрифта | |
Color | Цвет | Цвет фона таблицы |
TabStop | Табулостоп | |
TabOrder | Последовательность табуляции | |
Enabled | Доступен | |
ReadOnly | Только для чтения | |
Constraints | Ограничения | Определяют минимальные и максимальные размеры элемента при его растягивании. |
Hint | Подсказка | |
ShowHint | Показать подсказку | |
Cursor | Курсор | |
BiDiMode | Режим двунаправленности | Управление режимом автоматического распознавания направления ввода или отображения данных. |
Настройка внешнего вида
Таблица имеет множество свойств, которые позволяют менять её внешний вид.
Таблица 4. Свойства, определяющие внешний вид Table Grid
Свойство | Название | Примечание |
---|---|---|
HeaderStyle | Стиль заголовка | Стиль заголовка таблицы автоматически подстраивается в зависимости от типа операционной системы и стиля её отображения, но можно вручную выставить нужный стиль. см. Таблица 5. Стили заголовка |
AppearanceOptions | Параметры внешнего вида | Набор параметров, изменяющих отдельные аспекты внешнего вида таблицы. см. Таблица 6. Параметры внешнего вида |
EnableVisualStyles | Включить использование визуальных стилей | По умолчанию включено. Позволяет использовать свойство HeaderStyle |
FixedCols | Количество фиксированных колонок | Фиксирует заданное количество колонок слева. Фиксированные колонки не прокручиваются, не редактируются. |
GridLinesColor | Цвет линий таблицы | Задать цвет линий можно только для основной части таблицы, у заголовка и подвала цвет останется серым. |
GridLinesStyle | Стиль линий таблицы | Стиль линий таблицы. см. Таблица 7. Стиль линий таблицы |
GridStyle | Стиль таблицы | Поддерживается два стиля отображения: gsReport – таблица (по умолчанию) gsSlides – слайды Примечание. Слайды – это представление, при котором данные записи отображаются не в колонках, а в слайдах. Слайд – прямоугольная область с настраиваемым размещением данных. Для реализации этого режима требуется написание скрипта. |
SortedStyle | Стиль сортировки | Устанавливает цвет выделения колонки с отсортированными пользователем данными soDefault – не выделять soDarker – выделять затемнением soWhite – выделять белым |
HideScrollBar | Скрыть полосу прокрутки | Позволяет скрывать вертикальную пустую полосу прокрутки, которая обычно видна всегда. Однако, если колонки или строки не помещаются в области отображения табличных данных, полосы прокрутки появятся. Примечание. Полностью отключить полосы не получается даже с помощью скрипта. Самый надежный способ от них избавиться – увеличить размеры таблицы так, чтобы все данные отображались без прокрутки. |
HighlightedTextColor | Цвет текста выделенной ячейки | |
InactiveSectionColor | Цвет неактивного выделения | Цвет фона выбранной ячейки при потере фокуса. При этом цвет текста ячейки становится по умолчанию, т.е. отдельной настройки для текста выбранной ячейки при потери фокуса нет. |
SelectionColor | Цвет активного выделения | Цвет фона выбранной ячейки при получении фокуса. |
Options | Опции | Набор флагов для изменения внешнего вида и поведения компонента. см. Таблица 8. Опции Table Grid |
DefaultRowHeight | Высота строки по умолчанию | Увеличение высоты строки может понадобится при отображении изображений. |
FooterSize | Высота итоговой строки | |
HeaderSize | Высота заголовка | |
InputSize | Высота панели ввода | Панель ввода появляется сверху таблицы при использовании опции добавления записей (AllowCreate). |
☝ Последние четыре свойства определяют размер ячеек для отображения данных. Их размер обычно меняют, если поменялся размер шрифта, используемого для отображения данных.
Таблица 5. Стили заголовка
Стиль | Название | Примечание |
---|---|---|
hsAuto | Автоматический | Значение по умолчанию. Стиль заголовка устанавливается в соответствии с типом и настройками операционной системы. |
hsFlatBorders | Плоские границы | ![]() Только при выборе этого стиля возможно задать цвет фона заголовка и цвет шрифта заголовка для каждой из колонок с помощью скрипта. |
hsOffice2007 | MS Офис 2007 | ![]() |
hsOffice2010 | MS Офис 2010 | ![]() |
hsOldStyle | Старый стиль | ![]() |
hsOutlook | MS Outlook | ![]() |
hsVista | Vista | ![]() |
Таблица 6. Параметры внешнего вида
Параметр | Примечание |
---|---|
ao3DGridLines* | При отрисовке ячеек делаются фаски, придающие ячейкам объёмность. |
aoAlphaBlendedSelection | Полупрозрачное выделение – в результате цвет выделения смешивается с цветом фона ячейки. Установлено по умолчанию. |
aoBoldTextSelection | Текст выбранной ячейки выделяется жирным шрифтом |
aoDontFillCells* | При отрисовке ячеек не используется фоновый цвет, выделение выбранной ячейки пунктиром |
aoHideFocus | Скрыть пунктир выделения ячейки/строки |
aoHideSelection | Скрыть выделения ячейки/строки при потере фокуса |
aoHihglightSlideCell | Выделить ячейку слайда. Используется в режиме отображения слайдов (GridStyle = gsSlides) |
aoHintMarks | Включить отображение маркера (красный треугольник) для ячеек с подсказкой (hint), которую можно добавить для каждой ячейки с помощью скрипта. |
aoIndicatedSelectedCell | Выделить выбранную ячейку. |
aoIndicatedSortedColumn | Колонка с отсортированными данными подсвечивается цветом, немного темней цвета фона. |
☝ Параметры, отмеченные звёздочкой, доступны только через скрипты.
Таблица 7. Стиль линий таблицы
Стиль | Примечание |
---|---|
lsNormal | Сетка таблицы заполняет всё пространство отображения![]() |
lsActiveHorzOnly | Сетка представлена горизонтальными линиями, только для строк, где отображаются данные![]() |
lsActiveRows | Сетка отображается только для строк, где отображаются данные. Настройка по умолчанию.![]() |
lsFramed | Сетка таблицы заполняет всё пространство отображения, строки с данными обведены рамкой![]() |
lsHorizontalOnly | Сетка таблицы заполняет всё пространство отображения, только горизонтальные линии![]() |
lsVerticalOnly | Сетка таблицы заполняет всё пространство отображения, только вертикальные линии![]() |
Таблица 8. Опции Table Grid
Стиль | Описание |
---|---|
goArrowKeyExitEditing | Выход из редактирования ячейки при нажатии вверх или вниз или влево, вправо |
goCanHideColumn | Нет данных |
goDisableColumnMoving | Запрещает перемещение всех колонок |
goDisableKeys | Запрещает перемещаться между строками с помощью стрелок на клавиатуре |
goEscClearEdit | При редактировании ячейки, позволяет ее очистить при нажатии на Esc |
goFooter | Включает подвал (итоги) |
goGrid | Включает вертикальные и горизонтальные линии |
goHeader | Включает заголовок |
goIndicator | Включает панель с указателем текущей записи |
goInput | Включает возможность вводить значения под колонками |
goLockFixedCols | Нет данных |
goMultiSelect | Позволяет выбрать сразу несколько записей. Для выделения отдельных записей удерживайте клавишу Ctrl. Для выделения последовательных записей – клавишу Shift. Сведения о выбранных записях можно получить с помощью скрипта. |
goRowResizing | Позволяет изменять вертикальный размер строк (необходимо также задействовать goIndicator) |
goRowMoving | Включает возможность перемещать строки мышкой |
goSecondClickEdit | Редактирование ячейки двойным кликом |
goSelectFullRow | Выделять строку целиком |
goUseDefaultValues | У колонок есть свойство DefaultValue, данная опция включает их. |
goInplaceEditEvents | Нет данных |
📝 По умолчанию компонент имеет следующую настройку:
goGrid + goHeader + goSelectFullRow + goDisableColumnMoving
Настройка поведения
Ниже перечислены настройки, меняющие поведение таблицы
Таблица 9. Свойства, меняющие поведение Table Grid
Свойство | Название | Примечание |
---|---|---|
HomeEndBehavior | Поведение кнопок “Home” и “End” | Управление логикой работы кнопок “Home” и “End”. Можно выбрать два вариант поведения данных кнопок, которые обычно используются для навигации по таблице: hebTopBottom – перемещение в начало/конец колонки hebLeftRight – перемещение в начало/конец строки |
KeepUserSort | Сохранить пользовательскую сортировку | Используется в режиме, когда таблица отображает динамически отфильтрованные данные для сохранения пользовательской (runtime) сортировки при обновлении данных. |
Limit | Ограничение числа отображаемых записей | Эта настройка позволяет ограничивать максимальное количество отображаемых записей. При большом числе записей может возникнуть ошибка – нехватка памяти. Установка лимита позволит предотвратить эту ошибку. Примечание. Для отображения больших массивов информации используют пагинацию – постраничный вывод данных, который можно организовать с помощью скриптов. |
MouseWheelEnabled | Задействовать колесо мыши | По умолчанию включено. Колесо мышки используется для прокрутки содержимого таблицы. |
SelectionMoveDirection* | Направление перемещения выделения | Определяет, в каком направлении будет двигаться выделение ячейки при нажатии на Enter: mdNone – не перемещать mdDown – переместить вниз mdLeft – переместить влево mdRight – переместить вправо mdUp – переместить вверх |
WantTabs | Реакция на Tab | Определяет реакцию компонента на нажатие клавиши <ТаЬ>. Если свойство установлено в значение True, то при нажатии клавиши <ТаЬ> в текст вставляются символы табуляции. По умолчанию свойство WantTabs имеет значение False, и при нажатии клавиши <ТаЬ> таблица передает фокус ввода следующему оконному элементу управления. |
TabLeaveControl* | Потеря фокуса с помощью клавиши <Tab> | Определяет, потеряет ли компонент фокус ввода при нажатии на Tab |
WantReturns* | Задействовать перевод строки клавишей Enter | Определяет, будет ли позволено вводить многострочный текст при нажатии на Enter |
Increm, Search | Кнопка “ПОИСК” | Таблица может выступать в качестве инструмента управления фильтрацией, если её указать в качестве источника данных при настройке кнопки с действием [ПОИСК]. Для того, чтобы фильтрация менялась синхронно с перемещением по строкам таблицы, укажите в данном свойстве кнопку, отвечающую за поиск данных. |
☝ Параметры, отмеченные звёздочкой, доступны только через скрипты.
Ручная сортировка
Пользователь может отсортировать данные в таблице, кликнув по заголовку колонки. Данные сортируются по возрастанию значений. Повторный клик изменит направление сортировки на противоположное. Направление сортировки отображается в виде треугольника в заголовке колонки.

Кроме пользовательской сортировки, которая происходит при клике мышкой по заголовку, возможна сортировка с помощью перетягивания мышкой отдельных строк таблицы. Для включения режима перетягивания установите свойство additional.options.goRowMoving = True.
Выделите строку (1). Удерживая левую клавишу мышки, укажите новое место расположения для выделенной строки (2).

☝ Результаты ручной сортировки не сохраняются. Сохранение возможно с помощью скриптов и дополнительного поля в базе для хранения порядка отображения записей.
Отображение изображений
В таблице можно отображать изображения, если добавить в список отображаемых полей поле с типом “Изображение”. Изображение автоматически растягивается по размеру ячейки. Для увеличения высоты ячейки по умолчанию используйте свойство таблицы DefaultRowHeight. Если вы хотите иметь возможность менять высоту ячейки в процессе выполнения программы, установите свойства таблицы Options.goRowResizing и Options.goIndicator в значение True. Ширина ячейки настраивается в процессе выполнения программы и автоматически запоминается при завершении работы.

Если размер загруженных в базу изображений большой, это может значительно снизить производительность системы – отображение картинок будет идти с задержкой. Поэтому рекомендуется отображать уменьшенные копии оригинальных картинок.
Слайды
Режим отображения слайдов активируется установкой свойства GridStyle = gsSlides. Но для отображения данных потребуется написание кода. Слайды могут отображать как текстовую информацию, так и графическую.

Теперь рассмотрим остальные компоненты пользовательского интерфейса и начнем с компонентов для ввода и отображения данных.
Спасибо! Было интересно. Но остался вопрос как задать размер колонки или если текст в колонке длинный что бы не нарушать шаблон?
Заранее Спасибо за Ваш труд!
Не совсем понял вопрос. Если текст в ячейке таблицы не помещается, то есть несколько способов решения этой проблемы: 1) автоматически увеличить ширину колонки 2) автоматически увеличить высоту строки и отобразить данные внутри ячейки в несколько строк. 3) навести курсор на ячейку – в подсказке отобразится вся информация. Первые два способа потребуют написание кода. Я пока публикую материалы, ориентированные на создание non-code приложений, но дойдет очередь и до low-code части. У неё как раз будет “проблемно-ориентированная” подача материала: будут рассматриваться типовые (и не очень) задачи и способы их решения. Форматирование таблицы по данным – одна из таких задач.
Понятно буду ждать.
Спасибо вам за Ваш труд!!
Не совсем понятно с фильтром. Например мне надо вывести в таблице значения только на сегодняшний день. Не ясно как это реализовать с помощью фильтра.
Фильтр, описанный в статье, статический, то есть можно отфильтровать записи только на фиксированную дату. Чтобы фильтровать данные на сегодняшний день, нужно или настроить фильтрацию по кнопке, Action = [ПОИСК] или Action = [SQL-ЗАПРС], или настроить фильтр с помощью скрипта. Обо всем этом будет идти речь в последующих статьях.
Хорошо. Будем ждать.