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

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

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

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

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

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

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

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

Set list = Form.Controls("TDMSLIST").ActiveX

Свойства
Свойства TDMSListCtrl можно разделить на несколько групп. Ниже описана основная часть:

  • Управление внешним видом контрола: BackColor, BorderStyleHideSelection (скрывает подсветку выбранных элементов при санятии фокуса с контрола). Кроме того, для каждой ячейки можно работать со свойством ItemFormat, которое возвращает значение типа TDMSTextFormat, оно позволяет настраивать внешний вид отдельной ячейки TDMSListCtrl.

  • Свойства, управляющие поведением контрола:
    CheckBoxes, возможность проставления галочек напротив элементов списка
    ColumnAutosize, автоматическое растягивание ширины столбцов под ширину контрола
    ColumnSortEnabled, возможность сортировки элементов списка по столбцам
    ColumnIcon, устанавливает иконку для определенного столбца (отображается слева от названия)
    FilterBarEnabled, наличие фильтра
    SingleSelection, отключение возможности множественного выбора элементов

  • Свойства для работы со столбцами:
    ColumnCanDrag, возможность перетаскивания для определенного столбца
    ColumnOrder, порядковый номер столбца при отображении (меняется при перетаскивании, при этом индекс столбца, использующийся для обращения к нему, остается неизменным)
    ColumnResizible, возможность растягивания столбца
    ColumnSort, режим сортировки для столбца

  • Свойства для работы с элементами:
    ItemText, текст для указанного элемента в указанном столбце
    ItemIcon, иконка для указанного элемента в указанном столбце
    ItemData, значение любого типа, привязанное к определенному элементу (например, путь к файлу или ссылка на версию объекта)
    ItemFormat, уже упоминавшее свойство для настройки внешнего вида ячеек (указывается элемент и столбец)
    SelectedItem, выбранный элемент, при множественном выборе последний выбранный элемент
    Check, управление галочкой напротив элемента списка (если включен соответствующий режим)

  • Кроме этого, есть и другие свойства с очевидным назначением

Методы
Методов у TDMSListCtrl немного и их также можно разделить на группы:

  • Работа с элементами: InsertItem, DeleteItem, DeleteAllItems

  • Работа со столбцами: InsertColumn, DeleteColumn

  • Полная очистка контрола: DeleteAll

  • Управление выбором элементов: SelectItems (позволяет выбрать диапазон элементов, при этом можно сбросить/оставить предыдущий выбор), IsItemSelected

Специальные инструменты для работы с TDMS
Кроме уже упомянутых свойств и методов есть еще специальные для работы с данными TDMS:

  1. Метод Init. Позволяет инициализировать контрол значениями из коллекций TDMSObjects, TDMSUsers или из TDMSTableAttributes, TDMSSheet. При этом в контроле появятся соответствующие столбцы и элементы, будут заполнены текстовые данные, проставлены иконки элементов. Применение метода очищает контрол от элементов и столбцов которые были перед этим

  2. Метод InsertObject, добавляет элемент, связанный с объектом TDMS

  3. Метод UpdateItem, обновление элемента со связанного с ним объекта

  4. Свойство ItemObject позволяет получить ссылку на объект связанный с элементом списка

События
Основные события, которые можно обрабатывать для TDMSTreeCtrl это:

  1. Checked, проставление/снятие галочки у элемента, отменяемое

  2. DblClick, двойной клик по элементу

  3. ColumnClick, клик по заголовку столбца

  4. ContextMenu, правый клик по элементу, можно выводить контекстное меню

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

Итог
TDMSListCtrl удобно использовать для обработки результатов выборки, состава объекта или коллекции объектов/пользователей, да и вообще любых списков. Возможности ограничены тем, что нельзя вручную редактировать текст в ячейках.

Пример
В приведенном примере содержится форма TDMS «LIST», табличный атрибут «LIST_ITEM» которые нужно добавить в какой-нибудь тип объектов. При открытии формы в TDMSListCtrl будет дважды отображаться состав текущего объекта в виде элементов, связанных с объектами TDMS и в виде обычных элементов. TDMSListCtrl отрабатывает события двойного клика, правого клика по заголовку столбца. Рядом со списком находятся кнопки демонстрирующие поведение TDMSListCtrl. В скрипте формы есть комментарии к коду.
Работа с ActiveX компонентами на формах. Элемент управления TDMSListCtrl.

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

Post's attachments

LIST.tds 24.21 Кб, 128 скачиваний с 2012-11-26 

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

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

Спасибо, очень хорошая статья.
Хотелось бы получить уточнение. Вы описываете свойство FilterBarEnabled, наличие фильтра. Но сейчас оно доступно только для чтения (в чем тогда его смысл, если оно всегда возвращает false   :blink: ). Планируется ли его сделать редактируемым?

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

lenav пишет:

Вы описываете свойство FilterBarEnabled, наличие фильтра. Но сейчас оно доступно только для чтения (в чем тогда его смысл, если оно всегда возвращает false)

Это ошибка. Она уже зарегистрирована и будет иправлена в ближайшее время

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

Здравствуйте!

Не получается работать с ItemFormat. Выдает ошибку...
Код:

Set List = ThisForm.Controls("USER_LIST").ActiveX
Set F = List.ItemFormat(i, 1)
F.Color = RGB(255,0,0)

Что я делаю не так?

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

teem0n пишет:

Здравствуйте!

Не получается работать с ItemFormat. Выдает ошибку...
Код:

Set List = ThisForm.Controls("USER_LIST").ActiveX
Set F = List.ItemFormat(i, 1)
F.Color = RGB(255,0,0)

Что я делаю не так?

Здравствуйте. У меня такой код работает.
Уточните характер ошибки. Пока могу предположить, что вы указываете неверные индексы в List.ItemFormat(i, 1)

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

SafiullinMF пишет:

Здравствуйте. У меня такой код работает.
Уточните характер ошибки. Пока могу предположить, что вы указываете неверные индексы в List.ItemFormat(i, 1)

Индексы верные, по крайней мере текст задать получается:

        List.InsertItem i, ""
        List.ItemText(i,1)= User.Description
        Set F = List.ItemFormat(i, 1)
        F.Color = RGB(255,0,0)

Текст в данном случае задается, а при попытке задать цвет выскакивает ошибка в последней строчке.
Код ошибки 0, описание пустое.

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

teem0n пишет:

Индексы верные, по крайней мере текст задать получается:

        List.InsertItem i, ""
        List.ItemText(i,1)= User.Description
        Set F = List.ItemFormat(i, 1)
        F.Color = RGB(255,0,0)

Текст в данном случае задается, а при попытке задать цвет выскакивает ошибка в последней строчке.
Код ошибки 0, описание пустое.

Тогда непонятно, у меня такой код работает

(изменено: Shoorup, 3 сентября 2013г. 09:04:16)

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

При неправильном заданном значении для свойства BorderStyle - TDMS выдает ошибку и падает после ее закрытия.


Подскажите как пользоваться свойствами:
.ShowToolTips
.ColumnTooltip

Чета не получается вывести подсказку. Как она работает?
.FilterBarEnabled - не починили...

ItemFormat у меня тоже не получилось запустить. Таже ошибка.


Если возможно приведите пример использования следующих свойств:
Application
ColumnOrder
Font
ForeColor
Scrollable
ReadOnly

Некоторые никак не реагировали.

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

У меня применить TDMSListCtrl получилось, но не без танцев с бубном.  :huh:
1. Scrollable не работает, а хотелось бы..
Мне подуше менять высоту List (элементов у меня не более 15 будет точно) чем прокручивать их или занимать пустым белым полем форму.

If b <> 0 Then 'b -количество элементов в List
ThisForm.Controls("TDMSLIST1").Height = 11+b*10.6 '11 - высота шапки. 10.6 - коэффициент для увеличения
End If

2. Если выводить состав в List, то колонки создает и именует по умолчанию. Но вот удалить .DeleteColumn нужные колонки не получается, они странным образом "передислоцируются".
3. .ColumnCanDrag (n) не пойму зачем для каждого столбца нужно задавать. По мне так либо двигать все, либо не двигать ни одного. А так если даже и запретить некоторые, то они всеравно могут передвигаться за счет передвижения других.
4. .ColumnAutosize - почемуто всеравно оставляет в конце "пробел" - т.е. не растягивается по всей длине.
5. .DeleteItem Больше всего было танцев тут. Может так и задумывалось но что-то мне подсказывает что это косяк TDMSListCtrl.
Вот код:

i=0 'Итератор
  b=0 'Кол-во добавленных (не удаленных) элементов в List
  LC=List.Count 'Количество проходов
  Do While i < LC
    Set SelItemObj = AllObjContent.Item(i)
        ObjItemAttr = SelItemObj.Attributes.Has("ATTR_NSI_SSILKA_NA_NSI_OBJECT")
    If  ObjItemAttr = False Then
        List.DeleteItem b
    Else
        b=b+1
    End If
        i=i+1
    Loop

Пришлось лепить костыли из всяких b и LC