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 '====================================================================== |