На главную   На главную   Форумы Новости Документация Скачать Купить  
Регистрация  
Система Allegro
Oб Allegro Характеристики Пример конфигурации Документация База ошибок Развитие
Версия для печати К списку книг Вернуться к оглавлению Предыдущий параграф Следующий параграф
Поиск по книге

Глава 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


 
 




              


Система Allegro. Руководство разработчика Наверх