2012-03-06 2 views
4

Предположим, у меня есть эта функция, сохраненную в определенном сценарии:Вызов сценария из другого

function Add(a,b:integer):integer; 
    begin 
    result:=a+b; 
    end; 

и у меня есть еще один сценарий, который является следующим:

var 
    a,b,c:integer; 

    a:=1; 
    b:=2; 
    c:=Add(a,b); 

    println(inttoStr(c)); 

как я могу скомпилировать оба сценария и вызовите первый скрипт из второго с помощью dwscript в Delphi?

ответ

4

при условии, что один файл называется "file1.extension", и это содержание:

function Add(a,b:integer):integer; 
    begin 
    result:=a+b; 
    end; 

и другой файл под названием "main.extension" с содержанием:

var 
    a,b,c:integer; 

    a:=1; 
    b:=2; 
    c:=Add(a,b); 

    println(inttoStr(c)); 

вам нужно добавить следующая строка в начале файла «main.extension»:

// note that file name is case sensitive 
// file1.extension <> FILE1.EXTENSION 
// include_once is to solve cycle-includes 
// i.e. file1.extension includes main.extension and vice-versa 
{$include_once 'file1.extension'} 
// or include if file1.extension does not require functions/objects/variables/etc. 
// from main.extension 
{$include 'file1.extension'} 

Я предлагаю использовать {$ include_once ...} rathe r чем {$ include ...}.

+0

Я пробовал, но это не сработало. Произошла ошибка компилятора: ** «Не удалось найти файл на путях ввода» **, любые предложения? – Zeina

+0

Используйте отладчик для отслеживания кода и посмотрите, какой список путей ввода он использует. Затем либо измените этот список, либо переместите файл. –

+1

@Zeina Вам также нужно добавить к путям сценария «TDelphiWebScript.Config.ScriptPaths» – ComputerSaysNo

3

В дополнение к использованию $ include/$ include_once, как указано в ответе Дорина, вы также можете использовать более традиционные единицы с инструкцией «uses», если вы находитесь в версии SVN (2.3).

Единицы могут быть либо «классическими» единицами с интерфейсом/реализацией, либо смешанными единицами, которые следуют расширенному синтаксису сценариев (просто опустите ключевое слово «интерфейс» и начните объявлять/внедрять).

Самый простой способ передать источники в компилятор - использовать события (OnInclude для источника, OnNeedUnit для источника), но вы также можете передать их, указав CompileFileSystem.

+0

Что такое второй параметр ** 'UnitSource' **, используемый с функциями OnInclude или OnNeedUnit? (что нужно отправить?) – Zeina

+1

Это для вас, чтобы разместить источник. В случае OnNeedUnit , вы можете либо указать источник сценария, который должен быть скомпилирован таким образом, либо использовать возвращаемое значение для передачи IdwsUnit (когда передаваемый блок не является скриптом, а что-то реализовано на стороне Delphi) –

+0

Нет, я не хочу предоставлять источник код внутри моего проекта, я предпочел бы использовать $ Include, упомянутый Дорином, но он не работает. «Не удалось найти файл на путях ввода», это результирующая ошибка компилятора. Я что-то упустил? Спасибо заранее. – Zeina