Обработка нажатия кнопки селектора в классе на VBScript |
Объектная модель Акцента содержит ряд свойств для связывания с селектором на форме или диалоге. Связанный элемент отслеживает изменение назначенного ему свойства, и наоборот, изменения в селекторе (ввод текста или нажатие кнопки) передаётся через это же свойство источнику данных для обработки и последующего отображения. При решении сложных задач автоматизации часто приходится самостоятельно писать источники данных для связывания с различными контролами. Однако, если требуется обработка нажатия кнопки селектора, при использовании такого источника приходится производить ряд не совсем логичных действий: нужно запретить контролу обрабатывать щелчёк кнопки методом DisableBindClick и поместить вызов метода Click своего класса в обработчик события OnClick контрола. Неудобно и то, что событие OnBound контрола в этом случае расположено в двух процедурах. Дело в том, что в качестве команды на показ диалога выбора, селектор передаёт связанному источнику данных специальное значение, которое не поддерживается программами на VBScript. А пока можно предпринять следующее: в качестве источника данных для связывания использовать не свойство класса, а простую переменную. Момент изменения этой переменной можно определить, переадресовав источнику данных запрос селектора на контрольное значение, которое селектор посылает до- и после выполнения операций с источником данных. '------------------------------------------------------------------------------------------------- 'на форме селектор, называется 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 |
« Пред. |
---|