Справочное руководство по TDMS 7.0 API
FormTableAttributeChange Событие
Смотри также  Пример  Отправить замечание
pForm
Форма ввода, атрибуты которой редактируются.
pObject
Объект, которому принадлежит форма ввода. Если форма открыта методом ThisApplication.InputForms("FRM_ID").Show, значение аргумента pObject = Nothing.
pTableAttribute
Табличный атрибут
pTableRow
Ссылка на строку таблицы, в которой производилось редактирование.
ColumnAttributeDef
Дескриптор типа атрибута для столбца таблицы, в котором производилось редактирование. Ссылка на тип атрибута TDMSAttributeDef Объект может быть получена так:
Set AttrDef = ThisApplication.AttributeDefs.Item(hColumnAttributeDef).
pOldTableRow
Ссылка на строку таблицы с предыдущим состоянием (до редактирования)
bCancel
TRUE - отменить редактирование поля таблицы (вернуть предыдущее значение).
TDMSApplication Объект : FormTableAttributeChange Событие

Glossary Item Box

Описание

Генерируется после изменения значения любого поля табличного атрибута при переключении фокуса ввода на другой элемент.

Опеделение

Visual Basic
Public Event FormTableAttributeChange( _
   ByVal pForm As TDMSInputForm, _
   ByVal pObject As TDMSObject, _
   ByVal pTableAttribute As TDMSAttribute, _
   ByVal pTableRow As TDMSTableAttributeRow, _
   ByVal ColumnAttributeDef As Variant, _
   ByVal pOldTableRow As TDMSTableAttributeRow, _
   ByRef bCancel As Boolean _
)

Параметры

pForm
Форма ввода, атрибуты которой редактируются.
pObject
Объект, которому принадлежит форма ввода. Если форма открыта методом ThisApplication.InputForms("FRM_ID").Show, значение аргумента pObject = Nothing.
pTableAttribute
Табличный атрибут
pTableRow
Ссылка на строку таблицы, в которой производилось редактирование.
ColumnAttributeDef
Дескриптор типа атрибута для столбца таблицы, в котором производилось редактирование. Ссылка на тип атрибута TDMSAttributeDef Объект может быть получена так:
Set AttrDef = ThisApplication.AttributeDefs.Item(hColumnAttributeDef).
pOldTableRow
Ссылка на строку таблицы с предыдущим состоянием (до редактирования)
bCancel
TRUE - отменить редактирование поля таблицы (вернуть предыдущее значение).

Заметки

1. Событие является отменяемым: если параметру bCancel присвоено значение TRUE, любое изменение значения атрибута будет немедленно отменено при потере фокуса ввода элементом формы. Т.е. при переходе в другое поле старое значение измененного атрибута будет тут же восстановлено.

2. Событие наступает сразу после события TDMSApplication.FormAttributeChange Событие. Если событие TDMSApplication.FormAttributeChange Событие было отменено (bCancel=TRUE), то данное событие будет генерироваться, но после его обработки старое значение поля табличного атрибута будет восстановлено.

3. При редактировании полей таблицы данные на сервере обновляются немедленно. Важно: с учетом сказанного, при закрытии Окна свойств объекта без сохранения изменений табличные атрибуты к первоначальному состоянию не возвращаются (в отличие от всех остальных атрибутов, начальные значения которых будут восстановлены).

4. В процессе редактирования полей таблицы можно восстановить только предпоследнее значение поля. Это можно сделать отменой событий TDMSApplication.FormAttributeChange Событие или FormTableAttributeChange, а также через скрипт (старое значение отредактированного поля передается через параметр pOldAttribute обработчика события).

5. Обработчик может быть размещен в скриптах формы ввода, профиля и/или общесистемном. Если обработчики определены на всех уровнях, то последовательность их вызова такова:

  • скрипт формы ввода;
  • скрипт профиля пользователя;
  • общесистемный скрипт.

Если на каком-либо уровне событие было отменено (параметру bCancel присвоено значение TRUE), то обработчики события, размещенные на последующих уровнях, вызваны не будут.

6. Схему последовательности генерации событий при редактировании атрибутов объекта в окне свойств см. на рисунке:

7. Событие не генерируется при удалении строк таблицы, а также при редактировании значений ячеек через API.

Пример

VB Script (Visual Basic)Скопировать код
'======================================================================
'Текст обработчика может быть размещен в скрипте команды, профиля или
'общесистемном скрипте.
'======================================================================
'Аргументы процедуры-обработчика события:
'Form - ссылка на активную форму объекта. 
'Object - cсылка на объект, которому принадлежит табличный атрибут
'TableAttribute - ссылка на измененный табличный атрибут (tdmTable)
'Row - ссылка на измененную строку (содержит новое значение)
'ColumnAttrDefHandle - Handle типа атрибута, присвоенного измененному столбцу таблицы
'OldRow - ссылка на измененную строку (содержит старое значение)
'Cancel - параметр отмены.

Sub Form_TableAttributeChange(Form, Object, TableAttribute, Row, ColumnAttrDefHandle, OldRow, Cancel)
        
        Dim Rows, RCount, CCount, r, c, i, strIndex, strMsg, ColumnDescr, RetVal
        'Получить ссылку на коллекцию строк табличного атрибута
        Set Rows = TableAttribute.Rows
        RCount = Rows.Count 'количество строк в таблице
        CCount = Rows.AttributeDefs.Count 'количество столбцов в таблице
        
        'Найти, в какой ячейке было изменено значение (индексы строки и столбца)
        For i = 0 To RCount-1
                If Rows(i).Handle = Row.Handle Then
                        r = i
                        Exit For
                End If
        Next
        For i = 0 To CCount-1
                If Rows.AttributeDefs(i).Handle = ColumnAttrDefHandle Then
                        c = i
                        Exit For
                End If
        Next
        
        'Сформировать строку с индексом измененной ячейки.
        strIndex = CStr(r+1) & "," & CStr(c+1)
        'Получить описание столбца, в котором произведены изменения
        ColumnDescr = "" & Rows.AttributeDefs(ColumnAttrDefHandle).Description & ""
        
        'Получить старое (предыдущее) значение ячейки. Учтем, что строка могла быть добавлена
        'в пустую таблицу (вставлена первой) - в этом случае коллекция OldRow.Attributes не содержит ничего
        If (OldRow.Attributes.Count=0) Then 
                CellOldValue = ""
        Else
                CellOldValue = OldRow.Attributes(c).Value 
        End If
        If CellOldValue = ""  Then CellOldValue = "нет"
        
        'Получить новое значение ячейки.
        CellNewValue = Row.Attributes(c).Value
        If CellNewValue = ""  Then CellOldValue = "нет"
        
        'Выдать сообщение с полной информацией об изменениях, и запросить подверждение сохранения
        strInfo = "Изменено значение в ячейке (" & strIndex & ") табличного атрибута "& _
                TableAttribute.AttributeDef.Description & Chr(13) &_
                "(строка " & r+1 & ", столбец " & ColumnDescr & ")" & Chr(13) & Chr(13) &_
                "Старое значение:  " & CellOldValue & Chr(13) &_
                "Новое значение:  " & CellNewValue 
        RetVal = MsgBox(strInfo & Chr(13) & "Сохранить изменения?", vbQuestion+vbYesNo)
        
        'Если пользователь не захотел сохранять изменения - еще не поздно откатить
        If RetVal <> vbYes Then Cancel = TRUE
        
End Sub
'======================================================================

Смотри также

© 2023 CSoft Development. Все права защищены.