Тема: Работа с составом объекта

Возник такой вопрос... Как правильно добавлять один объект в состав другого (в скрипте).... Какие методы надо при этом использовать?
Я например делаю таким образом:

Dim NewPerm
Set NewPerm = ThisApplication.ObjectDefs("OBJ_PERM_ADDRRSV").CreateObject
...
ThisObject.Content.Add NewPerm

И второй вопрос  - как узнать какой у объекта родительский объект (получить его)? (в скрипте) Свойство Parent не получается использовать =(. Заранее спасибо...

(изменено: Edhunter, 17 октября 2007г. 16:44:10)

Re: Работа с составом объекта

1. Обращение через Content:

ThisObject.Content.Add NewObj

Тоже самое можно сделать при помощи коллекции Objects самого объекта

ThisObject.Objects.Add NewObj

2. Свойство Parent

MsgBox ThisObject.Parent.Description

Работает нормально.
Свойство Parent не всегда есть у объекта. Т.е. если к примеру объект создан скриптом в воздухе

Set NewObj = ThisApplication.ObjectDefs("").CreateObject

А потом добавлен в состав какого то объекта, то свойство Parent инициализировано не будет.

Re: Работа с составом объекта

Edhunter пишет:

2. Свойство Parent

MsgBox ThisObject.Parent.Description

Работает нормально.
Свойство Parent не всегда есть у объекта. Т.е. если к примеру объект создан скриптом в воздухе

Set NewObj = ThisApplication.ObjectDefs("").CreateObject

А потом добавлен в состав какого то объекта, то свойство Parent инициализировано не будет.

А как это свойство правильно инициализировать?

Re: Работа с составом объекта

При создании объекта в составе другого объекта, свойство инициализируется автоматически

Set NewObj = ThisObject.Objects.Create("ObjectDefName")
MsgBox NewObj.Parent.Description

Re: Работа с составом объекта

Edhunter пишет:

При создании объекта в составе другого объекта, свойство инициализируется автоматически

Set NewObj = ThisObject.Objects.Create("ObjectDefName")
MsgBox NewObj.Parent.Description

Если мы сделаем так как Вы сказали, создадим объект в составе, откроем форму для редактирования, но пользователь на форме нажмет кнопку отмена (откажется от редактирования), созданный нами объект удалится автоматически или его надо будет удалять вручную?

Re: Работа с составом объекта

Вручную. Если хотите что бы автоматически удалялся по отмене, пользуйтесь диалогом CreateObjectDlg

(изменено: Anatoly, 17 октября 2007г. 14:02:50)

Re: Работа с составом объекта

****Changed 17/10/2007
Cв-во Parent будет заполняться автоматом, если Вы создаёте объект в составе другого.
----------------------------------------------------------------------------------------------------

Set NewPerm = ThisApplication.ObjectDefs("OBJ_PERM_ADDRRSV").CreateObject
...
ThisObject.Content.Add NewPerm

В первой строке кода Вы создали объект без указания родитля.
Во второй строке добавили его в состав ThisObject-а.
Чтобы заполнить атрибут Parent Вам надо 3-ю строку:

NewPerm.Parent = ThisObject

Данные 3-и строки можно заменить 1-ну:

ThisObject.Objects.Create "OBJ_PERM_ADDRRSV"

НО! При этом у Вас не откроется карточка объект

Чтобы открыть карточку объекта Вам надо либо:
1. использовать CreateObjectDlg
2. использовать EditObjectDlg

Во 2-м случае надо делать проверку "если пользователь нажал "Отмена"", в 1-м не надо.

Re: Работа с составом объекта

Спасибо за ответы! Вот возник еще один вопрос:
Есть команда, вызываемая на объекте типа "заявка", при ее вызове отображается форма (карточка) этого объекта, на этой форме есть кнопка, при нажатии которой по событию on_click выполняется ряд действий по результатам которых создается новый дочерний типа "акт", при этом так же отображается его карточка, по окончанию заполнения которой объект типа заявка должен менять свой статус. Что бы это сделать я использую ThisObject, подразумевая что это и будет та заявка, на которой я выполнил команду в самом начале... Однако статус этой заявки не менятся... Возникает вопрос... Изменился ли ThisObject на другой или это все тот же объект? Все проверки показывают, что объект не поменялся, однако он не хочет менять свой статус... В чем тут прооблема?

            Dim NewAct
            Set NewAct = ThisObject.Objects.Create("OBJ_ACT_ADDRRSV")
            NewAct.Permissions = SysAdminPermissions
            Dim FormDlg    
            Set FormDlg = ThisApplication.Dialogs.EditObjectDlg
            FormDlg.Object = NewAct
            FormDlg.ActiveForm = "FORM_ACT_NEW"
            If FormDlg.Show Then    
                MsgBox ThisObject.Description ' Проверка показывает, что заявка та на которой была вызвана команда
                MsgBox ThisObject.Status.Description ' первоначальный статус
                Req.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")
                MsgBox ThisObject.Status.Description 'Отображается измененный статус, однако видно, что в системе он НЕ меняется
            Else
                NewAct.Erase
            End If

(изменено: Mishaf, 16 октября 2007г. 20:39:27)

Re: Работа с составом объекта

Driver пишет:
Req.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")
MsgBox ThisObject.Status.Description 'Отображается измененный статус, однако видно, что в системе он НЕ меняется

А где присвоение объектной переменной Req?
У вас ошибка на этой строчке не выдается?

Если даже она где-то присвоена, то статус вы меняете у Req, а отображаете статус ThisObject.
вместо

Req.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")

напишите

ThisObject.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")

PS: На будущее. Новый вопрос = новая тема!

Re: Работа с составом объекта

Кстати, а нафига вызывать командой карточку "этого объекта", на котором есть кнопка, чтобы ее нажать?
А не проще стандартными средствами открыть диалог свойств объекта и из него на нужной форме нажать кнопку.

Более того если в команде напишите Form.Show - она не будет иметь никакого отношения к информационному объекту.

Re: Работа с составом объекта

Очень извиняюсь я неправильный код скопировал... Однако даже после исправления все равно не работает =( Сообщения показывают, что статус изменен, но на самом деле статус не меняется =(

            Dim NewAct
            Set NewAct = ThisObject.Objects.Create("OBJ_ACT_ADDRRSV")
            NewAct.Permissions = SysAdminPermissions
            Dim FormDlg    
            Set FormDlg = ThisApplication.Dialogs.EditObjectDlg
            FormDlg.Object = NewAct
            FormDlg.ActiveForm = "FORM_ACT_NEW"
            If FormDlg.Show Then    
                MsgBox ThisObject.Description ' Проверка показывает, что заявка та на которой была вызвана команда
                MsgBox ThisObject.Status.Description ' первоначальный статус
                ThisObject.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")
                MsgBox ThisObject.Status.Description 'Отображается измененный статус, однако видно, что в системе он НЕ меняется
            Else
                NewAct.Erase
            End If

Кстати, а нафига вызывать командой карточку "этого объекта", на котором есть кнопка, чтобы ее нажать?
А не проще стандартными средствами открыть диалог свойств объекта и из него на нужной форме нажать кнопку.

Более того если в команде напишите Form.Show - она не будет иметь никакого отношения к информационному объекту.

Почему не будет? Я же явно указываю к какому объекту привязана форма....

Re: Работа с составом объекта

Driver пишет:
MsgBox ThisObject.Status.Description 'Отображается измененный статус, однако видно, что в системе он НЕ меняется

1. как Вы определили, что он не меняется?
2. Где раположена данная команда?
3. какая версия ТДМС?

Попробуйте след. строкой написать "ThisObject.Update"

Почему не будет? Я же явно указываю к какому объекту привязана форма....

Михаил имел в виду если открыть форму без привязки (не через диалог).

Re: Работа с составом объекта

Anatoly пишет:

1. как Вы определили, что он не меняется?

В системе отображается старый статус

2. Где раположена данная команда?

Команда расположена в контектсном меню объекта, но она не меняет статус, она открывает карточку объекта, где находится кнопка, по нажатию которой и выполнятеся попытка поменять статус.

3. какая версия ТДМС?

3.0.111

Я пробовал добавить "ThisObject.Update" - это помогло, однако теперь название объекта формируется неправильно - должно быть "ЗРА - {ATTR_REQ_NUMBER}". Однако  "{ATTR_REQ_NUMBER}" не отображается (получается "ЗРА - "), хотя значение атрибута не пустое!!!! В чем тут дело?

Re: Работа с составом объекта

по посленему постингу не ясно, почему у Вас не обновляется.

4. вы открываете именно карточку или карточку с объектом?
5. каким образом вы открываете карточку
6. срабатывает ли object_beforemodify на первом объекте (на котором расположена кнопка)?
7. каким образом Вы формируете название объекта?
8. одинакового ли типа объект на котором расположена кнопка и открываемый по кнопке объект?

Re: Работа с составом объекта

Driver пишет:

Команда расположена в контектсном меню объекта, но она не меняет статус, она открывает карточку объекта, где находится кнопка, по нажатию которой и выполнятеся попытка поменять статус.

Команду "в студию"!  :)

Re: Работа с составом объекта

Код команды, которая открывает форму редактирования объекта типа "заявка"

  Dim FormDlg
  Set FormDlg = ThisApplication.Dialogs.EditObjectDlg
  FormDlg.Object = ThisObject
  FormDlg.ActiveForm = "FORM_REQ_PROPERTIES"
  ThisObject.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVING") 'Заявка резервируется
  FormDlg.Show

Обработчик нажатия кнопки, находящейся на открывшейся форме редактирования объекта типа заявка. По нажатию кнопки создается новый объект типа "акт" в составе заявки и открывается форма для его редактирования, если пользователь нажал "ок" на этой форме, то объект типа "заявка" меняет статус. В противном случае, если пользователь нажал "отмена", то статус НЕ меняется.

Sub OnClick_CreateAct()
    Dim WshShell
    Dim sReturn
    
    set WshShell = CreateObject("WScript.Shell")
    sReturn = WshShell.Run("c:\TEMP\ExtCodeApp\GIS_RESERVE.exe " & "", 1, TRUE)
    
    if sReturn = 0 then
            Dim NewAct
            Set NewAct = ThisObject.Objects.Create("OBJ_ACT_ADDRRSV")
            NewAct.Permissions = SysAdminPermissions
            Dim FormDlg    
            Set FormDlg = ThisApplication.Dialogs.EditObjectDlg
            FormDlg.Object = NewAct
            FormDlg.ActiveForm = "FORM_ACT_NEW"
            If FormDlg.Show Then    
                ThisObject.Status = ThisObject.ObjectDef.Statuses ("STATUS_REQ_RESERVED")
                ThisObject.Update
            Else
                 NewAct.Erase
            End If
    else
        MsgBox "Отказано в резервировании!"
    End If
End Sub

(изменено: Anatoly, 18 октября 2007г. 13:28:24)

Re: Работа с составом объекта

не понял......
А для чего нужен первый код? Чтобы открыть карточку объекта? - так её и так можно открыть просто двойным клиеом мыши.

7. каким образом Вы формируете название объекта?

!!! - ответьте пожалуйста.

Re: Работа с составом объекта

1)

не понял......
А для чего нужен первый код? Чтобы открыть карточку объекта? - так её и так можно открыть просто двойным клиеом мыши.

Потому как мне нужно открывать только определенную форму

2) Название объекта формируется в свойстве "формат описания" типа объекта заявка как "ЗРА - {ATTR_REQ_NUMBER}", где ATTR_REQ_NUMBER - целочисленный атрибут.