Тема: Forma TCS
Я хотел узнать. Как обратиться к текущим данным из формы, разработанным редактором форм ТКС.
Думал через TCSActiveModule.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Forma TCS
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Я хотел узнать. Как обратиться к текущим данным из формы, разработанным редактором форм ТКС.
Думал через TCSActiveModule.
к текущей форме никак. Вы в любом случае формируете сами ее вызов (этой формы). Поэтому сами его передаете.
Мы обычно рекомендуем использовать для этого атрибут UserData у формы, пример в ролике http://technologics.ru/node/64 приведен.
В принципе можно и по другому конечно, но так от многих эффектов можно избавиться, поэтому рекомендуем использовать именно UserData.
Добрый день.
Чего я хотел бы добиться? Создать форму в модуле итоговой спецификации. Добавить поле ввода и три кнопки. 1,2 кнопки - перемещение по TCSActiveModule и при необходимости менять определенный параметр выбранной позиции.
Т.к. я напрямую не могу работать TCSActiveModule, то
я на форму бросаю axFоrm и работаю с набором данных через этот компонент?
Хорошо, что мне необходимо указать Form.UserData.IndexOf(???)
Помогите разобраться, в руководстве ничего толком не нашел.
Спасибо.
Т.к. я напрямую не могу работать 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.
Вот простенький пример формы ввода. Вызываем ее из итоговой спецификации, она отображает на форме поля.
Код макроса для вызова из итоговой
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
форма ввода прилагается в файле ниже (экпортируем ее просто)
Уважаемые знатоки, помогите, пожалуйста, разобраться.
В форме 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 '
Не сильно ясно конечно. Под работает имеется ввиду что данные меняются при смене записи?
То есть должны меняться данные EVS_Dok при смене EVS_Spec и Query? Если это пытались сделать, то вроде все правильно и должно работать. Только я бы ошибки обработал, может где-то из-за этого что-то не так происходит (хотя теоретически вы их должны увидеть тогда).
И сразу отмечу что в 7.1 можно использовать такие методы, что значительно упростит код:
AddTCSModule, TCSModuleByName,DeleteTCSModule.
Я хотела: когда щелкаю в окне 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)
вообще не выводится.
'
А на Query успешно реагирует?
Вроде все правильно, ошибок не вижу. Попробуйте еще общую процедуру, где-то в логике возможно ошибка.
Sub FormEvent_OnModuleEvent( Form, ObjName, Module, EventType, EventData ) Call TCSApp.ShowMessageBox( ObjName, ObjName ) End Sub
Когда щелкаю по данным первого окна, данные второго окна меняются, Query - реагирует
Поставила предложенную процедуру в макрос - сообщение не выводится:
Call TCSApp.ShowMessageBox( ObjName, ObjName )
Все пошло-поехало, когда вместо
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")
Ура!!!
На 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 выбранной ветки и с ним работать?
подскажите, пожалуйста
Tree.Selected.NodeId
На форме дерево архива отображается, и даже раскрывается,
а при выборе раздела (по щелчку) получить действия не получается
что нужно написать?
Sub FormEvent_AxDbForm_0_OnObjectClick( Form, ObjName )
или
Sub FormEvent_Tree_OnModuleEvent( Form, ObjName, Module, EventType, EventData )
, где ( Call Form.RegisterModuleEvent(Tree, "Tree") )
пока оба не получаются
А что вы хотите получить? События идут только от набора данных, у дерева (как набора) событий нет.
Если нужны собятия то надо использовать https://help.technologics.ru/7.1/TCSAPI … DbTree.htm - тогда на форме будут все его события, но и писать все дерево придется самому, хотя скопировать можно просто методом https://help.technologics.ru/7.1/TCSAPI … Tree_9.htm, но он Id не копирует насколько я помню.
Да вот хотела по щелчку на разделе архива
в правой части формы вывести количество документов в разделе и т.п.
Здравствуйте.
Задача - передать данные из модуля макроса в форму.
Всё, вроде, просто. Вот только в форме значения параметров не отображаются.
Подскажите, пожалуйста, где ошибка.
Макрос:
Sub FormMacro_Dob_Ots_Par(TCSActiveModule, Oboz, Naim)
Oboz = "111-111-111"
Naim = "Сборка"
Set F1 = TCSApp.TCSForm( "Proverka_parametrov", False )
F1.UserData.Values("Oboz")=Oboz
F1.UserData.Values("Naim")=Naim
F1.ShowModal
End Sub
Форма:
Public Oboz
Public Naim
Sub FormEvent_OnFormShow(Form)
Form.c_Label_1.Caption = Oboz
Form.c_Label_2.Caption = Naim
End Sub
Добрый день!
Наверное, надо вот так:
Sub FormEvent_OnFormShow(Form) Form.c_Label_1.Caption = Form.UserData.Values("Oboz") Form.c_Label_2.Caption = Form.UserData.Values("Naim") End Sub
Спасибо. Сделала так. Данные в форму передаются, но в лейблах всё равно пусто.
Если создать в форме кнопку и вставить эти строки в процедуру кнопки, то лейблы заполняются.
Только вот мне нужно получить заполненные поля при открытии формы.
Странно. У меня сразу текст в лейблах выводится.
Возможно, у вас где-то возникает ошибка.
Прикрепил файл импорта формы ввода.
EventType, EventData - что они означают и когда чему равны?
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
................
EventData не используется, а TMEventsTypes - в онлайн справке никак не найду -
etDLBeforeScroll = 0x00000000
etDLScrolled = 0x00000001
etDLAfterApply = 0x00000002
etDLAfterOpen = 0x00000003
etDLAfterClose = 0x00000004
etDLAfterDelete = 0x00000005
в CSDN_Const должны быть.
Это события от зарегистрированного модуля TechnologiCS. Или вы именно о них и спрашиваете?
у контролов есть свои события.
есть грид, там его события https://help.technologics.ru/7.1/TCSAPI … Events.htm
Ставлю :
Sub FormEvent_DbGrid_0_OnOnDblClick( Form, ObjName )
'Form As ITCSForm, ObjName As String
Data = TCSApp.InputBox(Query.Properties("Nomenclatures_NOTE").AsString, "Íîâîå çíà÷åíèå âìåñòî " + _
Query.Properties("TpParameters_PAR_VALUE").AsString + ":", "" )
If Data <> "" Then
.....................
и также :
Sub FormEvent_OnOnDblClick( Form, ObjName )
'Form As ITCSForm, ObjName As String
Data = TCSApp.InputBox(Query.Properties("Nomenclatures_NOTE").AsString, "Íîâîå çíà÷åíèå âìåñòî " + _
Query.Properties("TpParameters_PAR_VALUE").AsString + ":", "" )
If Data <> "" Then
...................
На DbGrid щелкаю двойной - не срабатывает
Чтобы отправить ответ, вы должны войти или зарегистрироваться
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Forma TCS