На этом шаге мы рассмотрим интерфейс IPerPropertyBrowsing.
Инспектор объектов (или его аналог в других средствах разработки) считывает текущее значение свойств ActiveX посредством обращения к интерфейсу IPerPropertyBrowsing. Класс TActiveXControl, который создается автоматически при генерации ActiveX, содержит виртуальные методы GetPropertyString, GetPropertyStrings, GetPropertyValue, которые вызывают интерфейс IPerPropertyBrowsing. Переписывая эти методы, можно изменять в инспекторе объектов или его аналоге строку, которая показывает текущее значение свойства. Как правило, инспектор объектов и его аналоги вполне корректно отображают свойства, представимые в виде строки, Но для свойств, которые неудобно или невозможно представить в виде строк (графические изображения, шрифт и т.п.) программисту необходимо реализовывать интерфейс IPerPropertyBrowsing.
В качестве примера можно верпуться к проекту из предыдущего шага и попытаться модифицировать методы IPerPropertyBrowsing. Перепишем метод GetPropertyString так, чтобы курсор выделялся в квадратных скобках. Для этого в секции protected заголовка класса объявим метод, который будет записан вместо уже имеющегося:
function GetPropertyString (DispID: Integer; var S:String): Boolean; override;
function TButtonX.GetPropertyString (DispID: Integer; var S:String): Boolean; begin if DispID=17 then begin S:='['+IntToStr(Get_Cursor)+']'; Result:=True; end else Result:=Inherited GetPropertyString(DispID,S); end;
В качестве параметра GetPropertyString получает идентификатор свойства DispID, который для каждого свойства можно найти в реалицации библиотеки типов (файл ButtonXControl1_TLB). Для свойства Cursor в нашем случае он равен 17:
Рис.1. Значение идентификатора свойства Cursor
После регистрации ActiveX и установки его на палитру компонентов (процесс установки описан в 5 шаге), разместим этот компонент на форме. Можно заметить, что курсор появляется в квадратных скобках:
Рис.2. Значение курсора в квадратных скобках
Следует обратить внимание, что при нажатии на стрелку вниз в свойстве Cursor из выподающего списка исчезают все знгачения свойства Cursor.
Для того чтобы заполнить выпадающий список строками, помимо реализации метода GetPropertyString нужно реализовать два других метода для данного свойства GetPropertyStrings и GetPropertyValue. Они работаюв в тесной связи друг с другом: первый метод создает строки, которые должны появляться в выпадающем списке, а второй метод формирует соответствующие им значения. Перепишем эти методы для курсора. В секции protected поместим определения методов:
function GetPropertyStrings (DispID: Integer; Strings: TStrings): Boolean; override; procedure GetPropertyValue (DispID, Cookie: Integer; var Value: OleVariant); override;
function TButtonX.GetPropertyStrings (DispID: Integer; Strings: TStrings): Boolean; begin if DispID=17 then begin Strings.Add('Первый'); Strings.Add('Второй'); Strings.Add('Третий'); Result:=True; end else Result:=Inherited GetPropertyStrings(DispID,Strings); end;
procedure TButtonX.GetPropertyValue (DispID, Cookie: Integer; var Value: OleVariant); begin if DispID=17 then Value:=Cookie else Inherited GetPropertyValue (DispID, Cookie,Value); end;
Соотвественно после перекомпиляции проекта и помещения измененного ActiveX на форму можно отметить, что при выборе в инспекторе объектов свойства Cursor и нажатии стрелки вниз появится список из созданных в методе GetPropertyStrings строк:
Рис.3. Перечень строк и инспекторе объектов
Созданный компонент ActiveX можно взять здесь (268 Кб).
Со следующего шага мы начнем рассматривать применение COM-объектов, входящих в состав Windows.