Главная DISCLAIMER Ссылки Карта сайта Контакты
Главная arrow Вопросы разработки arrow Обработка нажатия кнопки селектора в классе на VBScript
Обработка нажатия кнопки селектора в классе на VBScript

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

При решении сложных задач автоматизации часто приходится самостоятельно писать источники данных для связывания с различными контролами. Однако, если требуется обработка нажатия кнопки селектора, при использовании такого источника приходится производить ряд не совсем логичных действий: нужно запретить контролу обрабатывать щелчёк кнопки методом DisableBindClick и поместить вызов метода Click своего класса в обработчик события OnClick контрола. Неудобно и то, что событие OnBound контрола в этом случае расположено в двух процедурах.
А почему бы сразу не обрабатывать событие нажатия кнопки в классе, написанном на VBScript?

Дело в том, что в качестве команды на показ диалога выбора, селектор передаёт связанному источнику данных специальное значение, которое не поддерживается программами на VBScript.
Вернее так: простая переменная VBScript воспринимает и хранит это значение. А вот передать в класс такое значение невозможно - значение не пропускает COM-интерфейс класса, возникает ошибка. Надеемся, что когда-нибудь разработчики программы Акцент исправят эту ситуацию.

А пока можно предпринять следующее: в качестве источника данных для связывания использовать не свойство класса, а простую переменную. Момент изменения этой переменной можно определить, переадресовав источнику данных запрос селектора на контрольное значение, которое селектор посылает до- и после выполнения операций с источником данных.
Вот пример источника данных для связывания op.Long2 с произвольной аналитикой, который напрямую воспринимает щелчёк кнопки селектора.

'-------------------------------------------------------------------------------------------------
'на форме селектор, называется sel_Long2
Dim bL2  : 'Set bL2=New BindLong2 ' создание экземпляра поместить в событие Form_OnLoad
sel_Long2.DataSource="bL2_Value"
sel_Long2.DataSourceCheck="bL2.Value"
 
Class BindLong2  'Класс селектора выбора аналитики mscNo_TRS, mscID_TRS для op.Long2
  Private Sub Class_Initialize
    ExecuteGlobal("Dim bL2_Value")
    bL2_Value=miscName(op.Long2)  'загружается из операции при создании экземпляра.
  End Sub
 
  Public Default Property Get Value
    If VarType(bL2_Value)=24 Then 
      ReDim bL2_Value(0) : Value=DoClick() 'Если поймали VoidValue, очищаем и делаем клик.
    Else
      If bL2_Value<>miscName(op.Long2) Then Value=Find(bL2_Value)'изменился текст селектора -поиск
    End If
  End Property
 
  Private Function miscName(id)  'вспомогательная.
    If id=0 Then miscName="<не выбран>" : Exit Function
    If workarea.Misc(id) Is Nothing Then miscName="<удалён>" Else miscName=workarea.Misc(id).Name
  End Function
 
  Private Function Find(txt)  'при вводе фразы производим поиск аналитики по вхождению.
    If txt="" Then op.Long2=0 : bL2_Value=miscName(0) : Find=0 : Exit Function 'команда очистки.
    Dim top : Set top=workarea.CreateOperation : top.Trans(1,1).MiscBind(mscNo_TRS).Name=txt'поиск
    Dim newID  : newID=top.Trans(1,1).MiscID(mscNo_TRS)  'результат поиска.
    If newID=0 Then newID=op.Long2 'отказ от выбора похожих. Восстанавливаем прежнее значение.
    op.Long2=newID  : bL2_Value=miscName(NewID) : Find=NewID
  End Function
 
  Private Function DoClick  'по щелчку на селекторе показываем диалог выбора аналитики.
    Dim newID  : newID=workarea.Browse(acMisc, op.Long2, mscID_TRS, 1)  'результат выбора.
    If newID=0 Then newID=op.Long2 'отказ от выбора. Восстанавливаем прежнее значение.
    op.Long2=newID  : bL2_Value=miscName(newID) : DoClick=NewID
  End Function
End Class
'------------------------------------------------------------------------------------------------- 

Пример учебный - на практике для решения такой простой задачи удобнее пользоваться свойством Value3. Для более сложных задач можно использовать модель этого класса, но сам подход искажает представление о работе с источниками данных, поэтому не рекомендован к применению. Это просто демонстрация одного из вариантов выхода из ситуации, возможно не лучшего.

Следующий пример показывает возможность радикального решения проблемы "DiasbleBindClick" при внесении разработчиками абсолютно незначительных изменений в код Акцента.

'на форме селектор, называется sel_Long2
Dim bL2  : Set bL2=New BindLong2  'экземпляр можно создавать в любом месте программы.
sel_Long2.DataSource="bL2.Value"
sel_Long2.DataSourceCheck=""
 
Class BindLong2  'Класс селектора выбора аналитики mscNo_TRS, mscID_TRS для op.Long2
  Public Default Property Get Value
    If op.Long2=0 Then Value="<не выбран>" : Exit Property
    If workarea.Misc(op.Long2) Is Nothing Then Value="---" Else Value=workarea.Misc(op.Long2).Name
  End Property
 
  Public Property Let Value(v)
    If err.Number<>0 Then  'If IsEmpty(v)
      Call DoClick() 'Если поймали VoidValue, очищаем и делаем клик.
    Else
      Call Find(v)'Если изменился текст селектора - поиск.
    End If
  End Property
 
  Private Sub Find(txt)  'при вводе фразы производим поиск аналитики по вхождению.
    If txt="" Then op.Long2=0 : Exit Sub 'команда очистки - приоритетная.
    Dim top : Set top=workarea.CreateOperation : top.Trans(1,1).MiscBind(mscNo_TRS).Name=txt'поиск
    Dim newID  : newID=top.Trans(1,1).MiscID(mscNo_TRS)  'результат поиска.
    If newID=0 Then Exit Sub 'отказ от выбора из списка похожих. Восстанавливаем прежнее значение.
    op.Long2=newID
  End Sub
 
  Private Sub DoClick    'по щелчку на селекторе показываем диалог выбора аналитики.
    Dim newID  : newID=workarea.Browse(acMisc, op.Long2, mscID_TRS, 1)  'результат выбора.
    If newID<>0 Then op.Long2=newID 'если не было отказа от выбора.
  End Sub
End Class
'---------------------------------------------------------------------------------------------
Sub btnX_OnClick  'отправка источнику данных команды нажатия кнопки селектора.
  Execute "On Error Resume Next : bL2.Value=VoidValue : If err.Number<>0 Then bL2.Value=Empty"
End Sub
 
« Пред.