Вверх ↑
Этот топик читают: Гость
Ответов: 33
Рейтинг: 1
#1: 2010-09-27 12:59:19 ЛС | профиль | цитата
Доброго времени суток!

Пишу программу с возможностью заскриптовать пользователю кое-какие действия и столкнулся с проблемой: не хотят выполнятся на VBScript'е следующие вещи:

- использование объекта WScript, а именно методов Sleep и Quit
- объект WScript не создается и не получается получить его ч/з GetObject

Хотя в описании компонента написано: "От элемента VBScript данное решение отличается тем, что использует скрипты операционной системы, которые входят в стандартную установку во всех версиях начиная с XP."

Т.ж. нет описания объекта sys

Схема для тестирования:

code_20793.txt

У кого какие идеи?
карма: 0

0
файлы: 1code_20793.txt [881B] [230]
Главный модератор
Ответов: 2999
Рейтинг: 396
#2: 2010-09-27 13:49:32 ЛС | профиль | цитата
lsd25 писал(а):
- использование объекта WScript, а именно методов Sleep и Quit
- объект WScript не создается и не получается получить его ч/з GetObject


Невозможно использовать объект WScript и соответственно его методы в компоненте VBJScript!

Если интересуют подробности, предлагаю поискать на форуме - эта тема уже обсуждалась. Например, вот здесь: http://hiasm.com/forum.html?q=3&p=103098#p103098
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 33
Рейтинг: 1
#3: 2010-09-27 17:53:55 ЛС | профиль | цитата
Хорошо, я тоже предпологал это.

Тогда вопрос: как реализовать выход из скрипта( т.е. заменить WScript.Quit)?
Допустим у меня в скрипте цикл, который должен прерваться только основной программой( т.е есть есть точка doStop), а у компонента VBJScript нет такого метода по прерыванию/постановке на паузу текущего скрипта

Просто метод Sleep я на IC сделал, а вот как сделать Quit ума не приложу
карма: 0

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#4: 2010-09-27 23:23:49 ЛС | профиль | цитата
lsd25 писал(а):
Просто метод Sleep я на IC сделал


sleep method
------------ Дoбавленo в 23.23:
lsd25 писал(а):
Тогда вопрос: как реализовать выход из скрипта( т.е. заменить WScript.Quit)?


Непонятен вопрос, так как все методы компонента VBJScript это подпрограммы, например:

#bas
Sub doWork(Data, Index)
...
End Sub

То для выхода из любой их них достаточно выполнить:

#bas
Sub doWork(Data, Index)
...
Exit Sub
...
End Sub
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1code_20801.txt [911B] [290]
Ответов: 33
Рейтинг: 1
#5: 2010-09-28 00:08:17 ЛС | профиль | цитата
Nic писал(а):
sleep method

- я в IC просто функцию sleep использую

Nic писал(а):
Непонятен вопрос, так как все методы компонента VBJScript это подпрограммы, например:
...
То для выхода из любой их них достаточно выполнить:
...


Хорошо, раз не понятен, вот задача: моя основная рабочая процедура( т.е. sub doWork) находиться в бесконечном цикле, как прервать ее выполнение из основной программы( например, у полиморфных контейнеров есть ##delete/##clear, а у VBJScript'а нету). Исползовать мульти-тред не получается, полиморфная форма/панель так-же не активна, пока выполняется скрипт( поэтому и неактивна кнопка, для остановки).

Да, кстати, использовать exit sub не решит проблему, т.к. она завершает только текущую процедуру, по этому у меня есть спец. событие onStop - которое устанавливает текст скрипта равным нулю, но опять же это внутри скрипта, из вне кнопка "Стоп" занята

Вот схема:
code_20802.txt

карма: 0

0
файлы: 1code_20802.txt [2.3KB] [161]
Главный модератор
Ответов: 2999
Рейтинг: 396
#6: 2010-09-28 09:02:18 ЛС | профиль | цитата
lsd25 писал(а):
Исползовать мульти-тред не получается

Подключите так:


Add(VBJScript,11093546,427,238)
{
@Hint=#4:Exec|
WorkPoints=#7:doStart|11:##SetScript|
EventPoints=#7:onSleep|6:onText|6:onStop|
DataPoints=#10:FuncResult|
Script=#17:Dim i 'global var|0:|27:function Sleep(TimeToSleep)|27: sys.onSleep(TimeToSleep)|26: Result = sys.FuncResult|12:end function|0:|26:function SetText(InfoText)|23: sys.onText(InfoText)|13: Result = 1|12:end function|0:|46:sub Quit()'можно вызвать в любом месте скрипта|16: sys.onStop(0)|7:end sub|0:|28:function doWork(Data, Index)|15: i = i + 1|16: SetText(i)|17: Sleep(1000)|12:end function|
UseName=0
link(onSleep,1150256:doSleep,[])
link(onText,13288933:doText,[(502,251)(502,342)])
link(onStop,5808541:doWork1,[(476,258)(476,373)(312,373)])
link(FuncResult,5298730:GetData,[])
}
Add(Button,7767791,238,231)
{
Left=10
Top=10
Caption="старт"
link(onClick,4730508:doStart,[])
}
Add(Button,13741447,238,301)
{
Left=10
Top=35
Caption="стоп"
link(onClick,5808541:doWork2,[])
}
Add(EventFromData,5298730,427,189)
{
link(onEvent,5298730:doData,[(469,195)(469,228)(415,228)(415,195)])
link(Data,8656383:Value,[])
}
Add(Memory,8656383,427,147)
{
Point(Data)
}
Add(InlineCode,1150256,511,238)
{
@Hint=#31:Выделяем текс в Edit ComboBox'а|
WorkPoints=#7:doSleep|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|40:uses kol,Share,Debug, Windows, Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|9: public|23: onResult:THI_Event;|51: procedure doSleep(var _Data:TData; Index:WORD);|5: end;|0:|14:implementation|0:|59:procedure THiAsmClass.doSleep(var _Data:TData; Index:WORD);|5:begin|29: sleep(ToInteger(_Data));|29: _hi_onEvent(onResult,1);|4:end;|0:|4:end.|
link(onResult,8656383:doValue,[(553,244)(553,137)(415,137)(415,153)])
}
Add(Label,13288933,511,336)
{
Left=70
Top=10
Width=105
Height=40
Caption=""
AutoSize=1
}
Add(DoData,3334465,322,301)
{
Data=String()
link(onEventData,11093546:##SetScript,[(401,307)(401,251)])
}
Add(HubEx,5808541,308,301)
{
link(onEvent,3334465:doData,[])
}
Add(Thread,4730508,315,231)
{
Delay=500
link(onSyncExec,11093546:doStart,[])
}
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
1
Голосовали:lsd25
Ответов: 33
Рейтинг: 1
#7: 2010-09-28 10:42:35 ЛС | профиль | цитата
Nic - респект!!!

Заработало! Всем спасибо!

P.S. Думал, что прогу переписывать надо... Уф, обошлось... Сэкономленное время потрачу на раздел в WiKi. Кстати, есть где-нибудь подробное описание объекта sys?
карма: 0

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#8: 2010-09-29 11:37:12 ЛС | профиль | цитата
lsd25 писал(а):
есть где-нибудь подробное описание объекта sys?


tsdima писал(а):
Если ты почитаешь документацию по windows script, то тебе станет ясно, зачем наряду с обычной (встроенной в движок скрипта) функцией CreateObject существует ещё и метод WScript.CreateObject. Главное его отличие как раз в том, что он позволяет организовать обработку событий. Объект WScript создаётся автоматически при обработке скрипта программой WScript.exe и это его системный объект, наподобие нашего sys. Но наш системный объект не содержит такой функции.


Подробности в этой теме: http://hiasm.com/forum.html?q=3&p=103098#p103098
------------ Дoбавленo в 11.21:
tsdima писал(а):

Добавил возможность работы с массивами из скрипта, например:

var a = sys.Array;
a.Add(666);
a.Set(0, 123);
sys.onEvent(a.Count);
sys.onEvent(a.Get(0));

------------ Дoбавленo в 11.37:
tsdima писал(а):

CreateObject встроен в VBScript, т.е. это функция неотделима от языка.
А sys.CreateObject - это моя функция, которую я добавил к объекту sys, и её параметры я обрабатываю сам, т.е. создать объект, приаттачить обработчик событий, реализовать этот обработчик, и т.п.

карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 5227
Рейтинг: 587
#9: 2010-09-29 21:00:46 ЛС | профиль | цитата
Nic, в памяти всплывает что были проблемы с запусками скриптов в потоке. Однозначно утверждать не могу т.к давно не эксперементировал.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Главный модератор
Ответов: 2999
Рейтинг: 396
#10: 2010-09-29 23:01:54 ЛС | профиль | цитата
andrestudio писал(а):
были проблемы с запусками скриптов в потоке


Возможно, решением проблем является помешение компонента VBJScript в мультик в режиме Mode=OnlyOnce
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 33
Рейтинг: 1
#11: 2010-09-30 10:28:02 ЛС | профиль | цитата
Nic писал(а):
Возможно, решением проблем является помешение компонента VBJScript в мультик в режиме Mode=OnlyOnce


Вот схемка, может кому-то пригодиться:
code_20828.txt

В принципе и в режиме Dynamic проверял - работает.
карма: 0

0
файлы: 1code_20828.txt [1.4KB] [215]
Ответов: 301
Рейтинг: 11
#12: 2010-09-30 10:56:57 ЛС | профиль | цитата
Nic писал(а):


sleep method

code_20801.txt

можно короче:
code_20830.txt
карма: 0

0
файлы: 1code_20830.txt [559B] [224]
Главный модератор
Ответов: 2999
Рейтинг: 396
#13: 2010-09-30 11:11:43 ЛС | профиль | цитата
Не надо путать тёплое с мягким. Схема Sleep метода призвана эмулировать програмный "сон" процесса на заданное время, а не воспроизведение звука.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 33
Рейтинг: 1
#14: 2010-09-30 16:26:56 ЛС | профиль | цитата
Согласен с Nic'ом
карма: 0

0
14
Сообщение
...
Прикрепленные файлы
(файлы не залиты)