Скрипт
AKReport

содержание
 

Оглавление страницы:

Описание скрипта

     Описание языка

     Структура скрипта

     Типы данных

     Перечисления и множества

     Массивы

     Пример, процедура "GetWord"

Создание событий

Отладчик

 

Система отчетов "AKReport" поддерживает скрипт, позволяющий создавать гибкие отчеты со сложной структурой. Синтаксис скрипта - Object Pascal.

Описание языка

Синтаксис PascalScript:

Program -> [PROGRAM Ident ';']

                 [UsesClause]

                 Block '.'

UsesClause -> USES (String/,)... ';'

Block -> [DeclSection]...

             CompoundStmt

DeclSection -> ConstSection

                  -> VarSection

                  -> ProcedureDeclSection

ConstSection -> CONST (ConstantDecl)...

ConstantDecl -> Ident '=' Expression ';'

VarSection -> VAR (VarList ';')...

VarList -> Ident/','... ':' TypeIdent [InitValue]

TypeIdent -> Ident

               -> Array

Array -> ARRAY '[' ArrayDim/','... ']' OF Ident

ArrayDim -> Expression..Expression

              -> Expression

InitValue -> '=' Expression

Expression -> SimpleExpression [RelOp SimpleExpression]...

SimpleExpression -> ['-'] Term [AddOp Term]...

Term -> Factor [MulOp Factor]...

Factor -> Designator

          -> UnsignedNumber

          -> String

          -> '(' Expression ')'

          -> NOT Factor

          -> '[' SetConstructor ']'

SetConstructor -> SetNode/','...

SetNode -> Expression ['..' Expression]

RelOp -> '>'

          -> '<'

          -> '<='

          -> '>='

          -> '<>'

          -> '='

          -> IN

          -> IS

AddOp -> '+'

          -> '-'

          -> OR

          -> XOR

MulOp -> '*'

          -> '/'

          -> DIV

          -> MOD

          -> AND

          -> SHL

          -> SHR

Designator -> ['@'] Ident ['.' Ident | '[' ExprList ']' | '(' ExprList ')']...

ExprList -> Expression/','...

Statement -> [SimpleStatement | StructStmt]

StmtList -> Statement/';'...

SimpleStatement -> Designator

                          -> Designator ':=' Expression

                          -> BREAK | CONTINUE | EXIT

StructStmt -> CompoundStmt

                 -> ConditionalStmt

                 -> LoopStmt

                 -> TryStmt

                 -> WithStmt

CompoundStmt -> BEGIN StmtList END

ConditionalStmt -> IfStmt

                        -> CaseStmt

IfStmt -> IF Expression THEN Statement [ELSE Statement]

CaseStmt -> CASE Expression OF CaseSelector/';'... [ELSE Statement] [';'] END

CaseSelector -> SetConstructor ':' Statement

LoopStmt -> RepeatStmt

               -> WhileStmt

               -> ForStmt

RepeatStmt -> REPEAT StmtList UNTIL Expression

WhileStmt -> WHILE Expression DO Statement

ForStmt -> FOR Ident ':=' Expression ToDownto Expression DO Statement

ToDownto -> (TO | DOWNTO)

TryStmt -> TRY StmtList (FINALLY | EXCEPT) StmtList END

WithStmt -> WITH (Designator/,..) DO Statement

ProcedureDeclSection -> ProcedureDecl

                                 -> FunctionDecl

ProcedureDecl -> ProcedureHeading ';'

                          Block ';'

ProcedureHeading -> PROCEDURE Ident [FormalParameters]

FunctionDecl -> FunctionHeading ';'

Block ';'

FunctionHeading -> FUNCTION Ident [FormalParameters] ':' Ident

FormalParameters -> '(' FormalParam/';'... ')'

FormalParm -> [VAR | CONST] VarList

 

Структура скрипта

Структура PascalScript почти такая же, как и у Object Pascal

#language PascalScript // опционально

program MyProgram; // опционально

uses 'unit1.pas', 'unit2.pas';

// раздел uses должен быть перед любыми другими разделами

// v1.2 changes: Внимание! Теперь подключаемые модули НЕ вставляются в текст главного модуля.

// Таким образом, они могут иметь секции 'program', 'uses' и должны иметь секцию 'main procedure'.

var // раздел var

i, j: Integer;

const // раздел const

pi = 3.14159;

procedure p1; // процедуры и функции

var

    i: Integer;

 

    procedure p2; // вложенная процедура

    begin

    end;

 

begin

end;

 

begin // главный исполняемый модуль.

end.

 

Типы данных

Скрипт работает с типом Variant и основан на нём. Тем не менее, вы можете использовать следующие предопределённые типы в ваших скриптах:

целочисленные:

Byte

Word

Integer

Longint

Cardinal

TColor

 

логический:

Boolean

 

расширенный (с плавающей запятой):

Real

Single

Double

Extended

Currency

TDate

TTime

TDateTime

 

символьный:

Char

 

строковый:

String

 

Variant (вариантный тип):

Variant

Pointer

 

массив:

Array

 

Перечисления и множества

Скрипт поддерживает перечисления. Вы можете написать в скрипте:

Form1.BorderStyle := bsDialog;

Множества не поддерживаются. Тем не менее, вы можете оперировать элементами множества:

Font.Style := fsBold; // Font.Style := [fsBold] в Delphi

Font.Style := fsBold + fsItalic; // Font.Style := [fsBold, fsItalic]

Font.Style := 0; // Font.Style := []

 

Массивы

Скрипт поддерживает все типы массивов: статические (одномерные, многомерные), динамические, вариантные. Вот пример скрипта, использующего три массива целых чисел, объявленных разным способом:

var

ar1: array[0..2] of Integer;

ar2: array of Integer;

ar3: Variant;

 

SetLength(ar2, 3);

ar3 := VarArrayCreate([0, 2], varInteger);

ar1[0] := 1;

ar2[0] := 1;

ar3[0] := 1;

 

Редактор скрипта поддерживает справочник доступных операторов и объектов.

Для удобной отладки отчетов в редактор встроен пошаговый отладчик скрипта.

 

Пример, процедура "GetWord"

Функция позволяет получить по отдельности фамилию, имя или отчество из строки, содержащей фамилию имя отчество перечисленные через пробел.

function GetWord(Num: integer; s: string): string;
var
      SL: TStringList;
begin
      SL := TStringList.Create;
      try
            SL.Delimiter := ' ';
            SL.DelimitedText := s;
            if (SL.Count > 3) then RaiseException('Нельзя продолжать отчет потому что Ф.И.О. содержит более 3 слов'#13#10 + s);
            if (SL.Count <= 3) then
            begin
                  if SL.Count >= Num then Result := SL[Num - 1]
                  else Result := '';
            end
            else if Num = 1 then Result := s
                                    else Result := '';
      finally
            SL.Free;
      end;
end;

Вызов процедуры "GetWord".

Var

      W : String;

Begin

      W := GetWord(1, 'Иванов Петр Сергеевич'); // W = 'Иванов'

      W := GetWord(2, 'Иванов Петр Сергеевич'); // W = 'Петр'

      W := GetWord(3, 'Иванов Петр Сергеевич'); // W = 'Сергеевич'

End;

 

 

Создание событий

Cобытия, доступные в системе отчета "AKReport" описаны в разделе "События".

Для создания события следует выделить в структуре отчета объект, для которого создается обработчик события, затем, в инспекторе выбрать необходимое событие "On..." и кликнуть на нем дважды левой клавишей мыши. При этом в скрипте будет создана заготовка процедуры типа:

procedure dsWorkers_OnBeforePrintRec(Band: TDBBandInfo);

begin

 

end;

Описание основных параметров, передаваемых в процедуру-обработчик события приведено в разделе "События".

 

Отладчик

Интегрированная среда разработки отчетов "AKReport" поддерживает пошаговый отладчик скрипта.

Для управления отладчиком используются пункты меню "Отчет":

       Шаг вне - выполнить функцию скрипта без входа в функцию.

       Шаг внутрь - выполнить функцию скрипта с пошаговым выполнением кода функции.

       Остановить - Прервать процесс выполнения скрипта.

Просмотр значений

Для просмотра значений переменных используется окно списка выражений в нижней части редактора.

Добавить выражение в список можно одним из следующих способов:

- кликнуть правой клавишей маши по списку выражений и из контекстного меню выбрать "Добавить выражение"

- выделить выражение в тексте скрипта и нажать "Ctrl+F5"

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

Точки останова

Интегрированная среда разработки отчетов "AKReport" поддерживает точки останова.

Для установки такой точки следует кликнуть левой клавише мыши на левом поле текста скрипта. Строка подсвечивается красным цветом. Если в строке несколько операторов, то остановка будет происходить перед каждым из операторов, а строчный курсор будет показывать, перед каким оператором произошла остановка.

При остановке и последующих шагах выполнения скрипта текущая выполняемая строка отображается синим цветом.

содержание

Copyright © 2004: Alexander Krepky, Eugeny Makalish