Глава 12. РАЗРАБОТКА ОКОННОГО ИНТЕРФЕЙСА
Различия между языками Delphi Script и Object Pascal
Интерпретатор Dream Scripter от компании Dream Company, встроенный в
Allegro, имеет ряд особенностей. Различия между языками Delphi
Script и Object Pascal описаны в документе:
http://www.dream-com.com/dscriptdesc.html
Здесь мы приводим наш перевод этого документа:
Документ описывает различия между Delphi Script и Object Pascal,
используемым в Delphi 5.
Все переменные в Delphi Script всегда имеют тип Variant.
Приведение типов игнорируется.
Типы в объявлениях переменных игнорируются и могут быть пропущены,
так что показанные ниже объявления корректны:
var a : integer;
var b : integerr;
var c, d;
Типы параметров в объявлениях процедур и функций игнорируются и могут
быть пропущены, например, такой код корректен:
function sum(a, b) : integer;
begin
result := a + b;
end;
Типы элементов массивов игнорируются и могут быть пропущены, так
что эти объявления эквивалентны:
var x : array [1..2] of double;
var x : array [1..2];
Следующие ключевые слова игнорируются:
interface, implementation, program, unit
Вы можете их использовать, но они не будут иметь
эффекта.
Директива in в секции uses игнорируется.
Delphi Script не поддерживает объявления типов. Он пытается их
пропустить, однако некоторые сложные объявления могут вызвать сбой парсера
.
Операторы ^ и @ не поддерживаются.
Вы не можете использовать имя функции для присвоения ему возвращаемого
функцией значения, используйте для этой цели ключевое слово Result
.
Вложенные функции поддерживаются, но Вы не можете использовать переменные
, объявленные в функциях верхнего уровня внутри вложенных.
Следующие ключевые слова не поддерживаются:
as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline,
interface, is, library, object, out, property, record, resourcestring, set, type
Следующие директивы не поддерживаются (учтите, что некоторые из
них являются устаревшими и не поддерживаются и в Delphi):
absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic,
export, external, far, implements, index, message, name, near, nodefault, overload,
override, package, pascal, private,protected, public,
published, read, readonly, register, reintroduce,
requires, resident, safecall, stdcall, stored, virtual, write, writeonly
Следующие функции RTL не поддерживаются в Delphi Script:
Abort, Addr, Assert, Dec, FillChar, Finalize, Hi, High, Inc, Initialize, Lo, Low, New,
Ptr, SetString, SizeOf, Str, UniqueString,
VarArrayRedim, VarArrayRef, VarCast, VarClear, VarCopy
Объявление открытых массивов не поддерживается.
CASE может использоваться для любых типов переменных. Так что
Вы можете написать:
case UserName of
'Alex', 'John' : IsAdministrator := true;
'Peter' : IsAdministrator := false;
else
raise('Unknown user');
end;
Raise может использоваться без параметров для повторной генерации последнего исключения
. Вы можете также использовать строковый параметр для генерации исключения
с определенным сообщением. Например:
Raise(Format('Invalid value : %d', [Height]));
Ключевое слово Threadvar интерпретируется как Var
Конструкторы […] для множеств не поддерживаются. Вы можете использовать
функцию MkSet для создания множеств. Например:
Font.Style := MkSet(fsBold, fsItalic);
Оператор In для множеств не поддерживается. Используйте функцию InSet
для проверки того, что значение является членом множества.
Например:
if InSet(fsBold, Font.Style) then
ShowMessage('Bold');
Учтите, что операторы '+', '-
', '*', '<=',
'>=' не работают корректно с множествами. Вы
должны использовать вместо них логические операторы. Например,
ASet := BSet + CSet;
должно быть заменено на
ASet := BSet or CSet;
CreateObject может использоваться для создания объектов, которые сами неявно
уничтожатся, если больше не используются. Так, вместо
procedure proc;
var l;
begin
l := TList.Create;
try
// do something with l
finally
l.Free;
end;
end;
вы можете написать
procedure proc;
var l;
begin
l := CreateObject(TList);
// do something with l
end;
Встроенная функция Evaluate может использоваться для интерпретации строк, как
программного кода в процессе программы и исполнять код, содержащийся
в строках. Например, Вы можете написать такой скрипт
Evaluate(ProcNames[ProcIndex]);
и процедуры, имена которых определены в ProcNames[
ProcIndex] будут вызваны.
Встроенная директива UseUnit может быть использована для динамического добавления любого
модуля в секцию uses во время выполнения. Например,
следующий скрипт
if FileExists('Update.pas') then
begin
UseUnit('Update.pas');
Evaluate('Update.DoUpdate');
end;
проверяет, существует ли модуль под названием Update.pas
и если это так, вызывает его метод DoUpdate.
Директива UnloadUnit выгружает любой модуль, добавленный в секцию uses
вызовом UseUni
|