Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Script Controls, события 
:(
    Опции темы
-Mikle-
Дата 1.10.2004, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



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

Короче вопрос: как добавить реакцию на события?

Чтоб в скрипте можно было бы писать процедуры, которые вызываются при возникновении определенных событий. Т.е. например есть специальный класс Application, в нем я программирую доступы к различным классам и окнам программы, и в нем(а таке в других) описываю события, стандартным для VB спосбом(Event EvnName(Arguments) ). Хотелось бы чтоб при возникновении событий в моем классе, автоматом вызывались соответствующие процедуры(если есть конечно) в скрипте. Есть ли для этого в контроле стандартные средства? Хотя вобщем там и объектная модель не сложная, вроде все просмотрел, но ничего не нашел.... остановился на том, что в каждом классе там где генерируется событие, я вызываю ф-ию наподобии такой:
Код
sub FireScriptEvent(ProcedureName as string)
  for i&=1 to sc.procedures.count
     if strcomp(sc.procedures(i).name, ProcedureName,vbcomparestring)=0 then
        sc.run ProcedureName
        exit for
     end if
  next
end sub

Это примерно, там еще проверка модулей идет...
Можно ли как нибудь это автоматизировать? Чтоб проц-ы в скрипте сами вызывались... Кто знает?
Всем спасибо заранее...

Это сообщение отредактировал(а) -Mikle- - 1.10.2004, 21:02


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
cardinal
Дата 1.10.2004, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Может тебе RaiseEvent нужен? Я сам им не разу не пользовался, но возможно это то, что тебе надо сделать
Цитата(Mikle @ 1.10.2004, 19:57)
Чтоб проц-ы в скрипте сами вызывались...

Вот немного информации из MSDN:
Цитата
Declaring and Raising Events

Assume for the moment that you have a Widget class. Your Widget class has a method that can take a long time to execute, and you'd like your application to be able to put up some kind of completion indicator.

Of course, you could make the Widget object show a percent-complete dialog box, but then you'd be stuck with that dialog box in every project in which you used the Widget class. A good principle of object design is to let the application that uses an object handle the user interface — unless the whole purpose of the object is to manage a form or dialog box.

The Widget's purpose is to perform other tasks, so it's reasonable to give it a PercentDone event, and to let the procedure that calls the Widget's methods handle that event. The PercentDone event can also provide a mechanism for canceling the task.

You can start building the code example for this topic by opening a Standard Exe project, and adding two buttons and a label to Form1. On the Project menu, select Add Class Module to add a class module to the project. Name the objects as shown in the following table.

Object              Property          Setting
Class module    Name              Widget
First Button      Caption          Start Task
Second Button  Caption          Cancel
Label                Name              lblPercentDone
                        Caption            "0"
                                     
The Widget Class
You declare an event in the Declarations section of a class module, using the Event keyword. An event can have ByVal and ByRef arguments, as the Widget's PercentDone event demonstrates:

Option Explicit
Public Event PercentDone(ByVal Percent As Single, _
ByRef Cancel As Boolean)

When the calling object receives a PercentDone event, the Percent argument contains the percentage of the task that's complete. The ByRef Cancel argument can be set to True to cancel the method that raised the event.

Note  You can declare event arguments just as you do arguments of procedures, with the following exceptions: Events cannot have named arguments, optional arguments, or ParamArray arguments. Events do not have return values.

Raising the PercentDone Event
The PercentDone event is raised by the LongTask method of the Widget class. The LongTask method takes two arguments: the length of time the method will pretend to be doing work, and the minimum time interval before LongTask pauses to raise the PercentDone event.

Public Sub LongTask(ByVal Duration As Single, _
ByVal MinimumInterval As Single)
  Dim sngThreshold As Single
  Dim sngStart As Single
  Dim blnCancel As Boolean
 
  ' The Timer function returns the fractional number
  ' of seconds since Midnight, as a Single.
  sngStart = Timer
  sngThreshold = MinimumInterval
 
  Do While Timer < (sngStart + Duration)
      ' In a real application, some unit of work would
      ' be done here each time through the loop.
     
      If Timer > (sngStart + sngThreshold) Then
        RaiseEvent PercentDone( _
        sngThreshold / Duration, blnCancel)
        ' Check to see if the operation was canceled.
        If blnCancel Then Exit Sub
        sngThreshold = sngThreshold + MinimumInterval
      End If
  Loop
End Sub

Every MinimumInterval seconds, the PercentDone event is raised. When the event returns, LongTask checks to see if the Cancel argument was set to True.

Note  For simplicity, LongTask assumes you know in advance how long the task will take. This is almost never the case. Dividing tasks into chunks of even size can be difficult, and often what matters most to users is simply the amount of time that passes before they get an indication that something is happening.

For More Information  Now that you've declared an event and raised it, how do you get another object to handle it? "Handling an Object's Events" continues the saga of the Widget object.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
-Mikle-
Дата 2.10.2004, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Спасибо за ответ, cardinal, но наверно я не правильно выразился...
Для точности: я использую не тот Script Control, который контрол на форме, а тот который через Референс подключается. Есть небольшая разница между ними...
RaiseEvent я использую в самих классах, в среде VB. Еще раз объясню...
1. у меня есть текстовый файл, в нем программа на VBскрипт(как макросы в Office), которую читает ScriptControl. Этот текстовый файл, в дальнейшем, будут изменять пользователи.
2. Есть в VB проекте классы, в них я реализую определенные методы, свойства, события.
3. Эти классы я подключаю к ScriptControl, используя его метод AddObject. После этого действия, в скрипте доступны эти классы, т.е. если в скрипте мы напишем msgbox MyClass.MyProperty, то получим значение свойства. Так же можно вызывать методы...
4. Теперь, в классах, которые я создал и подключил, есть события, которые генерируются этим вот RaiseEvent.
5. Далее, чтобы пользователь моей проги мог посадить на какое-нибудь событие какое-то действие(например соб-ие "AfterOpen"), я ищу в "скрипте" соответствующую ф-ию и запускаю ее(если нашел) через метод Run

Меня интересует: можно ли настроить Script Control так, чтоб он сам вызывал соответствующие ф-ии описанные в скрипте, если в каком-то из подключенных к нему классов происходит событие. Ну чтоб не писать в каждом месте где есть RaiseEvent, дополнительные строки, реализующие запуск соответствующей ф-ии в макросе. Дело не в том что мне не хочется, я уже давно именно так и сделал, а просто у меня есть несколько немалых проектов, которые я постоянно поддерживаю и обновляю версию. Так вот чтоб в след. версиях включить скриптовую поддержку, и при этом не переворачивать весь проект, добавляя к нему кучу строк для поддержки скрипта, я хотел просто, добавить объекты в Script Control, а он сам пусть при возникновении событий вызывает ф-ии в пользовательском скрипте.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 4.10.2004, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Ну ладно, тогда поставим вопрос по другому... см. другой топик...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.