Мельница данных- Операторы PascalScript  (раздел целиком)  (28.03.2024)
Операторы PascalScript

Операторы разделяются точкой с запятой (;). Операторы могут быть одним из следующих:


1. Составной оператор
1begin
2  //Другие операторы
end
Операторы, размещенные внутри составного оператора, разделяются точкой с запятой. Никаких ограничений на состав операторов и количество уровней вложенности не накладывается.
Пример
1begin
2  Result := LCurrentValue;
3  Exit;
4end;

2. Оператор присваивания
Выражение1 := Выражение2

Присваивает значение выражения Выражение2 выражению Выражение1. Типы Выражения1 и Выражения2 должны быть совместимы (совпадать по классу домена либо оба быть числовыми). Для этого на Выражение1 (стоящее слева от знака равенства, lvalue) накладывается ряд ограничений. Это выражение должно быть:

  • Полем или свойством экземпляра класса
  • Локальной переменной
  • Параметром
  • Зарезервированной переменной Result
Пример
LObject.Name := 'Новое имя';
Пример
Result := 25;
Пример
LStartTime := StrToDateTime('01.01.2006 00:00:30'); 
Пример
01var
02  LObject: TObject;
03  LClass: TClass;
04  I: Integer; 
05  F: Float;
06begin
07  I := F;  //неверно
08  F := I;  //верно
09  LObject := LClass; //верно
10  LClass := LObject; //неверно. Должно быть LClass := (LObject as TClass);
11end;  

3. Оператор вызова
ИмяПроцедуры [(Параметр1, Параметр2 ...)]

"ИмяПроцедуры" должно быть:

  • Именем метода класса и вызываться с указанием класса либо экземпляра;
  • Именем метода экземпляра и вызываться с указанием экземпляра;
  • Именем метода своего класса либо предка и вызываться без указания спецификаторов.
Порядок и количество параметров в операторе вызова должны строго совпадать с описанием метода.

Пример
1  //метод класса, указан класс
2  LList := TObjectList.Create(Name, Description, TObjectList, nil, nil, Folder);    
3
4  //метод экземпляра, указан экземпляр. Метод не имеет параметров.
5  LList.Destroy;
6
7  //свой либо унаследованный метод
8  BuildDefaultActions(Name, True); 

4. Оператор ветвления
1if Выражение then
2  //Оператор1
3[else
4  //Оператор2]

Выражение должно быть логического типа. В случае если значение Выражения истинно, выполняется Оператор1. Часть else является необязательной и относится к последнему оператору if, не имеющему таковой. В случае ее наличия Оператор2 выполняется, если значение Выражения ложно.

Пример
1if LIndex > 25 then
2  raise 'Индекс слишком большой.';
Пример
1if LMonth = 'январь' then
2  January
3else if LMonth = 'февраль' then
4  February
5else   
6  OtherMonth;  //обратите внимание на точки с запятой.

5. Оператор выбора
1case Выражение of
2  Значение1: //Оператор1
3  Значение2: //Оператор2
4  ...
5[else
6  //Оператор ]
end

Заменяет каскад операторов if. Значение Выражения должно быть числового типа. Часть else выполняется в случае, если Выражение не равно ни одному из перечисленных вариантов. Эта часть не является обязательной.

Пример
1сase LIndex of
2  0: ZeroIndex;
3  1,2,3: SmallIndex;
4  4,5,6,7,8,9,10: BigIndex;
5else
6  raise 'Слишком большой или отрицательный индекс.';
7end;

6. Цикл с предусловием
1while Выражение do
2  //Оператор

Оператор выполняется до тех пор, пока значение Выражения истинно. Выражение должно быть логического типа. Если при входе в цикл Выражение не истинно, то тело цикла не будет выполнено ни одного раза.

Пример
01while LList.Count > 0 do
02  LList.GetItem(0).Destroy;
03
04while True do
05begin
06  LValue := LValue.NextValue;
07  if LValue.Value > 10 then
08  begin
09    Result := LValue.Value;
10    exit;
11  end;
12end;

7. Цикл с постусловием
1repeat
2  //Операторы
3until Выражение

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

Пример
1repeat
2  Result := Result + 1;
3  LObject := LObject.Parent;
4until LObject = nil;

8. Цикл с параметром
1for Параметр := Выражение1 (to|downto) Выражение2 do
2  //Оператор

Параметр цикла обязан быть простой локальной переменной. Функционально цикл с параметром эквивалентен циклам:

  • Для формы to
    1Параметр := Выражение1;
    2while Параметр <= Выражение2 dobegin
    3  Оператор;
    4  Параметр :=  Параметр + 1;
    end;
  • Для формы downto
    1Параметр := Выражение1;
    2while Параметр >= Выражение2 dobegin
    3  Оператор;
    4  Параметр :=  Параметр - 1;
    end;
Если Выражение1 равно Выражению2, тело цикла будет выполнено один раз.

Пример
1for I := LList.Length - 1 downto 0 do
2// если LList.Length = 0, тело цикла ни разу не будет выполнено.
3begin
4  LClass := LList.GetItem(I);
5  LMethod := any(TMethod with (Name = LName) and (Master = LClass));
6  LParamList.Add(any(TMethod with (Name = LName) and (Master = LClass)));
7end;

9. Цикл по экземплярам
1for each Параметр of ИмяКласса [with Выражение]
2  [by [-] Выражение [, [-] Выражение]] do
3    //Оператор

Цикл осуществляется по выборке среди экземпляров класса ИмяКласса, для которых истинно Выражение. Если Выражение не задано, то по всем экземплярам. Ссылка на текущий в рамках цикла экземпляр присваивается в локальную переменную Параметр. Выражение должно определяться относительно переменной Параметр. Выраженния, следующие за ключевым словом by, определяют порядок обхода экземпляров. Знак "-" перед выражением (любого типа) определяет обратный порядок обхода.

Пример
1for each LOption of TOption with LOption.Domain.Required do
2    // для каждой настройки, домен которой обязателен
3  LOption.SetDefaultValue;

10. Оператор прекращения цикла
break

Происходит немедленный выход из цикла. Выполняется финализация операторов защиты завершения, которыми защищено тело цикла. Допустим только в теле цикла с предусловием, цикла с постусловием, цикла с параметром или цикла по экземплярам.


11. Оператор выхода из подпрограммы
exit

Происходит немедленный выход из программного блока. Выполняется финализация операторов защиты завершения.


12. Оператор защиты завершения
1try
2  //Операторы1
3finally
4  //Операторы2
end

Выполняются операторы Операторы1, разделенные точкой с запятой. В случае возникновения исключительной ситуации управление сразу передается на Операторы2, и после их выполнения исключение остается активным. Если исключения не произошло, выполняются Операторы2. Если среди Операторов1 встречается оператор exit, то Операторы2 все равно выполняются.

Пример
1//создание временного объекта-списка
2LList := TObjectList.Create(Name, Description, TObjectList, nil, nil, Folder);
3try
4  LList.Add(LValue);
5  Exit;
6finally
7  //гарантированное уничтожение созданного объекта независимо от исключений.
8  LList.Destroy;
9end;

13. Оператор обработки исключительных ситуаций
1try
2  //Операторы1
3except
4  //Операторы2
end

Выполняются операторы Операторы1. В случае возникновения исключительной ситуации управление передается на Операторы2. Если исключительных ситуаций не возникло, Операторы2 не выполняются никогда. При передаче управления на Операторы2 исключительная ситуация деактивирована. Для ее повторного возбуждения можно воспользоваться оператором возбуждения исключения без указания текстовой строки сообщения.

Пример
1try
2  LObject.NeverTouch := True;
3  LObject.ExecuteCoolMethod; //если метод выполнен неудачно
4except
5  LObject.NeverTouch := True;  //установить флаг и ничего не сообщать пользователю.
6end;
Пример
1try
2   LObject.ExecuteCoolMethod; //если метод выполнен неудачно
3except
4   LObject.Destroy; //удалить неудачный объект
5   raise;           // продолжить обработку исключения.
6end;

14. Оператор возбуждения исключения
raise [Выражение]
Возбуждает исключение, которое, если не было обработано блоком except оператора обработки, дойдет до пользователя. Пользователь увидит сообщение, определяемое Выражением. Выражение должно иметь строковый тип и является обязательным для всех случаев, кроме части except оператора обработки исключений.

15. Оператор унаследованного вызова
inherited

Работает только в унаследованном переопределенном методе. Вызывается метод предка с параметрами, заданными в параметрах к моменту вызова. Если программный блок представляет собой тело функции, то в псевдопеременной Result будет результат выполнения метода предка.

Пример
1// в теле конструктора
2Name := 'Object name';
3Description := 'Object description';
4inherited; //вызов предка с параметрами Name и Description,
5           //заданными двумя предыдущими операторами. Ссылка на
6           //созданный объект лежит в
7           //псевдопеременной Result
8Result.Name := 'New name';