Параметры интерфейса |
<параметры интерфейса> ::= { parameters <поле> {, <поле>}; }
Параметры передаются "по ссылке", то есть любое изменение значений формальных параметров в интерфейсе приведет к изменению значений фактических параметров в вызывающем интерфейсе. Необходимо, однако учитывать следующие особенности:
Если запуск интерфейса завершился командой cmCancel или cmClose, то параметры возвращаются не измененными. Для того чтобы такой интерфейс все-таки вернул значения в параметрах необходимо обработать событие cmCancel в обработчике главного окна интерфейса следующим образом:
cmCancel: begin CloseInterface(cmDefault); // - здесь может быть любая // - команда stop; // - этот оператор нужен для того, чтобы не вызвался // стандартный обработчик cmCancel end;
Примечания:
1. В этом обработчике после вызова CloseInterface() нельзя выдавать сообщения пользователю с помощью диалоговых окон или функции Message - появившееся окно "съест" внутреннее событие и интерфейс не закроется.
2. Данный метод не сработает, если интерфейс еще не открылся, например, если событие cmInit или cmSetDefult на пустой таблице завершилось аварийно (вызовом Abort).
Если формальный параметр является не переменной, а полем физической таблицы, то этот параметр только возвращается.
Пример:
interface pickDepartment doAccept; create view as select * from Depart; parameters code; // code является полем таблицы Depart browse Departs; fields name; end; end. interface employees; create view as select * from Depart,Employee where ((Employee.dep == Depart.code)); handleEvent cmPick: if (CurField=#Depart_Name) RunInterface(PickDepartment, dep); end; end.
Если все-таки требуется получить переданное значение, то необходимо объявить параметром переменную того же типа и при выходе (для окон выбора это событие cmDefault) присвоить переменной значение из буфера.
Приведенный ниже интерфейс при открытии позиционируется на запись с переданным как параметр кодом сотрудника iEmpCode.
interface pickEmployees doAccept; create view var iEmplCode : comp; // Переменная не является полем // физической таблицы as select * from Employees; parameters iEmplCode; browse viewEmployee fields emplName: protect; end; handleEvent cmInit: if ( modifier getFirst Employees where((iEmplCode == Employees.emplCode))=tsOk) {}; // ищем сотрудника с переданным на вход кодом cmDefault: iEmplCode := emplCode; // возвращаем код выбранного сотрудника end; end.