Тема: Форма без объекта

Возможно ли нормальное функционирование формы без объекта (ThisObject)?
В таком случае не получается

'где-то
  set frm = ThisApplication.InputForms("FORM_OFFDOC_PERFORMER_SELECT")
  frm.Dictionary.Add "ThisObject", ThisObject
  frm.Show
'...
Sub Form_BeforeShow(Form, Obj)
  set dic = Form.Dictionary
  set obj = dic("ThisObject")
  set lst = Form.Controls("TDMSLIST1")
  lst.Enabled = true
  lst.ActiveX.InsertColumn 0, "Исполнитель", ThisForm.Controls("TDMSLIST1").Width
  for each r in obj.Attributes("ATTR_OFFDOC_SIGNER_LIST").Rows
    s = r.Attributes("ATTR_USER").User.Description
    lst.ActiveX.InsertItem 0, s
  next
End Sub

Все контролы на форме не доступны.

Re: Форма без объекта

A77x7 пишет:

Возможно ли нормальное функционирование формы без объекта (ThisObject)?
В таком случае не получается

'где-то
  set frm = ThisApplication.InputForms("FORM_OFFDOC_PERFORMER_SELECT")
  frm.Dictionary.Add "ThisObject", ThisObject
  frm.Show
'...
Sub Form_BeforeShow(Form, Obj)
  set dic = Form.Dictionary
  set obj = dic("ThisObject")
  set lst = Form.Controls("TDMSLIST1")
  lst.Enabled = true
  lst.ActiveX.InsertColumn 0, "Исполнитель", ThisForm.Controls("TDMSLIST1").Width
  for each r in obj.Attributes("ATTR_OFFDOC_SIGNER_LIST").Rows
    s = r.Attributes("ATTR_USER").User.Description
    lst.ActiveX.InsertItem 0, s
  next
End Sub

Все контролы на форме не доступны.

Я могу ошибаться, но сам по себе ThisObject имеет расширенные права только в своей локальной области обработки. Т.е. именно This, а не That
Поэтому надо использовать

set obj = dic("ThisObject")
obj.Permissions = SysAdminPermissions

Re: Форма без объекта

Не помогло.
Вообще контролы не привязаны к атрибутам или объектам...

Re: Форма без объекта

На отдельной форме ввода контролы не привязаны к атрибутам и объекту.
Там создаются пустые временные атрибуты.

Чтобы контролы были доступны для редактирования на форме без объекта, нужно снять на контролах крыжик
"Проверять права".

Re: Форма без объекта

m_skipper пишет:

Чтобы контролы были доступны для редактирования на форме без объекта, нужно снять на контролах крыжик
"Проверять права".

Спасибо, то, что нужно.

Re: Форма без объекта

m_skipper пишет:

Чтобы контролы были доступны для редактирования на форме без объекта, нужно снять на контролах крыжик
"Проверять права".

Если есть в обработчике ссылки на атрибуты, такое не прокатит... во всяком случае у меня не получилось...
Да и в справке к Show написана заметка

Заметки

Метод позволяет открыть диалог любой формы ввода (независимо от того, присвоена она типу объекта или нет). Если форма ввода привязана к объекту и ее скрипт содержит обработку значений каких-либо свойств объекта, открытие формы данным методом может вызвать ошибки выполнения (например, если скрипт формы содержит вызовы ThisObject, значение этой переменной будет неопределено).

Но мне надо переключиться на другую форму, а не открыть ее отдельным окном. Как это сделать?

Re: Форма без объекта

Shoorup пишет:

Если есть в обработчике ссылки на атрибуты, такое не прокатит... во всяком случае у меня не получилось...
Да и в справке к Show написана заметка
Но мне надо переключиться на другую форму, а не открыть ее отдельным окном. Как это сделать?

У диалогов объекта есть свойство ActiveForm

Sub Object_PropertiesDlgInit(Dialog, Obj, Forms)
      Dialog.ActiveForm = ThisApplication.InputForms("Всегда_открывать_на этой_форме")
End Sub

Re: Форма без объекта

McZag пишет:

У диалогов объекта есть свойство ActiveForm

Sub Object_PropertiesDlgInit(Dialog, Obj, Forms)
      Dialog.ActiveForm = ThisApplication.InputForms("Всегда_открывать_на этой_форме")
End Sub

И куда это лепить? :) Вообще мне надо чтоб тыкая на главной форме на ссылку происходило переключение на нужную "вкладку" - форму
Скрипт обработки события клика линка естественно в скрипте формы

Re: Форма без объекта

Shoorup пишет:

И куда это лепить? :) Вообще мне надо чтоб тыкая на главной форме на ссылку происходило переключение на нужную "вкладку" - форму
Скрипт обработки события клика линка естественно в скрипте формы

Скрипт обработки клика должен содержать команду перезагрузки диалога, тогда отработает событие Object_PropertiesDlgInit. Самый простой способ - вызвать команду TDMS по кнопке. Команда обновляет объект и перезагружает диалог.

1. Вешаете кнопку
2. Привязываете к кнопке команду
3. В команде примерно такой код:

Set myDict = ThisApplication.Dictionary("UpdateForm")

If Not myDict.Exists("buttonPressed") Then
  myDict.Add "buttonPressed", True
Else
  myDict.Item("buttonPressed") = True
End if

4. В объект добавляете обработчик диалога:

Sub Object_PropertiesDlgInit(Dialog, Obj, Forms)

Set myDict = ThisApplication.Dictionary("UpdateForm")

If Not myDict.Exists("buttonPressed") Then
  myDict.Add "buttonPressed", False
Else
  If myDict.Item("buttonPressed") = True Then
    Dialog.ActiveForm = ThisApplication.InputForms("Форма_на_которую_надо прыгнуть")
  End If
  myDict.Item("buttonPressed") = False
End if

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

Re: Форма без объекта

Не сработало. Вернее наполовину сработало. Единственное я делал не через команду и кнопку. У меня есть текст с URL по клику ловлю событие.
Вобщем в Dialog.ActiveForm записывается какую форму открыть, но открывается она при следующем выборе объекта. Т.е. жмем линк, Dialog.ActiveForm записался, переключаюсь на другой объект, возвращаюсь назад и форма уже другая. Получается как бы обновления небыло... и я обновление делаю руками

Re: Форма без объекта

Shoorup пишет:

Не сработало. Вернее наполовину сработало. Единственное я делал не через команду и кнопку. У меня есть текст с URL по клику ловлю событие.
Вобщем в Dialog.ActiveForm записывается какую форму открыть, но открывается она при следующем выборе объекта. Т.е. жмем линк, Dialog.ActiveForm записался, переключаюсь на другой объект, возвращаюсь назад и форма уже другая. Получается как бы обновления небыло... и я обновление делаю руками

Я вам написал, как точно сработает. Чтобы событие вызвалось, должно пройти обновление объекта. Иначе диалог не перезачитывается. Методов, явно меняющих активную форму на диалоге или обновляющих диалог, в TDMS 4.0 нет.

(изменено: Shoorup, 18 ноября 2014г. 09:07:29)

Re: Форма без объекта

Всеравно не сработало.
Сделал кнопку на форме
Сделал команду
Привязал запуск команды к кнопке (запускается)
обновление объекта не происходит.

Методов, явно меняющих активную форму на диалоге или обновляющих диалог, в TDMS 4.0 нет.

С этого и надо было начинать...
Есть конечно еще смешной способ переключиться между объектами типа:

ThisApplication.Shell.LocateInTree(ThisObject.Parent)
ThisApplication.Shell.LocateInTree(ThisObject)

  :lol:
Вместо первой строки можно переключаться на чтонить левое, что быстро отобразится и затем переключиться (обновить) назад.
А вообще API-аналог команды "Обновить" хорошо бы сделать... Хотябы для того чтобы не выдумывать вот такие действия.

Re: Форма без объекта

Shoorup пишет:

Всеравно не сработало.
Сделал кнопку на форме
Сделал команду
Привязал запуск команды к кнопке (запускается)
обновление объекта не происходит.

Мне сложно сказать, почему у вас не работает. Этой фиче TDMS столько же лет, сколько и TDMS. Перед запуском команды, TDMS сериализует объект в базу, так как команда - это отдельный поток, он должен знать обо всех изменениях, которые сделал пользователь на форме ввода. После запуска команды объект перезачитывается, так как команда в своем потоке могла изменить некоторые свойства объекта, форма должна об этом узнать.

Я вчера поигрался с вашей задачей. Простого переключения добиться не удалось. Но зато я "победил" модальность окон TDMS:
Форма без объекта
Окна нормально переключаются, но работать в таком режиме с одним объектом понятное дело нельзя - сохранятся данные только последнего диалога.

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

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

(изменено: Shoorup, 18 ноября 2014г. 10:20:30)

Re: Форма без объекта

McZag пишет:

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

Ура!  :rolleyes:
Не сказать, что мне крайне нужно эта функция... но было бы неплохо переключаться на нужную вкладку и обратно по кнопке или "ссылке".
У меня просто реализовано так: Если у объекта есть ссылки (на другие объекты), то на отдельной специальственной форме есть ссылки в виде lable (их может быть до 60 (в планах 90)). На главной форме сообщается в Lable что есть ссылки (так бы пришлось каждый раз тыкать на вкладку проверять есть или нет). Ну и соответственно если ссылки есть то lable становится кликабельным и по нему можно переключиться на вкладку ссылок. (из вкладки (формы) ссылок конечно же хотелось бы назад переключаться). Всё это исключительно для usability юзверей...

P.S. А команду надо добавлять в объект? (в перечень команд объекта я имею ввиду)

Re: Форма без объекта

Shoorup пишет:

P.S. А команду надо добавлять в объект? (в перечень команд объекта я имею ввиду)

Нет, это самая обычная команда. В обработчике клика на контроле указывается SysId команды.
Обработчик инициализации диалога на объекте.

(изменено: McZag, 18 ноября 2014г. 11:09:55)

Re: Форма без объекта

Shoorup пишет:

Ура!  :rolleyes:
Не сказать, что мне крайне нужно эта функция... но было бы неплохо переключаться на нужную вкладку и обратно по кнопке или "ссылке".

Пока что кроме явного метода видится специальный такой вид кнопки в виде ссылки  ;) Дело в том, что для того чтобы корректно перезачитать диалог, его нужно каким-то образом получить. В TDMS сейчас этого сделать нельзя. Это, кстати, даже больший недостаток, чем отсутствие прямого метода Form.Activate.
Выглядеть уже сейчас кнопка может так:
Форма без объекта

Вполне себе гиперссылка. Осталось только сделать так, чтобы она оставалась Flat, даже после наведения на нее курсора