Тема: ComboBox или что-то подобное. Как с ним работать?

Здравствуйте!

Требуется сделать на формочке привычный выпадающий список с элементами из классификатора. Стандартные средства - открывающееся окошко с деревом классификатора - не нравится начальству.

Может кто привести пример работы с TDMSLIST и/или Forms.ComboBox.1 (ActivX)? А именно: получение доступа к объекту, добавление итемов, получение итемов. Можно ещё чего интересного) И если есть по классификатору наработки, тоже буду благодарна.

Для полноты информации прошу не сильно урезать код, а показать в контексте)

Зы: до  Forms.ComboBox.1 я добираюсь и меняю цвет фона, но никак не доберусь до итемов(((
ЗыЗы: хелп не помагает, описание класса TDMSLIST доступными словами отсуствует, свойства и параметры методов описанны только типами данных((((

Спасибо за внимание, Катерина.

Re: ComboBox или что-то подобное. Как с ним работать?

Вообще, в системе TDMS классификатор от списка отличается только наличием уровней. Любой классификатор можно подцепить к атрибуту типа Список и он станет выпадающим   ;)
Или вам нужно что то другое ?

(изменено: Julidae, 19 апреля 2012г. 09:38:48)

Re: ComboBox или что-то подобное. Как с ним работать?

Edhunter пишет:

Вообще, в системе TDMS классификатор от списка отличается только наличием уровней. Любой классификатор можно подцепить к атрибуту типа Список и он станет выпадающим   ;)
Или вам нужно что то другое ?


В ходе работы вообще появилась проблема добавления в TDMSList и TDMSGrid ((( выпадает безымянная ошибка и всё тут.
И ни одного примера работы с ними..

Re: ComboBox или что-то подобное. Как с ним работать?

Julidae пишет:

В ходе работы вообще появилась проблема добавления в TDMSList и TDMSGrid ((( выпадает безымянная ошибка и всё тут.
И ни одного примера работы с ними..

Не знаю нашли ли вы уже ответ на ваш вопрос. Если еще нет, опишите вашу проблему чуть подробнее. Кусок кода, версия TDMS. Как эта ошибка выглядит. Про проблемы описания знаем. Постараемся в ближайшее время поправить ситуацию

Re: ComboBox или что-то подобное. Как с ним работать?

McZag пишет:

Не знаю нашли ли вы уже ответ на ваш вопрос. Если еще нет, опишите вашу проблему чуть подробнее. Кусок кода, версия TDMS. Как эта ошибка выглядит. Про проблемы описания знаем. Постараемся в ближайшее время поправить ситуацию

Тогда может поможете с актуальным?) Сейчас надо в одном из столбцов TDMSGRID1 отображать флажки, в другом подцепить выборку. Таким образом эмитируя табличный атрибут. (Табличный атрибут не подходит). Так же не получается вводит текст в ячейки вручную с клавиатуры(

Sub Form_BeforeShow(Form, Obj)
  dim rezol, rezolX
  set rezol = thisform.Controls("TDMSGRID1")
  set rezolX = rezol.ActiveX
  call rezolX.InsertColumn(0,"один",50)
  call rezolX.InsertColumn(1,"два",50)
  call rezolX.InsertColumn(2,"три",50)
  ReadOnly = false 
End Sub

(изменено: McZag, 27 апреля 2012г. 14:30:35)

Re: ComboBox или что-то подобное. Как с ним работать?

Julidae пишет:

Тогда может поможете с актуальным?) Сейчас надо в одном из столбцов TDMSGRID1 отображать флажки, в другом подцепить выборку. Таким образом эмитируя табличный атрибут. (Табличный атрибут не подходит). Так же не получается вводит текст в ячейки вручную с клавиатуры(

Sub Form_BeforeShow(Form, Obj)
  dim rezol, rezolX
  set rezol = thisform.Controls("TDMSGRID1")
  set rezolX = rezol.ActiveX
  call rezolX.InsertColumn(0,"один",50)
  call rezolX.InsertColumn(1,"два",50)
  call rezolX.InsertColumn(2,"три",50)
  ReadOnly = false 
End Sub

Самое главное. Элемент управления GRID не поддерживает редактирование ячеек, если они не привязаны к источнику данных. Поэтому вам нужно создать табличный атрибут как минимум для тех столбцов, которые будут редактироваться.
На форму нужно поместить атрибут (а не элемент управления) и инициализировать его через

set rezol = thisform.Controls("ATTR_MY_TABLE").ActiveX

добавление нередактируемых колонок можете делать в обычной манере:

rezol.InsertColumn 0, "один", 50

Что значит "поцепить выборку"?

Re: ComboBox или что-то подобное. Как с ним работать?

McZag пишет:

Самое главное. Элемент управления GRID не поддерживает редактирование ячеек, если они не привязаны к источнику данных. Поэтому вам нужно создать табличный атрибут как минимум для тех столбцов, которые будут редактироваться.
На форму нужно поместить атрибут (а не элемент управления) и инициализировать его через

set rezol = thisform.Controls("ATTR_MY_TABLE").ActiveX

добавление нередактируемых колонок можете делать в обычной манере:

rezol.InsertColumn 0, "один", 50

Что значит "поцепить выборку"?

Опечаталась, "подцепить", но при работе через ActiveX всё решается.
Возник следующий вопрос)

Не ругается на изменение ширины колонок и добавление новой колонки (msgbox rezol.ColumnCount подтверждает добавление), но таблица не обновляется и выглядит так же. Каким методом её можно обновить?

dim rezol, QueryCHIEF, CHIEF
 set rezol = thisform.Controls("ATTR_CORR_SEND_CHIEF").ActiveX
  
   for i = 0 to (CHIEF.count - 1)        
     call rezol.InsertRow(i)        
   next 
  
   rezol.ColumnWidth(0) = 50
   rezol.ColumnWidth(1) = 200
   
   call rezol.InsertColumn(2,"fefwf",200)
   msgbox rezol.ColumnCount
   
 call rezol.Redraw() 
 call rezol.Refresh()

Re: ComboBox или что-то подобное. Как с ним работать?

Julidae пишет:

Опечаталась, "подцепить", но при работе через ActiveX всё решается.
Возник следующий вопрос)

Не ругается на изменение ширины колонок и добавление новой колонки (msgbox rezol.ColumnCount подтверждает добавление), но таблица не обновляется и выглядит так же. Каким методом её можно обновить?

dim rezol, QueryCHIEF, CHIEF
 set rezol = thisform.Controls("ATTR_CORR_SEND_CHIEF").ActiveX
  
   for i = 0 to (CHIEF.count - 1)        
     call rezol.InsertRow(i)        
   next 
  
   rezol.ColumnWidth(0) = 50
   rezol.ColumnWidth(1) = 200
   
   call rezol.InsertColumn(2,"fefwf",200)
   msgbox rezol.ColumnCount
   
 call rezol.Redraw() 
 call rezol.Refresh()

Попробуйте сначала сформировать таблицу, и только потом ее заполнять. У меня все нормально работает безо всяких рефрешей.

Re: ComboBox или что-то подобное. Как с ним работать?

McZag пишет:

Попробуйте сначала сформировать таблицу, и только потом ее заполнять. У меня все нормально работает безо всяких рефрешей.

В таком порядке заработало, спасибо ^^

Re: ComboBox или что-то подобное. Как с ним работать?

Julidae пишет:

В таком порядке заработало, спасибо ^^

Только теперь таблица формируется, но не заполняется Т_Т (не отображаются значения)

   set rezol = thisform.Controls("ATTR_CORR_SEND_CHIEF").ActiveX  
   thisform.Controls("ATTR_CORR_SEND_CHIEF").Width = 200
   rezol.ColumnWidth(0) = 50   
   call rezol.InsertColumn(1,"ФИО",200)

     for i = 0 to (CHIEF.count - 1)     
      call rezol.InsertRow(i)     
     next
   
    for i = 0 to (CHIEF.count - 1)      
      rezol.CellValue(i,0) =  true
      rezol.CellText(i,1) = CHIEF(i).Description 
    next

*первый столбец - флаги(атрибут), второй - добавила

Можно Ваш пример?

Re: ComboBox или что-то подобное. Как с ним работать?

В общем, если это не трогать, то работает)))

  dim rezol, QueryCHIEF, CHIEF
   set rezol = thisform.Controls("ATTR_CORR_SEND_CHIEF").ActiveX     
   thisform.Controls("ATTR_CORR_SEND_CHIEF").Width = 200
   rezol.ColumnWidth(0) = 50   
   call rezol.InsertColumn(1,"ФИО",200)   
   Set QueryCHIEF = thisApplication.Queries("QUERY_CORR_CHIEFS")   
   SET CHIEF = QueryCHIEF.Users  
   if rezol.RowCount = 1 then   
     'набиваем руководство
     for i = 0 to (CHIEF.count - 1)    
     On Error Resume Next
     call rezol.InsertRow(i)
     On Error Goto 0
     next  
   end if   
    for i = 0 to (CHIEF.count - 1)
     rezol.CellText(i,1) = CHIEF(i).Description 
      'rezol.CellValue(i,0) =  true
    next

Re: ComboBox или что-то подобное. Как с ним работать?

Julidae пишет:

В общем, если это не трогать, то работает)))

Был рад помочь. Но немного смущает "если это не трогать". Если найдете пару минут, напишите, какие прикосновения приводят к неработоспособности. Про очередность создания таблицы и наполнения ее данными я понял, попробуем исправить. А что еще?

Re: ComboBox или что-то подобное. Как с ним работать?

Есть такая странность, что при вызове формы из скрипта:

 Set CreateDocObject = Nothing
  Dim CreateObjDlg, obj
  ' Инициализация свойств диалога создания объекта
  Set CreateObjDlg = ThisApplication.Dialogs.CreateObjectDlg
  ' Указание типа создаваемого объекта
  CreateObjDlg.ObjectDef = "OBJECT_CORR_SEND"
  ' Указание родителя, в составе которого будет создан объект
   CreateObjDlg.ParentObject = thisobject.Parent
  ' Установить активную форму ввода
   CreateObjDlg.ActiveForm = ThisApplication.ObjectDefs("OBJECT_CORR_SEND").InputForms("FORM_CORR_SEND")
  ' Вызов диалога создания. (Открытие карточки объекта)
    CreateObjDlg.Show

событие Form_BeforeShow срабатывает 2 раза.
Поэтому, что бы не создать строк в 2 раза больше, ставлю проверку:

if rezol.RowCount = 1 then


(ибо изначально в таблице RowCount = 1)

Логично было бы запихнуть туда все действия с таблицей, что бы 2 раза не повторятся, но тогда перестаёт работать.

При следующем варианте не добавляются колонки и значения

  dim rezol, QueryCHIEF, CHIEF
   set rezol = thisform.Controls("ATTR_CORR_SEND_CHIEF").ActiveX     
 
   Set QueryCHIEF = thisApplication.Queries("QUERY_CORR_CHIEFS")   
   SET CHIEF = QueryCHIEF.Users
    ' при перегрузки формы не заполняем больше
   if rezol.RowCount = 1 then   
    thisform.Controls("ATTR_CORR_SEND_CHIEF").Width = 200
    rezol.ColumnWidth(0) = 50   
    call rezol.InsertColumn(1,"ФИО",200) 
     'набиваем руководство
     for i = 0 to (CHIEF.count - 1)    
      On Error Resume Next
      call rezol.InsertRow(i)
      rezol.CellText(i,1) = CHIEF(i).Description      
      On Error Goto 0
     next
   end if

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

Re: ComboBox или что-то подобное. Как с ним работать?

С наполнением таблиц ещё одна страшна вещь проиходит:


добавляем кнопку на форму и пустой обработчик к ней:

Sub BUTTON2_OnClick()
End Sub

И все таблицы очищаются от значений... F5 их возвращает, thisform.Refresh не помогает.