Тема: Отмена создания объекта

Есть объект "Организация", в нём некоторые характеристики представлены в виде атрибутов-ссылок на объекты (Адрес).
До создания объекта (BeforeCreate) эти атрибуты инициализируются (CreateObject), иначе их нельзя будет редактировать:

Sub Object_BeforeCreate(Obj, Parent, Cancel)
  if Obj.Attributes("ATTR_ADDRESS_POSTAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_POSTAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
  if Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
  if Obj.Attributes("ATTR_ADDRESS_LEGAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_LEGAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
End Sub

После удаления объекта (ObjectErased) эти атрибуты удаляются (Erase):

Sub Object_Erased(Obj)
  if not Obj.Attributes("ATTR_ADDRESS_POSTAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_POSTAL").Object.Erase
  if not Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object.Erase
  if not Obj.Attributes("ATTR_ADDRESS_LEGAL").Object is nothing then Obj.Attributes("ATTR_ADDRESS_LEGAL").Object.Erase
End Sub

Однако в случае, если при создании объекта была нажата "Отмена", объекты присвоенные атрибутам (Адреса) остаются в системе и болтаются там пока их не найдёшь и не удалишь, т.к. событие Form_BeforeClose не возникает в этом случае.
Как быть? Не использовать такую схему? Это "плохой дизайн"? Я чего-то не понимаю/знаю? ...

Re: Отмена создания объекта

Я конечно понимаю, что это похоже на извращение, но пока у меня решение такое:

Sub Object_BeforeCreate(Obj, Parent, Cancel)  '(C) A77X7
  if Obj.Attributes("ATTR_ADDRESS_POSTAL").Object is nothing then
    Obj.Attributes("ATTR_ADDRESS_POSTAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
    s = "if ThisApplication.GetObjectByGUID(""" & Obj.GUID & """) is nothing then" & vbCrLf & _
        "  ThisApplication.GetObjectByGUID(""" & Obj.Attributes("ATTR_ADDRESS_POSTAL").Object.GUID & """).Erase" & vbCrLf & _
        "end if" & vbCrLf
    ThisApplication.Dictionary("A77X7").Item("on_exit") = ThisApplication.Dictionary("A77X7").Item("on_exit") & vbCrLf & s
  end if
  if Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object is nothing then
    Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
    s = "if ThisApplication.GetObjectByGUID(""" & Obj.GUID & """) is nothing then" & vbCrLf & _
        "  ThisApplication.GetObjectByGUID(""" & Obj.Attributes("ATTR_ADDRESS_ACTUAL").Object.GUID & """).Erase" & vbCrLf & _
        "end if" & vbCrLf
    ThisApplication.Dictionary("A77X7").Item("on_exit") = ThisApplication.Dictionary("A77X7").Item("on_exit") & vbCrLf & s
  end if
  if Obj.Attributes("ATTR_ADDRESS_LEGAL").Object is nothing then
    Obj.Attributes("ATTR_ADDRESS_LEGAL").Object = ThisApplication.ObjectDefs("OBJECT_ADDRESS").CreateObject
    s = "if ThisApplication.GetObjectByGUID(""" & Obj.GUID & """) is nothing then" & vbCrLf & _
        "  ThisApplication.GetObjectByGUID(""" & Obj.Attributes("ATTR_ADDRESS_LEGAL").Object.GUID & """).Erase" & vbCrLf & _
        "end if" & vbCrLf
    ThisApplication.Dictionary("A77X7").Item("on_exit") = ThisApplication.Dictionary("A77X7").Item("on_exit") & vbCrLf & s
  end if
End Sub

и в SCRIPT_GLOBAL (сборка мусора):

Sub BeforeQuit(Cancel)
  on error resume next
  ThisApplication.ExecuteScript("on error resume next" & vbCrLf & ThisApplication.Dictionary("A77X7").Item("on_exit") & vbNewLine)
End Sub

Re: Отмена создания объекта

Да. При отмене создания объекта, событие ObjectErased не вызывается в TDMS4.
Можно решить данную ситуацию следующим образом:

Sub EraseLinkObjects(Obj)
    ' Удалить объекты ссылочных атрибутов
End Sub

Sub Object_BeforeCreate(Obj, Parent, Cancel)
    Obj.Dictionary("Creating") = true
End Sub

Sub Object_Created(Obj, Parent)
    Obj.Dictionary("Creating") = false
End Sub

Sub Object_Erased(Obj)
    EraseLinkObjects(Obj)
End Sub

Sub Object_PropertiesDlgBeforeClose(Obj, OkBtnPressed, Cancel)
    ' Если объект создается и нажата клавиша отмена
    if Obj.Dictionary("Creating") = true and OkBtnPressed=false then
         EraseLinkObjects(Obj)
    end if
End Sub

Re: Отмена создания объекта

Точно! Опять по невнимательности просмотрел (PropertiesDlgBeforeClose), хотя смотрел, именно список событий...
Спасибо.