Access 2002

Одна маленькая проблема


Однако остается одна маленькая проблема: модификатор AddressOf может использоваться только в вызове процедуры. Нельзя просто взять и написать вот так: cdl.Call Back – AddressOf SampleCallback

VBA просто откажется компилировать такой код. И все же вам нужно как-то поместить в свойство Cal 1 Back адрес своей функции. Для этого можно воспользоваться небольшим обходным маневром. В модуле basCommon вы найдете функцию adhFnPtrToLong, которая получает один параметр типа Long и тут же возвращает его обратно:

Public Function adhFnPtrToLongdngAddress As Long) As Long adhFnPtrToLong – IngAddress End Function

Чем это нам поможет? Хотя кажется, что функция adhFnPtrToLong просто ничего не делает, ей можно передать имя другой функции с модификатором AddressOf, и она вернет адрес этой функции. С помощью adhFnPtrToLong вы можете легко присвоить свойству Call Back адрес своей функции с обратным вызовом: cdl.Cal1 Back – adhFnPtrToLong(AddressOf SampleCallback)

Именно так мы организовывали обратные вызовы во всех примерах использования класса CommonDl д.

Теперь посмотрим, что можно делать в самой функции с обратным вызовом. Прежде всего, можно обрабатывать сообщения, переданные ей Windows. Эти сообщения указывают текущее состояние диалогового окна и позволяют принимать решения о дальнейших действиях программы. (Сообщения Windows можно рассматривать просто как константы — собственно, это и есть константы типа Long, которые Windows использует для взаимодействия между приложениями.) Windows передает вашей процедуре сообщение и дескриптор диалогового окна. Дескриптор окна — вещь полезная. С его помощью опытный программист, хорошо знающий Windows API, может проделывать с окном самые разнообразные манипуляции. Наша же простенькая функция-пример дожидается сообщения WM_INITDIALOG (указывающего, что процесс инициализации диалогового окна завершен) и центрирует окно на экране.  15.3 приведен код функции с обратным вызовом для окон выбора шрифта и цвета.

Комментарии закрыты