Что такое истина? В химии это таблица Менделеева, а в каждой другой системе знаний, соответственно своя таблица есть.

Юрий Серёжкин

Это справочный раздел по компоненту, который имеет очень много свойств и режимов работы, часть из которых доступна только при использовании скриптов.

Компонент Таблица (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Плоские границы
Только при выборе этого стиля возможно задать цвет фона заголовка и цвет шрифта заголовка для каждой из колонок с помощью скрипта.
hsOffice2007MS Офис 2007
hsOffice2010MS Офис 2010
hsOldStyleСтарый стиль
hsOutlookMS Outlook
hsVistaVista

Таблица 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. Но для отображения данных потребуется написание кода. Слайды могут отображать как текстовую информацию, так и графическую.

Теперь рассмотрим остальные компоненты пользовательского интерфейса и начнем с компонентов для ввода и отображения данных.

6 комментариев к «Отображение табличных данных»
  1. Спасибо! Было интересно. Но остался вопрос как задать размер колонки или если текст в колонке длинный что бы не нарушать шаблон?
    Заранее Спасибо за Ваш труд!

    1. Не совсем понял вопрос. Если текст в ячейке таблицы не помещается, то есть несколько способов решения этой проблемы: 1) автоматически увеличить ширину колонки 2) автоматически увеличить высоту строки и отобразить данные внутри ячейки в несколько строк. 3) навести курсор на ячейку – в подсказке отобразится вся информация. Первые два способа потребуют написание кода. Я пока публикую материалы, ориентированные на создание non-code приложений, но дойдет очередь и до low-code части. У неё как раз будет “проблемно-ориентированная” подача материала: будут рассматриваться типовые (и не очень) задачи и способы их решения. Форматирование таблицы по данным – одна из таких задач.

  2. Не совсем понятно с фильтром. Например мне надо вывести в таблице значения только на сегодняшний день. Не ясно как это реализовать с помощью фильтра.

    1. Фильтр, описанный в статье, статический, то есть можно отфильтровать записи только на фиксированную дату. Чтобы фильтровать данные на сегодняшний день, нужно или настроить фильтрацию по кнопке, Action = [ПОИСК] или Action = [SQL-ЗАПРС], или настроить фильтр с помощью скрипта. Обо всем этом будет идти речь в последующих статьях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *