Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Добавление IPERSISTPROPERTYBAG к активным элементам управления

Из хроники. Вчера при попытке запуска нового вируса получил повреждения несовместимые с жизнью компьютер известного международного хакера П. Д. Раста.

Данный совет рассказывает о том, как можно добавить интерфейс IPersistPropertyBag к элементу управления ActiveX. Существует возможность установки свойств элемента управления ActiveX с помощью HTML тэгов PARAM. Добавление интерфейса IPersistPropertyBag в элемент управления ActiveX также позволяет изменять его свойства с помощью инструментов типа ActiveX Control Pad.

Добавление интерфейса IPersistPropertyBag к элементу управления ActiveX очень простая процедура. Все, что необходимо сделать, это добавить интерфейс к определению класса объекта и реализовать три метода интерфейса. Приведенный здесь пример покажет вам эту технологию шаг за шагом, где наш элемент управления ActiveX будет базироваться на TButton. Для упрощения примера мы покажем реализацию функциональности для свойства "Caption" (заголовок). Для реализации полной функциональности можно экстраполировать данный пример на все доступные свойства элемента управления.

Начнем с использования ActiveX Control Wizard и создадим элемент управления ActiveX на основе TButton.

Активизируйте пункт меню File|New и выберите в диалоге New Item (новый элемент) закладку ActiveX. Затем в списке выберите элемент "ActiveX Control". В появившемся диалоговом окне выберите TButton для VCL Class Name. Все остальные настройки можете не трогать и оставить как есть. После нажатия на кнопку OK Delphi сгенерирует базовый код для вашего элемента управления.

Следующим шагом будет добавление интерфейса IPersistPropertyBag к определению класса. Измените первую строку определения, декларирующую тип...


type
  TButtonX = class(TActiveXControl, IButtonX)

на...


type
  TButtonX = class(TActiveXControl, IButtonX, IPersistPropertyBag)

Теперь интерфейс IPersistPropertyBag добавлен к объявлению типа. Затем объявите необходимые методы, добавляя следующие строки в секцию protected:


function IPersistPropertyBag.InitNew = PersistPropBagInitNew;
function IPersistPropertyBag.Load = PersistPropBagLoad;
function IPersistPropertyBag.Save = PersistPropBagSave;
function PersistPropBagInitNew: HResult; stdcall;
function PersistPropBagLoad(const pPropBag: IPropertyBag;
  const pErrorLog: IErrorLog): HResult; stdcall;
function PersistPropBagSave(const pPropBag: IPropertyBag;
  fClearDirty: BOOL; fSaveAllProperties: BOOL): HResult;
  stdcall;

Затем, конечно, реализуйте эти функции...


// -- реализация PersistPropBagInitNew
function TButtonX.PersistPropBagInitNew: HResult;
begin
  Result := S_OK;
end;

// -- реализация PersistPropBagLoad
function TButtonX.PersistPropBagLoad(const pPropBag:
  IPropertyBag; const pErrorLog: IErrorLog): HResult; stdcall;
var
  v: OleVariant;
begin
  if pPropBag.Read('Caption', v, pErrorLog) = S_OK then
    FDelphiControl.Caption := v;
  Result := S_OK;
end;

// -- реализация PersistPropBagSave
function TButtonX.PersistPropBagSave(const pPropBag:
  IPropertyBag; fClearDirty: BOOL; fSaveAllProperties: BOOL)
  : HResult; stdcall;
var
  v: OleVariant;
begin
  v := FDelphiControl.Caption;
  pPropBag.Write('Caption', v);
  Result := S_OK;
end;

Добавлением этого кода завершается создание элемента управления. Продолжаем дальше: соберите (build) элемент управления ActiveX и разместите его в сети. Сделайте это с помощью мастера Web Delpoy Wizard. Просто сделайте необходимые настройки на странице Project|Web Delpoyment Options и разместите ActiveX через Project| Web Deploy.

Мастер Web Deployment Wizard создаст HTML-страницу, содержащую тэг OBJECT, которая должна выглядеть приблизительно так:

<OBJECT
          classid="clsid:324EB783-20A4-11D1-AB11-0020AF3E6306"
          codebase="ActiveX/ButtonXControl.ocx"
          width=100
          height=50
          align=center
          hspace=0
          vspace=0
>
</OBJECT>
Эта страница должна заработать без проблем. Тем не менее, теперь у вас имеется возможность задания заголовка для кнопок через HTML простым добавлением тэга PARAM. Вам измененный тэг OBJECT должен выглядеть таким образом:
<OBJECT
          classid="clsid:324EB783-20A4-11D1-AB11-0020AF3E6306"
          codebase="ActiveX/ButtonXControl.ocx"
          width=100
          height=50
          align=center
          hspace=0
          vspace=0
>
<Param Name="Caption" Value="Привет">
</OBJECT>

Заголовок кнопки теперь будет говорить вам "Привет". В нашем примере заголовок будет доступен только с помощью данного метода. Для того, чтобы рулить другими свойствами, следуйте нашему примеру и изменяйте имя свойства, которое вы хотите использовать.

Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.