(изменено: SafiullinMF, 26 ноября 2012г. 13:26:22)

Тема: Работа с ActiveX компонентами на формах. Элемент управления TDMSGridCtrl

ActiveX компоненты появившиеся вместе с четвертой версией TDMS позволяют значительно разнообразить функционал форм ввода. Кроме того, они специально «заточены» для использования вместе с TDMS. Эта статья про один из таких компонентов TDMSGridCtrl, который позволяет организовать работу с табличными данными.

Создание элемента управления
Для того чтобы поместить на форму элемент управления (контрол):

  1. Используем кнопку добавления элемента управления в дизайнере формы
    Работа с ActiveX компонентами на формах. Элемент управления TDMSGridCtrl

  2. Задаем размеры и позиционируем на форме
    Работа с ActiveX компонентами на формах. Элемент управления TDMSGridCtrl

В окне свойств контрола можно посмотреть события, которые он может обрабатывать и сгенерировать шаблоны процедур для их обработки. Обработка событий, как и для любого другого контрола, описывается в скрипте формы
Работа с ActiveX компонентами на формах. Элемент управления TDMSGridCtrl

Теперь у нас есть пустой контрол на форме. Контрол можно инициализировать связав его с каким-нибудь с табличным атрибутом (например текущего объекта ThisObject), либо результатом выборки. Для этого используется свойство DataSource. Типичные места, где это можно сделать: обработка события открытия формы Form_BeforeShow, обработка нажатия кнопки на форме. При этом каждый раз при открытии формы контрол нужно инициализировать заново. Попытка обратиться к компоненту ActiveX, пока форма не открыта, приведет к ошибке. Можно работать с контролом и без связывания с атрибутом.

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

Set grid = ThisForm.Controls("TDMSGRID").ActiveX

Свойства
Первое характерное свойство TDMSGridCtrl – это DataSource. Свойство позволяет связать контрол с источником данных: любым табличным атрибутом любого объекта, пользователя и т.д., либо с объектом типа  TDMSSheet (например с результатом выборки). Если задать его, то контрол примет вид такой же, как указанный источник данных на форме, появятся соответствующие столбцы и ячейки, со значениями такими же, как в табличном атрибуте в данный момент. Значение DataSource можно устанавливать много раз и каждый раз будет заново происходить инициализация, контрол будет очищаться и заново заполняться в соответствии с текущим состоянием указанного источника даных. То же самое будет происходить, если использовать метод Refresh.

Для контрола, связанного с табличным атрибутом можно использовать свойства:
ColumnValue, возвращает тип атрибута для указанного столбца в виде TDMSAttributeDef. Иначе говоря, позволяет получить тип данных столбца таблицы. Работает только для столбцов, полученных из табличного атрибута (не будет работать для столбцов, добавленных методом InsertColunn)
RowValue, возвращает строку табличного атрибута, связанную с указанной строкой контрола в виде TDMSTableAttributeRow.

Получить/установить значение отдельной ячейки можно при помощи свойств CellText (представляет значение любого типа в виде текста) и CellValue. Оба свойства не позволяют добраться до значений ячеек типа «Флаг», его можно получить через RowValue.

Свойства, регулирующие поведение таблицы это:
ReadOnly
ColumnAutosize, автоматическое растягивание/сжатие ширины столбцов под ширину таблицы
ColumnEditable, управление возможность редактирования ячеек определенного столбца
InsertMode, возможность вставки новых строк пользователем вручную, влияет на наличие строки со звездочкой в конце таблицы

И наконец, есть несколько свойств для определения текущих выбранных ячеек таблицы:
SelectedColumn и SelectedRow, текущий столбец и строка, при множественном выборе указывают на последний выбранный столбец/строку
SelectedRows, массив выбранных строк. Строки могут быть выбраны как подряд, так и с пропусками (при выборе нескольких столбцов можно выбирать только подряд идущие)
Selection, массив из четырех значений, определяющий диапазон выбранных ячеек, индексы левого и правого столбца, верхней и нижней строки
Напрямую обратиться к элементам массивов SelectedRows и Selection нельзя, возникает ошибка. Чтобы работать с ними необходимо предварительно присвоить переменной значение свойства и работать с ней.

selection = grid.Selection
selectedrows = grid.SelectedRows

Эти свойства дополняются несколькими методами для более удобного определения выбранного диапазона:
IsAllSelected, все ячейки таблицы выбраны
IsEntireColumnSelected, указанный столбец выбрано полностью
IsEntireRowSelected, указанная строка выбрана полностью
IsOneCellSelected, выбрана единственная ячейка

Методы
Методов у TDMSGridCtrl совсем немного. Помимо уже перечисленных, есть методы:

  • Для работы со строками: InsertRow, DuplicateRow, RemoveRow, RemoveAllRows

  • Для работы со столбцами: InsertColumn, RemoveColumn

  • Метод Redraw для перерисовки таблицы. Часто используется для отображения изменений в таблице (даже при редактировании значения ячейки)

Важно, что в столбцах, добавленных методом InsertColumn невозможно вручную редактировать значения ячеек или задать для них тип данных. Это можно делать только для столбцов, привязанных к источнику данных DataSource. Тем не менее, для всех ячеек можно работать со свойствами CellText и CellValue.

События
События для TDMSGridCtrl практически полностью совпадают с событиями табличного атрибута. В первую очередь это характерные для таблицы события:

  1. SelChanged. Смена выбранных ячеек. К сожалению, в параметры не передаются массивы вновь выбранных ячеек и ячеек, с которых выделение снято

  2. CellChecked. Проставление/снятие галочки в ячейке типа данных «Флаг». В параметры передаются номера сроки и колонки и новое значение. Есть возможность отмены действия.

  3. CellAfterEdit. Редактирование значения ячейки. В параметры передаются номера сроки и колонки и новое значение. Есть возможность отмены действия.

  4. RowInserted. Вставка новой строки. В параметры передается номер новой строки.

  5. RowDuplicated. Дублирование строки. В параметры передаются номера новой строки и номер оригинала.

  6. RowBeforeRemove. Удаление строки. В параметры передается номер строки. Есть возможность отмены действия

Кроме этого обычные события для взаимодействия с пользователем DblClick и ContextMenu (отработка правого щелчка мыши, позволяет сгенерировать контекстное меню). По индексам строки и столбца, передаваемым в параметры можно определить по какой части таблицы был произведен клик (заголовок столбца, ячейка данных и т.д. см. пример). Также есть событие Refreshed (обновление с источника данных).

Итог
TDMSGridCtrl удобно использовать для расширения возможностей работы с табличным атрибутом или несколькими (Работа с табличным атрибутом в TDMS4). При этом может быть целесообразнее создавать на форме не компонент ActiveX, а контрол самого табличного атрибута, а затем уже к нему обращаться как к компоненту ActiveX. Или он может понадобиться в ситуации, когда табличный атрибут неприменим по какой-то причине. Возможности применения, правда, ограничиваются тем, что нельзя будет редактировать значения ячеек вручную.

Пример
В приведенном примере содержится форма TDMS «GRID» и табличный атрибут «TABLE», которые нужно добавить в какой-нибудь тип объектов. При открытии формы TDMSGridCtrl изначально будет пустым. Чтобы его связать с табличным атрибутом данного объекта используется кнопка «Init». Внизу формы контрол табличного атрибута TABLE для удобства его заполнения. Справа от TDMSGridCtrl кнопки для работы с ним. Кроме этого контрол отрабатывает вызов контекстного меню.
Работа с ActiveX компонентами на формах. Элемент управления TDMSGridCtrl

Для того, чтобы посмотреть пример достаточно импортировать файл GRID.tds в любую настройку и прикрепить форму GRID и TABLE атрибут к любому типу объектов.

Post's attachments

GRID.tds 17.03 Кб, 88 скачиваний с 2012-11-26 

You don't have the permssions to download the attachments of this post.