Вызов одного скрипта из другого Назад В начало Вперед
//=========================================================
interface test;

create view

as select
  *

from
  x$files
;

//---------------------------------------------------------
screen sc
<<
>>
end;

//---------------------------------------------------------
handleEvent
cmInit:
{
  var i,j : longInt;

  // численным инвариантом генерируем некоторое положительное i
  for (j := (i -= i) - 1; i <> j; i := j) 
  j += ((1 shl 12)- (j div 2));

  if i < 0 then
	Message('Результат отрицателен')
  else
  begin
	// для отладки можно встроиться сюда..
	// i := 9;

	var type : string;

	// выясняем тип, которым будет оперировать скрипт.
	case i of
		0   ..  255	 : type := 'Byte';
		256 ..  65535   : type := 'Word';
		else			type := 'LongInt';
	end;

	var source : longInt;  // хендл исходного текста.

	source := vaGetFreeHandle;  // вообще-то, они все еще пустые.

	// генерируем скрипт.
	vaAddStr(source,'  script Корень(i : '+Type+') : '+Type+'; ');
	vaAddStr(source,'  begin								 ');
	vaAddStr(source,'	 result := SQRT(i); 			 ');
	vaAddStr(source,'  end.									');


	Message('Выводим построчно содержимое скрипта..');
	var iterator : Word;

	for (iterator := 1; iterator <= vaStrCount(source); iterator ++)
	Message(vaGetStr(source, iterator));
	Message('Конец скрипта.');

	vaCompile(source);
	vaFreesource(source); // подчистить за собой - хороший тон.

	var extType : string;

	// получаем тип, с которым оперирует первый скрипт, в строковом виде.
	#declare CaseTypeElement(ElemType) 
		ft#ElemType: extType := '#ElemType'
	#end

	case vaResultType(vaGet('Корень')) of
		#CaseTypeElement(Void);
		#CaseTypeElement(Boolean);
		#CaseTypeElement(Byte);
		#CaseTypeElement(Char);
		#CaseTypeElement(Word);
		#CaseTypeElement(Integer);
		#CaseTypeElement(longInt);
	end;

	var source1 : longInt;
	source1 := vaGetFreeHandle;

	// формируем скрипт-"обертку"
	vaAddStr(source1,' Script wrapper(param : longInt) : longInt; 				 ');
	vaAddStr(source1,' begin															');
	vaAddStr(source1,'  var i : '+extType+'; 										');
	vaAddStr(source1,'  i := '+extType+'(param); // вот оно, явное преобразование типа  ');
	vaAddStr(source1,'  result := Корень(i); 										');
	vaAddStr(source1,' end.															 ');

	vaCompile(source1);
	vaFreesource(source1);

	var callParameter   : longInt;
	var resultParameter : longInt;

	callParameter := i;

	// биндим параметр известного типа и вызываем "оберточный" скрипт.
	vaBindParameter(vaGet('wrapper'), callParameter);
	vaExecute(vaGet('wrapper'), resultParameter);

	// получаем корень числа i
	Message('Корень числа = ' + resultParameter);

  end;
};

end;

end.