Тема: Заполнение раскрывающегося списка

Первый опыт работы с формой в TCS 6.2.
Пытаюсь заполнить раскрывающийся список (как в VB)

Sub FormEvent_OnFormCreate(FormRegistr)
'Form As ITCSForm    
 Set ComboBox_0 = FormRegistr.Controls("ComboBox_0")  
...
Set Spr_Atr = TCSapp.DocParams
If Not Spr_Atr Is Nothing Then
  If Spr_Atr.Locate("Guid", GUID_Atr, 0) Then
    Set Atr_List = Spr_Atr.Properties("VALUELIST").AsIDispatch
    If Not Atr_List Is Nothing Then
        Atr_List.First
        s = 0             
        Do While Not Atr_List.EOF
            With ComboBox_0
                .AddItem (Atr_List.Properties("VALUE").DisplayText)  
            End With
            s = s + 1 
            Atr_List.Next
        Loop
    End If
    Set Atr_List = Nothing
  End If
End If
Set Spr_Atr = Nothing
...

Появляется сообщение "Объект не поддерживает этот метод или свойство" на  ".AddItem...".
Такая же ошибка была на    ".RemoveItem (0)" в коде

            With ComboBox_0
                If s = 0 Then
                    ComboBox_0.RemoveItem (0)   'Удаление единственного пустого элемента
                    ComboBox_0.Refresh
                End If
                .AddItem (Atr_List.Properties("VALUE").DisplayText)  
            End With

Подскажите, пожалуйста, как заполнить Items в VBScript?

(изменено: Дмитрий Гамий, 15 февраля 2013 18:31:32)

Re: Заполнение раскрывающегося списка

Лучше всего брать аналогию по работе с контролами не из VB, а из Delphi.
Вся работа со списком  идёт через объект Items
Вот пример загрузки списка в комбобокс из справочника "Единицы измерения":

    Dim Index ' As Integer
    Dim S ' As String Служебная строковая переменная
    Dim Id  ' AS Integer
        
    AForm.Controls(c_cbxMesureUnit).Items.Clear      
    
    With TCSApp.Mesuriments
        .Refresh
        .First     
        
        Do While Not .Eof
            Id = .Properties("ID").AsInteger
            S = .Properties("NOTE").DisplayText
            
            Index = AForm.Controls(c_cbxMesureUnit).Items.Add(S)       
            AForm.Controls(c_cbxMesureUnit).Items.TagValues(Index) = Id
        
            .Next
        Loop 
       
    End With ' With TCSApp.Mesuriments    
Спасибо сказали: snake1

(изменено: snake, 15 февраля 2013 20:37:07)

Re: Заполнение раскрывающегося списка

Спасибо! Список успешно заполнился.

2. Работая с модулем типа "Форма ввода" столкнулась с проблемой использования объекта  'TCSActiveModule'.
При обращении к его свойству появляется сообщение
"Требуется объект: 'TCSActiveModule'".
Значит ли это, что с 'TCSActiveModule' в модуле "Форма ввода" не работаем?

3. Где посмотреть какие методы (синтаксис) у формы, а то, чтобы вернуться в вызывающий форму модуль, не могу закрыть или скрыть форму. :(

Re: Заполнение раскрывающегося списка

1. У выпадающего списка Items - ICSDNStrings (в автодополнении должно быть видно).
2. TCSActiveModule передается при вызове макроса (модуль который вызвал макрос). Соответственно далее вы с ним уже сами работаете.
3. Форма - интерфейс ITCSForm. Задачу честно говоря не понял, вы же сами форму создаете.

Спасибо сказали: snake1

Re: Заполнение раскрывающегося списка

snake пишет:

Спасибо! Список успешно заполнился.

Пожалуйста!

snake пишет:

2. Работая с модулем типа "Форма ввода" столкнулась с проблемой использования объекта  'TCSActiveModule'.

У формы ввода есть свойство UserData, которое предназначено для хранения пользовательских данных. Как раз с помощью него можно и хранить в форме "ссылку" на TCSActiveModule.

Например, вот так:

Const FormName = "DEMO_Form"
Const ActiveModuleTagName = "ActiveModuleTag" 


Sub ShowForm(TCSActiveModule)
            
    Dim F ' As ITCSForm Форма ввода
    Dim Idx ' As Integer Индекс строки
    
    ' Создаём форму ввода
    Set F = TCSApp.TCSForm(FormName, False)        
    
    ' Добавляем строку с меткой (тэгом)
    Idx = F.UserData.IndexOf(ActiveModuleTagName)    
    If Idx < 0 Then   
        Idx = F.UserData.Add(ActiveModuleTagName)
    End If       
   
    ' Записываем объект (TCSActiveModule) в UserData
    F.UserData.TagValues(Idx) = TCSActiveModule              
    
    ' Выводим форму ввода на экран
    Call F.ShowModal 
    
End Sub

А получать TCSActiveModule можно так:

' Пример для демонстрации работы с UserData
Sub WorkWithTCSActiveModule(Form)           
    ' Form As ITCSForm Форма ввода
    Dim Idx ' As Integer Индекс строки                                        
    Dim AM ' AS IGModule Объект для получения TCSActiveModule    
    
    Idx = Form.UserData.IndexOf(ActiveModuleTagName)
    If Idx >= 0 Then 
        Set AM = Form.UserData.TagValues(Idx)        
    Else
        Call TCSApp.ShowErrorMessage("В UserData не найдена строка с имененм '" & ActiveModuleTagName & "'!")
        Exit Suи
    End If 
        
    ' Далее можно работать с полученным объектом
    
    ' . . . 
    
End Sub
Спасибо сказали: snake1

Re: Заполнение раскрывающегося списка

Ок! Советы и примеры пригодились. Большое спасибо!

(изменено: snake, 18 февраля 2013 18:24:40)

Re: Заполнение раскрывающегося списка

Задачу решила, в то же время хочется Вас лучше понять и дать обратную связь.

1)

Олег Зырянов пишет:

(в автодополнении должно быть видно)

- не поняла, где конкретно и что видно

2) В скрипте, который вызывает форму, с TCSActiveModule проблем не было.
А вот, чтобы передать параметры в модуль формы  для использования в процедурах событий и/или вернуть обратно в скрипт, помогла помощь Дмитрия.  Свойство .UserData вполне устраивает. Мне подумалось, Олег, что ещё другой способ есть?

3) Синтаксис свойств и методов ITCSForm благополучно нашла в справке CSDN по вашей ссылке. (В частности там увидела, что .close надо с параметром применять. :)). У меня не было такого Help, было только руководство пользователя 6.2.

Re: Заполнение раскрывающегося списка

1)

snake пишет:

- не поняла, где конкретно и что видно

Смотрите справку по TechnologiCS, раздел 16.3.2.7 Автодополнение кода   (или онлайн-справку)

2) Есть другой способ получения TCSActiveModule - непосредственно от TCSApp, у TCSApp (интерфейс IOcs_Application2) есть функция ActiveModule

3)

snake пишет:

У меня не было такого Help, было только руководство пользователя 6.2.

В папке, где установлен TechnologiCS 6.2 должен быть файл TCSAPIHelp.chm, а в меню "Справка" теперь есть пункт "Справка по TechnologiCS API"

Спасибо сказали: snake1

(изменено: snake, 18 февраля 2013 19:36:34)

Re: Заполнение раскрывающегося списка

Ответы стали для меня на много полнее! Спасибо!

Ещё о передаче данных между модулем и модулем формы. Проясняю маленький нюанс на счет использования константы в примере.

Дмитрий Гамий пишет:

А получать TCSActiveModule можно так:

' Пример для демонстрации работы с UserData
Sub WorkWithTCSActiveModule(Form)           
    ' Form As ITCSForm Форма ввода
    Dim Idx ' As Integer Индекс строки                                        
    Dim AM ' AS IGModule Объект для получения TCSActiveModule    
    Idx = Form.UserData.IndexOf([b]ActiveModuleTagName[/b])
    ' . . . 

В данном примере ваша Sub WorkWithTCSActiveModule находится не в модуле формы, ведь так?
Тогда могу согласиться с использованием константы  ActiveModuleTagName (определенной в модуле, вызывающем форму F.ShowModal) в качестве параметра.
Иначе эту константу саму пришлось бы передавать в модуль формы с помощью .UserData.
Мне в модуле формы (в процедуре события) пришлось  явно прописывать

Idx = Form.UserData.IndexOf("ActiveModuleTag") 

.

Re: Заполнение раскрывающегося списка

snake пишет:

В данном примере ваша Sub WorkWithTCSActiveModule находится не в модуле формы, ведь так?

Нет, как раз  Sub WorkWithTCSActiveModule  должна находиться в модуле формы.
Если необходимо использовать такую процедуру вне модуля формы, константу можно передавать, указывая имя модуля.

Пусть DEMO_Form - это имя модуля, в котором содержится форма. Константа ActiveModuleTagName объявлена в нём. Обращении к ней в процедуре из другого модуля будет выглядеть так:

' Пример для демонстрации работы с UserData
Sub WorkWithTCSActiveModule(Form)           
    ' Form As ITCSForm Форма ввода
    Dim Idx ' As Integer Индекс строки                                        
    Dim AM ' AS IGModule Объект для получения TCSActiveModule    
     
    Idx = Form.UserData.IndexOf(DEMO_Form.ActiveModuleTagName)
   
    ' . . . 
     
End Sub
Спасибо сказали: Олег Зырянов1

Re: Заполнение раскрывающегося списка

В демо базе посмотрите пример работы форма ввода Расширенный поиск номенклатуры и ролик по этой теме http://www.technologics.ru/node/64

(изменено: snake, 20 февраля 2013 18:12:29)

Re: Заполнение раскрывающегося списка

Да, конечно, Sub WorkWithTCSActiveModule  должна находиться в модуле формы. В этом и смысл заключался.
Мой же вопрос о Сonst был вызван тем, что я полагала, будто
1)

Const FormName = "DEMO_Form"
Const ActiveModuleTagName = "ActiveModuleTag"
Sub ShowForm(TCSActiveModule)...
       Call F.ShowModal ...

прописаны в одном модуле (тип Модуль), а
2)

Sub WorkWithTCSActiveModule(Form)...
    Idx = Form.UserData.IndexOf(DEMO_Form.ActiveModuleTagName)...

прописаны в другом модуле (тип Форма ввода)
(Именно так было у меня. Подсмотрела в демо базе. Не судите строго, первый опыт.)

После Ваших пояснений поняла, что и 1), и 2)  в вашем примере находятся в одном модуле (тип Форма ввода).
(В этом случае вопрос про Сonst и не возникает.)

Вывод для меня: для использования формы достаточно одного модуля (тип Форма ввода).
Форму вызывать из Sub, которая тоже в этом же модуле.
Уже проверила.  ОК!

А сколько модулей рекомендует использовать разработчик?

Re: Заполнение раскрывающегося списка

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

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

Спасибо сказали: snake1

(изменено: snake, 21 февраля 2013 09:14:29)

Re: Заполнение раскрывающегося списка

Благодарна Вам за внимание к моим вопросам, особенно мелким, которые по началу и самой не особо понятны, и потому не лучшим образом сформулированы. Как клубок за ниточку, так и темы одна за другой поднимаются и становятся благодаря форуму ясными и понятными. Ваша поддержка очень важна.

Re: Заполнение раскрывающегося списка

Здравствуйте.
Вопрос аналогичный, но нужно заполнить ListBox.
Макрос должен искать в архиве документы по определённому признаку и обозначения этих документов записывать в ListBox_0 в форме "For_new_nomen5_2".

Пишу такой код:

Set F5 = TCSApp.TCSForm("For_new_nomen5_2", False)
F5.Controls(c_ListBox_0).Items.Clear    'очищаем ListBox_0
a=0   'счётчик количества найденных документов
                           
Set Docum = TCSApp.SingleDoc(0,Oboz)  'ищем в архиве документ с обозначением, равным значению переменной Oboz
   If Not Docum Is Nothing Then  'если документ найден, то
   a=a+1
   AAA = Docum.Properties("NOTE").DisplayText
   Index = F5.Controls(c_ListBox_0).Items.Add(AAA)   'записываем обозначение документа в ListBox_0
   F5.Controls(c_ListBox_0).Items.TagValues(Index) = a
   End If

В ListBox_0 ничего не появляется.
В чём ошибка, подскажите, пожалуйста.

Re: Заполнение раскрывающегося списка

на всякий случай не забывайте делать так, чтобы объекты созданные от TCSApp не висели в памяти потом

Set Docum = TCSApp.SingleDoc(0,Oboz)
Docum.UserModuleName = Docum.UniqueUserModuleName
TCSApp.DeleteModuleByUserModuleName( Docum.UserModuleName )

для 6.3 вроде так должно работать.

С остальным пока смотрим что не так.

Спасибо сказали: Шишкина Наталия1

Re: Заполнение раскрывающегося списка

У меня как раз версия 6.3.

Re: Заполнение раскрывающегося списка

Может все таки Docum Nothing или Обозначение пустое? Вроде ошибки не видно.

Спасибо сказали: Шишкина Наталия1

(изменено: Шишкина Наталия, 30 марта 2016 10:56:05)

Re: Заполнение раскрывающегося списка

Сделала так. Результат тот же.

Set F5 = TCSApp.TCSForm("For_new_nomen5_2", False)
F5.Controls(c_ListBox_0).Items.Clear    'очищаем ListBox_0
a=0   'счётчик количества найденных документов

Docum.UserModuleName = Docum.UniqueUserModuleName                           
Set Docum = TCSApp.SingleDoc(0,Oboz)  'ищем в архиве документ с обозначением, равным значению переменной Oboz
   If Not Docum Is Nothing Then  'если документ найден, то
   a=a+1
   AAA = Docum.Properties("NOTE").DisplayText
   Index = F5.Controls(c_ListBox_0).Items.Add(AAA)   'записываем обозначение документа в ListBox_0
   F5.Controls(c_ListBox_0).Items.TagValues(Index) = a
   End If
TCSApp.DeleteModuleByUserModuleName(Docum.UserModuleName)

Запустила по отладчиком. Документ находит.
Для выражения
F5.Controls(c_ListBox_0).Items.Add(AAA)
пишет
Empty
User-defined Type
Что это означает? Может, в этом дело?

Re: Заполнение раскрывающегося списка

Запустите под отладкой или вставьте сообщения для отладки, например так:

Set F5 = TCSApp.TCSForm("For_new_nomen5_2", False)
F5.Controls(c_ListBox_0).Items.Clear    'очищаем ListBox_0
MsgBox "Очистили список"
a=0   'счётчик количества найденных документов
 
Docum.UserModuleName = Docum.UniqueUserModuleName                           
Set Docum = TCSApp.SingleDoc(0,Oboz)  'ищем в архиве документ с обозначением, равным значению переменной Oboz
   If Not Docum Is Nothing Then  'если документ найден, то
    MsgBox "Документ найден"
   a=a+1
   AAA = Docum.Properties("NOTE").DisplayText
   MsgBox "Добавляем значение: '" & AAA & "'"
   On Error Resume next
   Index = F5.Controls(c_ListBox_0).Items.Add(AAA)   'записываем обозначение документа в ListBox_0
   If err Then MsgBox "Ошибка: " & err.err.Description   
   F5.Controls(c_ListBox_0).Items.TagValues(Index) = a
   MsgBox "Элементов в списке: " & F5.Controls(c_ListBox_0).Items.Count
   Else
      MsgBox "Документ не найден"
   End If
TCSApp.DeleteModuleByUserModuleName(Docum.UserModuleName)

Далее по коду отображаете форму "F5"?
Или таким образом пытаетесь добавить данные на существующую форму?
Тогда последний параметр должен быть "True"

Set F5 = TCSApp.TCSForm("For_new_nomen5_2", True)
Спасибо сказали: Шишкина Наталия1

Re: Заполнение раскрывающегося списка

Для выражения
F5.Controls(c_ListBox_0).Items.Add(AAA)
пишет
Empty
User-defined Type
Что это означает? Может, в этом дело?

Что это означает что одна из переменных не инициализирована (не задано значение)

Не похоже что ошибка именно на этой строке, так как если "AAA" равно Empty, то в список попадает пустая строка, а это не ошибка.

Спасибо сказали: Шишкина Наталия1

Re: Заполнение раскрывающегося списка

По коду только одна переменная 'Oboz' может быть 'Empty'.
Посмотреть можно так:

MsgBox "Тип Oboz = " & TypeName(Oboz)

или по отладчиком

(изменено: Шишкина Наталия, 30 марта 2016 12:44:11)

Re: Заполнение раскрывающегося списка

Сделала так:

Set F5 = TCSApp.TCSForm("For_new_nomen5_2", False)
F5.Controls(c_ListBox_0).Items.Clear    'очищаем ListBox_0
MsgBox "Очистили список"
a=0   'счётчик количества найденных документов
  
Docum.UserModuleName = Docum.UniqueUserModuleName
MsgBox "Тип Oboz = " & TypeName(Oboz)                           
Set Docum = TCSApp.SingleDoc(0,Oboz)  'ищем в архиве документ с обозначением, равным значению переменной Oboz
   If Not Docum Is Nothing Then  'если документ найден, то
    MsgBox "Документ найден"
   a=a+1
   AAA = Docum.Properties("NOTE").DisplayText
   MsgBox "Добавляем значение: '" & AAA & "'"
   On Error Resume next
   Index = F5.Controls(c_ListBox_0).Items.Add(AAA)   'записываем обозначение документа в ListBox_0
   If err Then MsgBox "Ошибка: " & err.err.Description   
   F5.Controls(c_ListBox_0).Items.TagValues(Index) = a
   MsgBox "Элементов в списке: " & F5.Controls(c_ListBox_0).Items.Count
   Else
      MsgBox "Документ не найден"
   End If
F5.ShowModal    'открываем форму
TCSApp.DeleteModuleByUserModuleName(Docum.UserModuleName)

Поочерёдно вышли сообщения:
Очистили список
Тип Oboz = String
Документ найден
Добавляем значение '1234-5678'

Потом открылась форма с пустым списком.
Сообщение с ошибкой и сообщение с количеством элементов списка не вышло.
Со свойствами самого ListBox это может быть связано?

Re: Заполнение раскрывающегося списка

Docum.UserModuleName = Docum.UniqueUserModuleName
TCSApp.DeleteModuleByUserModuleName(Docum.UserModuleName)

Начиная с 6.3 если не ошибась, эти строки лучше не разделять (писать рядом).

сделайте так

Index = F5.Controls(c_ListBox_0).Items.Add(AAA)
Index = F5.Controls(c_ListBox_0).Items.Add("qweqwe")
Index = F5.Controls("ListBox_0").Items.Add("asdasd")

что будет?

Спасибо сказали: Шишкина Наталия1

Re: Заполнение раскрывающегося списка

Эта строка отработала
Index = F5.Controls("ListBox_0").Items.Add("asdasd")

В списке появилась строка
asdasd

Строка
Index = F5.Controls("ListBox_0").Items.Add(AAA)
добавила значение переменной.

Спасибо за помощь.