Главная » Delphi » Редакторы компонентов

0

модифицируют поведение компонентов во время  разра ботки, позволяя добавлять элементы в контекстное меню,  связанное с конкретным компонентом, а также  изменять стандартные действия, выполняемые по двойному щелчку  мышью  на компоненте в конструкторе форм. Вполне  возможно, что  вы уже использовали редакторы полей  компонентов TTable, TQuery и TStoredProc и, сле довательно, сами того не ведая, работали с редакторами компонентов.

Класс TComponentEditor

Хоть это и малоизвестно, но для каждого  компонента, выбранного в конструкторе форм, создается свой собственный редактор. Тип созданного редактора компонентов зависит от типа компонента, но все редакторы компонентов происходят от класса TComponentEditor. Этот класс определен в модуле DsgnIntf следующим образом:TComponentEditor= class(TBaseComponentEditor, IComponentEditor)

private

FComponent: TComponent;

FDesigner: IDesigner;

public

constructor Create(AComponent: TComponent;

ADesigner: IDesigner); override;

procedure Edit; virtual;

procedure ExecuteVerb(Index: Integer); virtual;

function GetComponent: TComponent;

function GetDesigner: IDesigner;

function GetVerb(Index: Integer): string; virtual;

function GetVerbCount: Integer; virtual;

function IsInInlined: Boolean;

procedure Copy; virtual;

procedure PrepareItem(Index: Integer;

const AItem: IMenuItem); virtual;

property Component: TComponent read FComponent;

property Designer: IDesigner read GetDesigner;

end;

Свойства

Свойство TComponentEditor.Component —  это  экземпляр редактируемого компо нента.  Так как все свойства происходят от базового типа  TComponent, то для доступа к полям, введенным в производных классах, необходимо выполнить приведение типа.

Свойство Designer — это  экземпляр компонента TFormDesigner, управляющего приложением во время  разработки. Полное определение данного класса  можно  най ти в модуле DesignEditors.pas.

Методы

Метод Edit() вызывается при двойном щелчке  на компоненте во время  разработ ки. Чаще  всего  этот  метод  вызывает тот  или  иной  тип  диалогового окна  при  разра ботке.  Стандартное поведение такого  метода  предполагает вызов  функции Exe- cuteVerb(0), если  функция GetVerbCount() возвращает значение,  большее   или равное 1. Если в методе  Edit() или в любом другом методе  компонент подвергается изменениям, необходимо вызвать метод Designer.Modified().

Здесь  в именах  процедур и функций используется термин verb (глагол, действие), поскольку  речь  идет о методах  объектов, то есть о тех действиях, которые объект мо жет предпринимать. Сама интегрированная среда  разработки Delphi  ничего не знает о новых  объектах или  компонентах, поэтому  по мере  их добавления ей необходимо “сообщить” об их появлении. Для этого  было  разработано несколько методов, кото рые  применяются для идентификации действий объекта. Чтобы сообщить Delphi  о новом компоненте, обычно используются такие  методы, как GetVerbCount, GetVerb и ExecuteVerb. Они подходят для большинства компонентов.

Метод GetVerbCount() вызывается для получения количества элементов, добав

ляемых  в контекстное меню.

Метод  GetVerb() принимает целочисленный параметр Index и возвращает строку, содержащую текст, который появляется в соответствующей позиции контекстного меню.После  выбора элемента в контекстном меню вызывается метод ExecuteVerb(). Этому методу  в параметре Index передается номер  выбранного пункта  контекстного меню  (считая от нуля).  В ответ  должно  быть  выполнено действие, определяемое вы бранным пунктом меню.

Метод  Paste() вызывается при  помещении компонента в буфер  обмена.  Delphi помещает в буфер  обмена  ресурсный (записанный в поток) образ  компонента. Этот метод можно  также  использовать для помещения в буфер  обмена  данных  различного формата.

Класс TDefaultEditor

Если для нового компонента собственный редактор компонентов не зарегистриро ван,  то  для его  редактирования будет использован стандартный редактор, экземпляр класса TDefaultEditor. Этот редактор переопределяет поведение метода  Edit() так, что он ищет свойства компонента и генерирует (или  находит) событие OnCreate, On- Changed или OnClick (в зависимости от того, какое из них будет найдено первым).

Пример простого компонента

Рассмотрим простой пользовательский компонент:

type

TComponentEditorSample = class(TComponent)

protected

procedure SayHello; virtual;

procedure SayGoodbye; virtual;

end;

procedure TComponentEditorSample.SayHello;

begin

MessageDlg(‘Hello, there!’, mtInformation, [mbOk], 0);

end;

procedure TComponentEditorSample.SayGoodbye;

begin

MessageDlg(‘See ya!’, mtInformation, [mbOk], 0);

end;

Как видите, такой  небольшой компонент может  делать  немногое. Это  невизуаль ный  компонент, происходящий непосредственно от  класса  TComponent и содержа щий два метода — SayHello() и SayGoodbye(), — просто отображающих окна  сооб щений.

Пример редактора для простого компонента

Для того чтобы  компонент смотрелся солиднее, его можно  снабдить собственным редактором. Такой  редактор будет вызываться во время  разработки для выполнения методов компонента. Для этого  в нем придется переопределить по крайней мере  три метода  класса TComponentEditor: ExecuteVerb(), GetVerb() и GetVerbCount(). Приведем исходный код этого компонента:type

TSampleEditor = class(TComponentEditor)

private

procedure ExecuteVerb(Index: Integer); override;

function GetVerb(Index: Integer): string; override;

function GetVerbCount: Integer; override;

end;

procedure TSampleEditor.ExecuteVerb(Index: Integer);

begin

case Index of

0: TComponentEditorSample(Component).SayHello;

// вызов функции

1: TComponentEditorSample(Component).SayGoodbye;

// вызов функции

end;

end;

function TSampleEditor.GetVerb(Index: Integer): string;

begin

case Index of

0: Result := ‘Hello';             // возвращает строку hello

1: Result := ‘Goodbye';           // возвращает строку goodbye

end;

end;

function TSampleEditor.GetVerbCount: Integer;

begin

Result := 2;           // возможно два действия

end;

Метод GetVerbCount() возвращает число  2, а это означает, что редактор компо нентов готов  выполнить два действия. Метод  GetVerb() возвращает строку  каждого из соответствующих пунктов  в контекстном меню.  Метод  ExecuteVerb() вызывает соответствующий метод  компонента, основываясь на  значении индекса, передавае мого ему в качестве параметра.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии