Тема: Отслеживание редактирования строк таблицы (через API)
Дано:
Форма ввода, расположенные на ней: Таблица, Кнопка1, Кнопка2.
Св-ва Tаблицы - ReadOnly
Кнопка1 добавляет какие-либо значения в таблицу, Кнопка2 - удаляет. В обоих случаях используюся стандартные диалоги TDMS.
При нажатии на кнопку "Отмена" на форме ввода, в таблице возвращаются прежние значения.
Код Формы ввода:
Sub OnClick_BUTTON1() ' инициализируем диалог Set SelDlg = ThisApplication.Dialogs.SelectObjectDlg If SelDlg.Show = False Then Exit Sub Set Objects = SelDlg.Objects If Objects.Count <> 0 Then ' Пишем в словарь флаг, что меняем таблицу Call WriteToDictionary() ' добавляем в таблицу строки For Each Obj in Objects Obj.Permissions = SysAdminPermissions Set Row = ThisObject.Attributes("TABLE").Rows.Create Row.Attributes("TABLE_ATTRIBUTE").Value = Obj.Description Next End If End Sub Sub OnClick_BUTTON2() ' инициализируем диалог выбора строк, которые надо удалить Count = ThisObject.Attributes("TABLE").Rows.Count ReDim Preserve Stroki(Count) For i = 0 to Count - 1 Stroki(i) = ThisObject.Attributes("TABLE").Rows(i).Attributes("TABLE_ATTRIBUTE") Next Set SelDlg = ThisApplication.Dialogs.SelectDlg SelDlg.Caption = "Выберите строки, которые требуется исключить" SelDlg.SelectFrom = Stroki If SelDlg.Show = False Then Exit Sub ' Пишем в словарь флаг, что меняем таблицу Call WriteToDictionary() Stroki = SelDlg.Objects ' удаляем строки For Each Stroka in Stroki For Each Row in ThisObject.Attributes("TABLE").Rows If Row.Attributes("TABLE_ATTRIBUTE") = Stroka Then Row.Erase Exit For End If Next Next End Sub 'Пишем в словарь флаг, что таблица изменилась Sub WriteToDictionary() If ThisApplication.Dictionary.Exists("TableChanged") = False Then ThisApplication.Dictionary.Add "TableChanged", True Else ThisApplication.Dictionary.Item("TableChanged") = True End If End Sub ' при показе формы ввода, записываем в словарь таблицу Sub Form_BeforeShow(Form, Obj) Form.Controls("TABLE").ReadOnly = True If ThisApplication.Dictionary.Exists("Table") = False Then ThisApplication.Dictionary.Add "Table", ThisObject.Attributes("TABLE").Rows Else Set ThisApplication.Dictionary.Item("Table") = ThisObject.Attributes("TABLE").Rows End If End Sub
Код типа объекта:
Sub Object_PropertiesDlgBeforeClose(Obj, OkBtnPressed, Cancel) ' Если нажата кнопка "Отмена", то If OkBtnPressed = False Then ' проверяем, изменялась ли таблица, если да, то возвращаем значения из словаря, если нет, то просто чистим словарь. If ThisApplication.Dictionary.Exists("TableChanged") = True Then If ThisApplication.Dictionary.Item("TableChanged") = True Then Call ReturnTableValues() End If ThisApplication.Dictionary.Item("TableChanged") = False End If If ThisApplication.Dictionary.Exists("Table") = True Then ThisApplication.Dictionary.Remove "Table" End If Exit Sub End If End Sub Sub ReturnTableValues() Set OldTable = ThisApplication.Dictionary.Item("Table") For Each Row In ThisObject.Attributes("TABLE").Rows Row.Erase Next For Each Row In OldTable Set UndoRow = ThisObject.Attributes("TABLE").Rows.Create For Each Attr In Row.Attributes ' учтите, что если испольуете ссылки на объекты, то надо писать проверку на тип объекта (вместо .Value писать .Object). UndoRow.Attributes(Attr.AttributeDefName).Value = Attr.Value Next Next End Sub
PS каменты приветствуются.