1

Тема: Forma TCS

Я хотел узнать. Как обратиться к текущим данным из формы, разработанным редактором форм ТКС.
Думал через TCSActiveModule.

Re: Forma TCS

к текущей форме никак. Вы в любом случае формируете сами ее вызов (этой формы). Поэтому сами его передаете.
Мы обычно рекомендуем использовать для этого атрибут UserData у формы, пример в ролике technologics.ru/node/64 приведен.
В принципе можно и по другому конечно, но так от многих эффектов можно избавиться, поэтому рекомендуем использовать именно UserData.

3

Re: Forma TCS

Добрый день.
Чего я хотел бы добиться? Создать форму в модуле итоговой спецификации. Добавить поле ввода и три кнопки. 1,2 кнопки - перемещение по  TCSActiveModule и при необходимости менять определенный параметр выбранной позиции.

Т.к. я напрямую не могу работать TCSActiveModule, то
я на форму бросаю axFоrm и работаю с набором данных через этот компонент?

Хорошо, что мне необходимо указать Form.UserData.IndexOf(???)

Помогите разобраться, в руководстве ничего толком не нашел. 

Спасибо.

Re: Forma TCS

Т.к. я напрямую не могу работать TCSActiveModule, то
я на форму бросаю axFоrm и работаю с набором данных через этот компонент?

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

В коде для передачи и чтения стараемся использовать а-ля такой код (в коде формы).

Sub ShowNmkForm( Form, ClassId )
  'Form As ITCSForm
  'Nmk As IGModule                        
  Set Nmk = Nothing
  Idx = Form.UserData.IndexOf( "NMK" ) 
  If idx>=0 Then
    Set Nmk = Form.UserData.TagValues( idx )
  Else
    Idx = Form.UserData.Add( "NMK" )
  End If
  If Not Nmk Is Nothing Then
    Nmk.Hide
    Call Form.UnRegisterModuleEvent( "NMK" )
    TCSApp.DeleteModuleByUserModuleName( Nmk.UserModuleName )
  End If
  Form.UserData.TagValues( idx ) = Nothing 
  Set NMk = Nothing
   
  If ClassId<>-1 Then Set Nmk = TCSApp.Inventory.NomenclaturesBalance( ClassId )   
  If Not Nmk Is Nothing Then
    Nmk.UserModuleName = Nmk.UniqueUserModuleName
    Form.c_Ostatki.Visible = True
    Form.UserData.TagValues( idx ) = Nmk
    Call Nmk.Show( Form.c_Ostatki )
    Call Form.RegisterModuleEvent( Nmk, "NMK" )
  Else
    Form.c_Ostatki.Visible = False
  End If
End Sub
     
Function GetSafeNmkForm( Form )
 Set GetNmkForm = Nothing
 Idx = Form.UserData.IndexOf( "NMK" ) 
 If idx>=0 Then Set GetNmkForm = Form.UserData.TagValues( idx ) 
End Function
 
Function GetNmkForm( Form )
 Set GetNmkForm = Nothing
 Idx = Form.UserData.IndexOf( "NMK" ) 
 If idx>=0 Then Set GetNmkForm = Form.UserData.TagValues( idx ) 
 If GetNmkForm is Nothing Then Call TCSApp.ShowErrorMessage( "Отсутствует объект 'NMK'!" )
End Function

Здесь показывает на форме ввода остатки по номенклатуре. Остатки показываются прямо на форме ввода, подключаются обработчики событий.
Далее есть пара функций получить модуль остатки по номенклатуре.

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

Re: Forma TCS

Вот простенький пример формы ввода. Вызываем ее из итоговой спецификации, она отображает на форме поля.

Код макроса для вызова из итоговой

Sub FormMacro_test1(TCSActiveModule)
   Set F = TCSApp.TCSForm( "itog_spec", False )
   'Dim F As ITCSForm
   Call itog_spec.ShowMyForm( F, TCSActiveModule )
   Call itog_spec.UpdateData( F )
   F.Caption = "Example"
   F.ShowModal
End Sub

форма ввода прилагается в файле ниже (экпортируем ее просто)

Post's attachments

itog_spec.eiScript 1.49 Кб, 9 скачиваний с 2011-01-19 

You don't have the permssions to download the attachments of this post.

Re: Forma TCS

Уважаемые знатоки, помогите, пожалуйста, разобраться.
В форме 3 окна AxDbForm - в первом и втором окнах программа работает.
А третье окно - только при открытии формы и смене данных первого окна.
Хотелось бы, чтобы данные третьего окна менялись при выборе данных второго окна.
Что-то я делаю не так?

Public NodeId

Sub FormEvent_OnFormShow(Form)  'Form As ITCSForm
NodeID = Form.UserData.Values("NodeID")

Set Query = TCSApp.UserRecordSet("evs2", False, "ND_ID", NodeID )
Call Show_EVS_Query( Form, Query )

If Not Query.p_DocTypes_NOTE.IsNull Then
   Call Show_EVS_Spec( Form, Query.p_DocTypes_NOTE.AsString )
End If

End Sub

Sub Show_EVS_Query( Form, Query )
   Set M = Nothing
   idx = Form.UserData.IndexOf("Query")
   If idx >= 0 Then
      Set M = Form.UserData.TagValues(idx)
   Else
      idx = Form.UserData.Add(idx)
   End If
   
   If Not M is Nothing Then
      M.Hide
      Call Form.UnregisterModuleEvent("Query")
      TCSApp.DeleteModuleByUserModuleName( Query.UserModuleName )
   End If
   Form.UserData.TagValues(idx) = Nothing
   Set M = Nothing
   
   If Not Query is Nothing Then
      Form.c_AxDbForm_0.Visible = True
      Form.UserData.TagValues(idx) = Query
      Call Query.Show(Form.c_AxDbForm_0)
      Call Form.RegisterModuleEvent(Query, "Query")
   Else
      Form.c_AxDbForm_0.Visible = False   
   End If
End Sub

Function GetSafeQueryForm( Form )
   Set GetSafeQueryForm = Nothing
   idx = Form.UserData.IndexOf("Query")
   If idx >= 0 Then
      Set M = Form.UserData.TagValues(idx)
   End If
   Set M = Nothing
End Function
Function GetSafeDocsForm( Form )
   Set GetSafeDocsForm = Nothing
   idx = Form.UserData.IndexOf("Docs")
   If idx >= 0 Then
      Set M = Form.UserData.TagValues(idx)
   End If
   Set M = Nothing
End Function
Function GetQueryForm( Form )
   Set GetQueryForm = Nothing
   Idx = Form.UserData.IndexOf( "Query" ) 
   If idx >= 0 Then 
      Set GetQueryForm = Form.UserData.TagValues( idx )
   End If 
   If GetQueryForm is Nothing Then 
      Call TCSApp.ShowErrorMessage( "Отсутствует объект 'Запрос'!" )
   End If   
End Function
Function GetDocsForm( Form )
   Set GetDocsForm = Nothing
   Idx = Form.UserData.IndexOf( "Docs" ) 
   If idx >= 0 Then 
      Set GetDocsForm = Form.UserData.TagValues( idx )
   End If 
   If GetDocsForm is Nothing Then 
      Call TCSApp.ShowErrorMessage( "Отсутствует объект 'Документы'!" )
   End If   
End Function

Sub Show_EVS_Spec( Form, DocVID )
   NodeID = Form.UserData.Values("NodeID")
   Set Docs = Nothing
   idx = Form.UserData.IndexOf("Docs")
   If idx >= 0 Then
      Set Docs = Form.UserData.TagValues(idx)
   Else
      idx = Form.UserData.Add(idx)
   End If
   
   If Not Docs is Nothing Then
      Docs.Hide
      Call Form.UnregisterModuleEvent("Docs")
      TCSApp.DeleteModuleByUserModuleName( Docs.UserModuleName )
   End If
   Form.UserData.TagValues(idx) = Nothing
   Set Docs = Nothing

   If DocVID <> "" Then 
      Set Docs = TCSApp.UserRecordSet("evs0", False, Array("DOC_VID", "ND_ID"), Array(DocVID, NodeID) )
   End If
   If Not Docs is Nothing Then
      Docs.UserModuleName = Docs.UniqueUserModuleName
      Form.c_AxDbForm_1.Visible = True
      
      Form.UserData.TagValues(idx) = Docs
      Call Docs.Show(Form.c_AxDbForm_1)
      Call Form.RegisterModuleEvent(Docs, "Docs")
      
'      Call Show_EVS_Dok(Form, Docs.p_Documents_NOTE.AsString )
      Call Show_EVS_Dok(Form, Docs.p_DocumentVersions_ID.AsInteger )
   Else
      Form.c_AxDbForm_1.Visible = False
   End If
End Sub

'Sub Show_EVS_Dok(Form, DocNOTE)
Sub Show_EVS_Dok(Form, DocVerID)

'Call TCSApp.ShowMessageBox(DocVerID, DocVerID )
   Set P = Nothing
   Idx = Form.UserData.IndexOf ("P")
   If Idx >= 0 Then
      Set P = Form.UserData.TagValues(idx)
   Else
      Idx = Form.UserData.Add(idx)
   End If
  
   If Not P Is Nothing Then
      P.Hide
      TCSApp.DeleteModuleByUserModuleName(P.UserModuleName)
   End If
   Form.UserData.TagValues(idx) = Nothing
   Set P = Nothing
  
   If DocVerID <> 0 Then 
      Set Dokum = Nothing
      Set Dokum = TCSApp.SingleDoc( 1, DocVerID )
      Set P = Dokum.Properties("BoundNomenclature").AsIDispatch
      P.UserModuleName = P.UniqueUserModuleName
      Form.c_AxDbForm_2.Visible = True
      Form.UserData.TagValues(idx) = P
      Call P.Show(Form.c_AxDbForm_2)
   Else
      Form.c_AxDbForm_2.Visible = False
   End If
End Sub

Sub FormEvent_OnFormDestroy(Form)
'Form As ITCSForm      'Call Show_EVS_Dok( Form, Nothing)
Call Show_EVS_Spec( Form, "")
Call Show_EVS_Query( Form, Nothing )
End Sub
                                  
Sub FormEvent_Query_OnModuleEvent( Form, ObjName, Module, EventType, EventData )
'Form As ITCSForm, ObjName As String, Module As IPModule, EventType As TMEventsTypes, EventData As Variant

If EventType = 1 Or EventType = 3 Then
   Call Show_EVS_Spec( Form, Module.p_DocTypes_NOTE.AsString )
End If 
End Sub

Sub FormEvent_Docs_OnModuleEvent( Form, ObjName, Module, EventType, EventData )
'Form As ITCSForm, ObjName As String, Module As IPModule, EventType As TMEventsTypes, EventData As Variant

Call TCSApp.ShowMessageBox(Module.p_Documents_NOTE.AsString, Module.p_Documents_NOTE.AsString)

If EventType = 1 Or EventType = 3 Then
   Call Show_EVS_Dok( Form, Module.p_DocumentVersions_ID.AsInteger )
End If 
End Sub
'

Re: Forma TCS

Не сильно ясно конечно. Под работает имеется ввиду что данные меняются при смене записи?

То есть должны меняться данные EVS_Dok при смене EVS_Spec и Query? Если это пытались сделать, то вроде все правильно и должно работать. Только я бы ошибки обработал, может где-то из-за этого что-то не так происходит (хотя теоретически вы их должны увидеть тогда).

И сразу отмечу что в 7.1 можно использовать такие методы, что значительно упростит код:
AddTCSModule, TCSModuleByName,DeleteTCSModule.

Re: Forma TCS

Я хотела: когда щелкаю в окне EVS_Spec по строкам набора данных, данные в окне EVS_Dok должны меняться.
А они не меняются, похоже программа

Sub FormEvent_Docs_OnModuleEvent( Form, ObjName, Module, EventType, EventData )
'Form As ITCSForm, ObjName As String, Module As IPModule, EventType As TMEventsTypes, EventData As Variant

Call TCSApp.ShowMessageBox(Module.p_Documents_NOTE.AsString, Module.p_Documents_NOTE.AsString)

If EventType = 1 Or EventType = 3 Then
   Call Show_EVS_Dok( Form, Module.p_DocumentVersions_ID.AsInteger )
End If
End Sub

не работает, т.е. туда вообще не попадает, так как

Call TCSApp.ShowMessageBox(Module.p_Documents_NOTE.AsString, Module.p_Documents_NOTE.AsString)

вообще не выводится.
'

Re: Forma TCS

А на Query успешно реагирует?

Вроде все правильно, ошибок не вижу. Попробуйте еще общую процедуру, где-то в логике возможно ошибка.

Sub FormEvent_OnModuleEvent( Form, ObjName, Module, EventType, EventData )

Call TCSApp.ShowMessageBox( ObjName, ObjName )
End Sub

Re: Forma TCS

Когда щелкаю по данным первого окна, данные второго окна меняются, Query - реагирует
Поставила предложенную процедуру в макрос - сообщение не выводится:

Call TCSApp.ShowMessageBox( ObjName, ObjName )

Re: Forma TCS

Все пошло-поехало, когда вместо

idx = Form.UserData.Add(idx)

поставила в Sub Show_EVS_Spec( Form, DocVID )

idx = Form.UserData.Add("Docs")

и в Sub Show_EVS_Dok(Form, DocVerID)

idx = Form.UserData.Add("P")

Ура!!!

Re: Forma TCS

На AxDbForm вывожу дерево архива

Sub FormEvent_OnFormShow(Form)
                'Form As ITCSForm
   Set Tree = Nothing
   Set Tree = TCSApp.ArchiveTree(False)
   Form.c_AxDBForm_0.Visible = True
   Call Tree.Show(Form.c_AxDBForm_0)
   
End Sub

как мне получить ID выбранной ветки и с ним работать?
подскажите, пожалуйста

Re: Forma TCS

Tree.Selected.NodeId

help.technologics.ru/7.1/TCSAPIH … ted_13.htm

Re: Forma TCS

На форме дерево архива отображается, и даже раскрывается,
а при выборе раздела (по щелчку) получить действия не получается

что нужно написать?

Sub FormEvent_AxDbForm_0_OnObjectClick( Form, ObjName )

или

Sub FormEvent_Tree_OnModuleEvent( Form, ObjName, Module, EventType, EventData )
, где ( Call Form.RegisterModuleEvent(Tree, "Tree") )

пока оба не получаются

Re: Forma TCS

А что вы хотите получить? События идут только от набора данных, у дерева (как набора) событий нет.

Если нужны собятия то надо использовать help.technologics.ru/7.1/TCSAPIH … DbTree.htm - тогда на форме будут все его события, но и писать все дерево придется самому, хотя скопировать можно просто методом help.technologics.ru/7.1/TCSAPIH … Tree_9.htm, но он Id не копирует насколько я помню.

Спасибо сказали: Евсеева Людмила1

Re: Forma TCS

Да вот хотела по щелчку на разделе архива
в правой части формы вывести количество документов в разделе и т.п.