Процедура обратного вызова (CallBack)- это такая процедура, которая вызывается системными, а не написанными самим программистом процедурами. Типичная ситуация такова: Программист явно или неявно вызывает системную процедуру, а та, в свою очередь, вызывает CallBack процедуру программиста. Естественно, что для CallBack процедур система определяет форму их вызова - имя процедуры, число и типы формальных параметров (но не их имена, которые могут быть произвольными).
CallBack процедуры необходимы при немодальном диалоге, организованном объектами Balloon. Система вызывает CallBack процедуру, передавая ей в качестве одного из параметров номер кнопки, которую выбрал пользователь в окне немодального диалога. Напомним, что при модальном диалоге этот номер возвращает метод Show. Организовать модальный диалог достаточно просто, а с не модальным всегда возникают некоторые сложности. В данном случае они преодолеваются за счет использования процедуры обратного вызова. Эту процедуру пишет сам программист, но вызывает ее система, передавая в процедуру номер кнопки, известный ей в момент вызова. Используя полученный параметр, конечно, нетрудно написать тело самой процедуры так, чтобы она правильно реагировала на выбор, сделанный пользователем.
Теперь, когда общая идея понятна, уточним некоторые детали. Прежде всего заметим, что объект Balloon имеет еще одно ранее не описанное важное свойство CallBack. Значением этого свойства является строка, задающая имя CallBack процедуры. Заметьте, что в данном случае Вы сами определяете имя процедуры и сообщаете его системе. Но число параметров и их типы все-таки фиксированы. Процедура, имя которой Вы указали в свойстве CallBack, должна иметь следующий синтаксис:
Листинг 7.6.
(html, txt)
Повторяем, имена формальных параметров могут быть произвольными. Важно только понимать, что первый параметр задает объект Balloon, вызвавший немодальный диалог, второй - номер кнопки, выбранной пользователем (это может быть системная кнопка или кнопка, определенная меткой). Третий параметр, как правило, не используется в теле процедуры. Он необходим системному Wizard (Мастеру), работающему с объектом Assistant. Конечно, если Вы пишите свой собственный пользовательский Wizard, то этот параметр понадобится. В соответствии с этим синтаксисом необходимо написать тело процедуры, определяющее реакцию на выбор пользователя. Процедуру естественно следует поместить в тот же модуль, в котором задается немодальный диалог. Процедура будет вызываться в тот момент, когда пользователь щелкает выбранную им кнопку в окне немодального диалога. Напомним, что до закрытия пользователь может многократно входить и выходить из этого окна, выполняя другие работы. В заключение приведем пример немодального диалогового окна:
Листинг 7.7.
(html, txt)
Здесь, как Вы видите, вместо переменной Answer появилась CallBack процедура Answer, которая и определяет реакцию на выбор пользователя. Заметьте, что в конце этой процедуры метод Close закрывает диалог. Если этого не делать, то после выдачи сообщения о неудачном решении, можно вернуться в окно немодального диалога и изменить свой выбор! В этом сила немодального диалога. Тем не менее, следует быть весьма аккуратным и во время закрыть окно немодального диалога. В противном случае это окно будет постоянно (до перезагрузки компьютера) сопровождать Помощника на экране. Сложность состоит в том, что локальная переменная, определяющая объект Balloon, может прекратить свое существование, а немодальное окно будет продолжать существовать. Поэтому лучше такие переменные определять как глобальные переменные модуля, тогда метод Close может быть вызван в любой из процедур, завершающих работу приложения.