Содержание материала

 

Фактически, реестр представляет собой объект сортированного списка строк TStringList. Этот объект создается при регистрации первого метакласса. Поскольку список сортирован, то поиск в нем выполняется достаточно быстро. Каждый элемент списка содержит имя метакласса и ассоциированную с ним ссылку на метакласс.

Объекты и их заместители

В предыдущем разделе речь шла только о типах инспектируемых объектов. В этом разделе "фокус ввода" перемещается на инспектируемые объекты. Как было сказано, инспектор получает доступ к значениям свойств на основе RTTI. Это означает, что инспектируемые классы должны содержать объявление и реализацию published-свойств. Если мы инспектируем классы визуальных компонентов, порожденных от TComponent, то это условие выполняется автоматически и никаких других усилий нам прикладывать не нужно. Если мы проектируем классы, специально рассчитанные на инспекцию, то мы можем удовлетворить этому требованию, если при объявлении классов укажем директиву {$M+} или будем порождать классы данных от TPersistent. Все свойства, доступные для инспекции, нужно объявить в секции published. В этом случае от нас также не требуется дополнительных усилий. Ситуация осложняется, если нам требуется инспектировать объекты, которые не содержат RTTI или вообще не являются Delphi-объектами. Такое может произойти, например, если:

 

мы вводим инспектор объектов в уже существующий проект, в котором изначально не предполагалось наличие инспектора,

 

требуется инспекция объектов, разработанных сторонними разработчиками,

 

 

объекты реализуются на другом языке программирования или доступны только через их интерфейсы (например, COM-объекты),

 

объекты размещаются в адресном пространстве другого процесса или на другой машине в локальной сети.

Для того, чтобы иметь возможность инспекции объектов различной природы и происхождения, вводится понятие "объект-заместитель" (proxy). Те, кто знаком с книгой Эриха Гамма и др. "Приемы объектно-ориентированного проектирования. Паттерны проектирования" сразу поймут, в чем дело. При инспекции объекта, который не содержит RTTI, динамически создается его заместитель, который, с одной стороны, имеет RTTI и соответствующие published-свойства, а, с другой стороны, содержит ссылку на инспектируемый объект и перенаправляет запросы на получение и изменение свойств соответствующим методам, интерфейсным входам или полям данных реального инспектируемого объекта. После инспекции объекта его заместитель просто уничтожается. Таким образом, для инспектора создается иллюзия, что он работает с родным Delphi-объектом. Способ создания proxy-объекта тесно связан с тем, как реализован сам инспектируемый объект. Естественно, что в каждом конкретном случае потребуется конкретное решение. Для примера предположим, что инспектируемый объект - прямоугольник, то есть, экземпляр записи типа TRect. Тогда реализация объекта-заместителя может быть такой:

Code:

type

{$M+}

TRect_Proxy = class

public

   constructor Create(ARect: PRect);

 

private

   FRect: PRect; // указатель на экземпляр записи

 

   function GetLeft: Integer;

   function GetTop: Integer;

   function GetWidth: Integer;

   function GetHeight: Integer;

   procedure SetLeft(const Value: Integer);

   procedure SetTop(const Value: Integer);

   procedure SetWidth(const Value: Integer);

   procedure SetHeight(const Value: Integer);

 

published

   property Left: Integer read GetLeft write SetLeft;

   property Top: Integer read GetTop write SetTop;

   property Width: Integer read GetWidth write SetWidth;

   property Height: Integer read GetHeight write SetHeight;

end;

{$M-}

 

constructor TRect_Proxy.Create(ARect: PRect);

begin

   Assert(Assigned(ARect));

   FRect := ARect;

end;

 

function TRect_Proxy.GetLeft: Integer;

begin

   Result := FRect^.Left;

end;

 

...

 

procedure TRect_Proxy.SetHeight(const Value: Integer);

begin

   FRect^.Bottom := FRect^.Top + Value;

end;

 

Для случая, когда инспектируемый объект находится, например, на другой машине локальной сети, реализация прокси-объекта будет сложнее и определится тем, как конкретно реализовано сетевое взаимодействие.

Менеджер объектов

В задачу менеджера входит организация взаимодействия между визуальным компонентом инспектора и инспектируемым объектом. Может возникнуть вопрос, для чего нужен посредник? Для ответа на этот вопрос можно выделить несколько моментов:

 

желание отделить визуальную часть инспектора от какой бы то ни было связи с конкретными объектами и конкретными методами работы с ними. Тем, кто программировал на Microsoft Visual C++, прекрасно знакома методология "документ-вид", а программисты на SmallTalk сразу вспомнят "модель-контроллер-вид",

 

желание предоставить потенциальную возможность конструирования информации для инспектирования различными способами,

 

 

обеспечение независимости от способа предоставления метаданных. Например, для какого-то конкретного проекта мы предпочли бы описывать метаданные на XML или каким-то иным способом,

 

потенциальная возможность использования визуального компонента для реализации клона Delphi-инспектора, используя только ту информацию, которую в виде RTTI формирует компилятор (без предоставления дополнительных метаданных). А кроме того, в этом случае нам потребовалось бы два различных представления - для свойств и для методов,

 

 

потенциальная возможность групповой инспекции объектов.

Учитывая эти аргументы, введение посредника становится достаточно обоснованным. Основные задачи менеджера объектов можно сформулировать так:

 

отделить визуальное представление инспектора от данных, с которыми он работает,

 

представить инспектору свойства инспектируемого объекта в наиболее удобной для него форме, то есть, в виде древовидной структуры свойств,

 

 

передавать инспектору значения свойств объекта и изменять значения свойств объекта при их изменении в инспекторе,

 

взаимодействовать с метаданными и перенаправлять классам метаданных запросы на требования инспектора, например, на отображение какого-то специфического диалога, заполнение списка перечислимых значений свойства и так далее.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить