(изменено: Anatoly, 11 ноября 2008г. 13:27:45)

Тема: Отслеживание редактирования строк таблицы (через 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 каменты приветствуются.