Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа со скриптами


Автор: NoX 17.9.2003, 18:47
Нужно сделать так чтобы программа могла выполнять макросы
на VBScript (or JavaScript, etc.), а-ля MS Word.
Можно конечно скинуть скрипт на диск и shell, но тут проблемка:
нужно чтобы в скрипте были доступны переменные программы.
Может кто знает какие компоненты для выполнения скриптов ??
Подойдет также ActiveX или COM.


Автор: Vit 17.9.2003, 20:16
RaLib и JVCL содержат компонент для выполнения скнриптов на языке Дельфи - всё очень круто, в макросах можно пользоваться практически всеми конструкциями Дельфи - от процедур, до создания форм...

Автор: Monty 17.9.2003, 23:42
Цитата(Vit @ 17.9.2003, 19:16)
RaLib и JVCL содержат компонент для выполнения скнриптов на языке Дельфи - всё очень круто, в макросах можно пользоваться практически всеми конструкциями Дельфи - от процедур, до создания форм...

Vit, а можно поподробние? И если можно с не большим примером использрвания smile.gif ...... я просто даже незнаю название компонента, хотя RaLib (а не RxLib?) и JVCL есть .........

Автор: Monty 18.9.2003, 00:51
Цитата(Monty @ 17.9.2003, 22:42)
Цитата(Vit @ 17.9.2003, 19:16)
RaLib и JVCL содержат компонент для выполнения скнриптов на языке Дельфи - всё очень круто, в макросах можно пользоваться практически всеми конструкциями Дельфи - от процедур, до создания форм...

Vit, а можно поподробние? И если можно с не большим примером использрвания smile.gif ...... я просто даже незнаю название компонента, хотя RaLib (а не RxLib?) и JVCL есть .........

Все, нашел smile.gif .............. Велтколепно! ... Просто удивляет! smile.gif
Дает такие возможности, я просто восхищен smile.gif .... осталось придумать как это использовать в своей программе, ведь полезная вещь!

....... я восхищен до сих пор ........

Автор: Monty 18.9.2003, 01:24
Ого!

Да с таким компонетом я ЛЕГКО реализую в программе работу с плагинами! smile.gif
Ведь он еще умеет вызывать функции из ДЛЛ ..... плюсь еще любой может для своего плагина создать форму со всем нужным на ней smile.gif

Как все выглядет хорошо, а подводные камни есть? ..... Не хочется их обнаружить уже в готовом продукте wink.gif

Автор: Vit 18.9.2003, 03:01
Подводные камни есть:

1) Размер exe нехилый, так как ты не знаешь какие функции будут использованы то компилируется практически вся VCL+RTL, так что в максимальном виде бинарник тянет почти на 3 метра

2) Осторожней с подключением библиотек, если добавишь модули для работы с базами данных, то программа будет требовать присуттствия BDE даже если твои скрипты и не используют базы данных

3) Работа скрипта на много порядков медленнее чем работа откомпилированной программы, и памяти жрёт тоже много

4) Следует помнить что скрипт хоть и выглядит точным подобием языка Дельфи на самом деле им не является, есть коренные отличия - на самом деле скрипт поддерживает только 2 типа! Вариант и Указатель на объект, поэтому нормальная работа с типами и классами невозможна, хотя авторы скрипта и попытались максимально приблизить синтаксис, но как ты понимаешь статическое выделение памяти здесь невозможно, а объектное ориентирование просто не реализовано...

Если хочешь я могу прислать для тебя для примера NotePad полностью написанный на этом скрипте.

Автор: Monty 18.9.2003, 03:08
Спасибо Vit, ненадо, демо понятное и все возможности в нем указали ..... там еще и формы поддерживуются ...... восхищаюсь до сих пор smile.gif

В своей программе я много использовал дополнительно, поэтому она и весит 2Мб, надеюсь что от этого Интерпритатора в весе не очень прибавит smile.gif

PS ну надо же .... а пока буду эксперементировать ......

Автор: Monty 18.9.2003, 03:24
Vit у меня вопрос, а можно ли из скрипта использовать переменные и функции/процедуры уже существующей программы?

PS Размер программы таков:
Было: 2Мb - UPX = 0.7Mb
Стало: 3.5Mb - UPX = 1Mb
.... я это могу простить smile.gif .... да и рамер не велик, всего лишь +0.3Mb ......

Автор: Vit 18.9.2003, 03:28
Цитата(Monty @ 17.9.2003, 18:24)
Vit у меня вопрос, а можно ли из скрипта использовать переменные и функции/процедуры уже существующей программы?

Можно, я прикручивал, да там по-моему и демо есть, и просто в исходники их модулей зайди, посмотри как они сами регистрируют функции например из модуля SysUtils - и ты так сможешь, правда на этапе компиляции ты уже должен знать какие функции разрешишь использовать скрипту...

Автор: Vit 18.9.2003, 03:28
Цитата(Monty @ 17.9.2003, 18:08)
PS ну надо же ....

Меня эта возможность самого поразила, действительно сделано круто!

Автор: NoX 18.9.2003, 19:05
Ребята а где эти либа Взять А confused.gifconfused.gifconfused.gifconfused.gifconfused.gifconfused.gifconfused.gifconfused.gif

Автор: Monty 18.9.2003, 20:31
NoX вроде вот ХамеПага ихняя smile.gif http://jvcl.sourceforge.net

Vit проблема, стал писать сам и не выходит sad.gif ..... при запуске Унита пишет: "Error in unit 'fModalForm' on line 6 : Unit 'Windows' not found" ..........

Автор: Monty 18.9.2003, 20:41
Цитата(Monty @ 18.9.2003, 19:31)
NoX вроде вот ХамеПага ихняя smile.gif http://jvcl.sourceforge.net

Vit проблема, стал писать сам и не выходит sad.gif ..... при запуске Унита пишет: "Error in unit 'fModalForm' on line 6 : Unit 'Windows' not found" ..........

Стоит мне пожаловаться на проблему, как тут же её решаю smile.gif ........ теперь запустил

Автор: Monty 20.9.2003, 00:56
Vit, а как завершить работу скрипта ... можно сказать надо завершить принудительно, чтоб не сопротивлялся .............. там как бы нет оператора Terminate т.е. такое есть: JvInterpreterProgram.Run, а вот что- то такого нет: JvInterpreterProgram.Terminate ...... так как можно завершить работу скрипта? hmmm.gif

Автор: Vit 20.9.2003, 01:18
Halt, Exit не пробовал?

Автор: Monty 20.9.2003, 03:32
Цитата(Vit @ 20.9.2003, 00:18)
Halt, Exit не пробовал?

Vit не совсем так smile.gif ... про эти команды я знаю .... вот код:
Код
......
JvInterpreterProgram.Pas.LoadFromFile('c:\unit1.pas');
JvInterpreterProgram.Run;
.....
//А теперь по какой-то причине надо завершить работу скрипта
//JvInterpreterProgram.Exit - нет такого :(
//JvInterpreterProgram.Stop - нет такого :(
//JvInterpreterProgram.Close - нет такого :(
//JvInterpreterProgram.Terminate - нет такого :(


JvInterpreterProgram.Free - не красиво получается, выскакивает окно с ошибкой ......... и больше как незнаю

....... получается JvInterpreterProgram.Run - это машина без тормозов smile.gif

Автор: Vit 20.9.2003, 06:20
Понял, не знаю, надо в исходники лезть... Попробуй просто текст скрипта убить, может поможет...

Автор: Monty 22.9.2003, 19:23
У меня еще ряд вопросов smile.gif
Ну ни как не получется создать свой как бы виртуальный модуль, допустим я копирую модуль JvInterpreter_System.pas под другим названием JvInterpreter_MyFunctions.pas, убираю от туда все, но оставляю подходящии функции по количесту аргументов, например,
было:
Код
procedure JvInterpreter_Random(var Value: Variant; Args: TArgs);
begin
 Value := Random(Integer(Args.Values[0]));
end;

стало:
Код
procedure JvInterpreter_Sleep(var Value: Variant; Args: TArgs);
begin
 Sleep(Integer(Args.Values[0]);
 Value := Null; //можно и не ставить ...............
end;

потом пишу:
Код
procedure RegisterJvInterpreterAdapter(JvInterpreterAdapter: TJvInterpreterAdapter);
begin
 with JvInterpreterAdapter do
 begin
   AddFun('MyFunctions', 'Sleep', JvInterpreter_Sleep, 1, [varInteger], varEmpty);
end;
end; { RegisterJvInterpreterAdapter }

Но результата нет sad.gif .......... я точно что-то не так сделал! hmmm.gif

Добавленно:
И ни чего не получается ... и класс добавить не могу .......... и у себя в проектe прописываю JvInterpreter_MyFunctions .... и в том коде что выполняется интерпритатором hmmm.gif

Автор: Vit 23.9.2003, 06:17
Посмотри что они там пишут в секции Initialization модулей, может там собака порылась, вообще возьми их функцию и тщательно по всему их коду поищи её название, может оно где фигурирует и объявление функции недостаточно

Автор: Monty 23.9.2003, 19:40
Цитата(Vit @ 23.9.2003, 05:17)
Посмотри что они там пишут в секции Initialization модулей, может там собака порылась, вообще возьми их функцию и тщательно по всему их коду поищи её название, может оно где фигурирует и объявление функции недостаточно

Vit smile.gif .......... я забыл поставить
Код
JvInterpreter_MyFunctions.RegisterJvInterpreterAdapter(GlobalJvInterpreterAdapter);

Я же видел это, а свой модуль не прописал smile.gif

Теперь все работает ...... спасибо wink.gif

Автор: dm9 25.9.2003, 16:45
Привет!

Я тоже заинтересовался интерпретатором smile.gif

Код
JvInterpreterProgram1.Pas := Memo1.Lines;
JvInterpreterProgram1.Run;


Memo1 содержит:
Цитата
unit dm9dm9dm9;

procedure main;
begin
   showmessage ('Hello, World!!!');
end;

end.


Выдаётся: function 'main' undefined sad.gif



То же самое:

Код
procedure TForm1.Button1Click(Sender: TObject);
var
  X : Integer;
begin
  JvInterpreterProgram1.Pas := Memo1.Lines;
  X := JvInterpreterProgram1.CallFunction ('MyPlus', nil, [10, 20]);
  ShowMessage (IntToStr (X));
end;


Memo1:
Цитата
unit JvInterpreterFunctionCall;

function MyPlus(A, B: Integer): Integer;
begin
  Result := A + B;
end;

end.


Теперь: Undeclarate identifer 'MyPlus'...

Что я делаю не так?

Автор: Monty 25.9.2003, 23:46
smile.gif

Я такое же получил когда скачал JEDI VCL 2.10 ......... там интерпритатор у меня не работает и выдает странные ошибки !!! ........... НО JEDI VCL 2 BETA работает отлично не смотря на то что она бэта biggrin.gif

........ у тебя все верно ..... и это из демо smile.gif ......... прикольно, когда ихняя же демо не работает tounge.gif

PS я сначло думал что это я криво поставил smile.gif ....... оказывается нет wink.gif

PPS а кто может им написать насчет этого бага? я энглиш не знаю sad.gif ..... да и не хорошо как то, ведь эта версия не бэта, еслиб была бэта было бы понятно ...... к тому же я посмотрел, они в новой версии просто переименовали класс TArg в TJvcInterpreter_Arg .... как то так, но все равно он не функционирует ;(

Автор: dm9 25.9.2003, 23:59
Спасибо, скачаю 2.0 beta. smile.gif

Теперь ещё вопрос: а нету ли справочки по компоненту? По этому интерпретатору и по некоторым другим компонентам ни в одном hlp я ничего не нашёл... Что, только по демкам изучать?

Автор: Monty 26.9.2003, 00:07
Цитата(dm9 @ 25.9.2003, 22:59)
Спасибо, скачаю 2.0 beta. smile.gif

Теперь ещё вопрос: а нету ли справочки по компоненту? По этому интерпретатору и по некоторым другим компонентам ни в одном hlp я ничего не нашёл... Что, только по демкам изучать?

Ага ... по демкам и методом тыка smile.gif ............. лично я смотрю дэмки, полазил по файлу JvInterpreter_Classes.pas и т.д. .... так там всё ясно ....... и загляни в файл JvInterpreter_all.pas wink.gif ........ вот я понял в чем ошибка когда его просмотрел smile.gif

Автор: dm9 28.9.2003, 02:51
Вроде, работает smile.gif

У меня появился новый вопрос: как (если это возможно) использовать внутри скрипта подпрограммы, написанные в этом же скрипте?

Так не работает:

Код
unit dm9dm9dm9;

procedure DDD;
begin
  ShowMessage ('Hello, World!!!');
end;

procedure Main;
begin
  DDD;
end;

end.


А так вообще ошибку выдаёт sad.gif:

Код
unit dm9dm9dm9;

procedure Main;

procedure DDD;
begin
  ShowMessage ('Hello, World!!!');
end;

begin
  DDD;
end;

end.

Автор: Monty 29.9.2003, 09:02
dm9, а твой код у меня работает wink.gif
Код
unit dm9dm9dm9;

procedure DDD;
begin
 ShowMessage ('Hello, World!!!');
end;

procedure Main;
begin
 DDD;
end;

end.

Посмотри Дэмос, а именно проект ".....\JeDi\JVCL\examples\RALib\RaInterpreter\JvInterpreterTest.dpr"

PS Удивление прошло, но восхищение осталось smile.gif

Автор: daemonaz 11.3.2012, 15:31
Мне нужна помощь, как предоставить набор готовых функции пользователям для написания собственных скриптов и причем самых необходимых, затем по нажатию кнопочки этот скрипт запустить? ну например написать скрипт заливки прошивки в микроконтроллер через COM-порт, есть функция отправки по протоколу XModem xmodem_send(), ожидания символа по таймауту wait () и run() для запуска прошивки, вот так получится скрипт

wait(RedBoot); // ждем строку RedBoot
XModem_send(software.bin); // отправка файла
sleep(1000); //пауза

Как это все можно сделать с помошью JvInterpreterProgram?  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)