Главная » Delphi » Списки компонентов: классы TCollection и TCollectionItem

0

Довольно часто  компоненты содержат или  владеют  списками нескольких элемен тов —данных, записей, объектов и даже других компонентов. В некоторых случаях удобно  инкапсулировать такой  список  в специальный объект и сделать  этот  объект свойством владельца компонента. Примером подобного подхода  служит  свойство Lines компонента TMemo. Данное свойство имеет  тип  TStrings, инкапсулирующий список  строк.  При  этом  объект TStrings отвечает за механизм работы с потоками, используемый для записи  строк  в файл формы при сохранении этой формы.

Как следует поступить, если  требуется сохранить список  элементов компонентного или объектного типов, которые еще не инкапсулированы существующим классом,  таким как TStrings? В этом  случае можно  было  бы создать  класс,  обеспечивающий взаимо действие элементов списка  с потоками данных  и сделать  его  свойством компонента владельца. В качестве альтернативного варианта можно  переопределить стандартный механизм взаимодействия с потоками данных компонента владельца так, чтобы  он знал, как работать с данным списком  элементов. Но самое лучшее решение — воспользоваться преимуществами, предоставляемыми классами TCollection и TCollectionItem.

Класс  TCollection —  это  объект, используемый для  хранения списка  объектов

типа TCollectionItem. Сам класс TCollection — это не компонент, а просто пото 

мок  класса  TPersistent.  Обычно  класс  TCollection связан  с  существующим  ком

понентом.

Чтобы воспользоваться возможностями класса  TCollection для хранения списка элементов, необходимо создать  экземпляр класса,  производный от  TCollection, на звав его, например, TNewCollection. Этот класс будет служить типом  свойства компо нента.  Затем  следует создать  новый класс из класса TCollectionItem, который можно назвать TNewCollectionItem. Класс TNewCollection будет содержать список  объек тов типа TNewCollectionItem. Вся прелесть такого  подхода  состоит в том, что для то го,  чтобы   принадлежащие  классу  TNewCollectionItem данные   были   обработаны обычными средствами взаимодействия с потоками данных, достаточно их опубликовать (объявить в разделе published компонента TNewCollectionItem). Delphi знает, как записывать опубликованные свойства в поток и считывать их из него.

Примером использования класса  TCollection может  служить  компонент TSta- tusBar, являющийся потомком класса  TWinControl. Одно  из его  свойств, Panels, имеет  тип  TStatusPanels. Класс  TStatusPanels является потомком класса  TCol- lection и определяется следующим образом:

type

TStatusPanels = class(TCollection)

private

FStatusBar: TStatusBar;

function GetItem(Index: Integer): TStatusPanel;

procedure SetItem(Index: Integer; Value: TStatusPanel);

protected

procedure Update(Item: TCollectionItem); override;

public

constructor Create(StatusBar: TStatusBar);function Add: TStatusPanel;

property Items[Index: Integer]: TStatusPanel read GetItem

write SetItem; default;

end;

Класс  TStatusPanels хранит  список  потомков  класса  TCollectionItem —  объ

ектов класса TStatusPanel. Ниже  приведен код определения этого класса.

type

TStatusPanel = class(TCollectionItem)

private

FText: string;

FWidth: Integer;

FAlignment: TAlignment;

FBevel: TStatusPanelBevel;

FStyle: TStatusPanelStyle;

procedure SetAlignment(Value: TAlignment);

procedure SetBevel(Value: TStatusPanelBevel);

procedure SetStyle(Value: TStatusPanelStyle);

procedure SetText(const Value: string);

procedure SetWidth(Value: Integer);

public

constructor Create(Collection: TCollection); override;

procedure Assign(Source: TPersistent); override;

published

property Alignment: TAlignment read FAlignment

write SetAlignment default taLeftJustify;

property Bevel: TStatusPanelBevel read FBevel

write SetBevel default pbLowered;

property Style: TStatusPanelStyle read FStyle

write SetStyle default psText;

property Text: string read FText write SetText;

property Width: Integer read FWidth write SetWidth;

end;

Свойства типа TStatusPanel, объявленные в разделе published класса,  автомати чески  получают  возможность взаимодействовать с потоками в Delphi. В классе  TSta- tusPanel предусмотрена передача параметра типа  TCollection конструктору  Cre- ate(), благодаря чему обеспечивается связь  с классом  TCollection. В данном  случае конструктору класса  TStatusPanel передается  компонент TStatusBar,  с  которым объект TStatusPanel должен  быть  связан.  Класс  TCollection обладает механизмом взаимодействия с потоками данных, являющихся компонентами класса TCollec- tionItem, а также  определяет некоторые методы  и свойства для манипулирования элементами, поддерживаемыми в классе TCollection. Их описание можно  найти в ин терактивной справке.

Для иллюстрации использования этих двух новых  классов  был создан компонент TddgLaunchPad, позволяющий пользователю хранить список компонентов TddgRunBut- ton (компонент TddgRunButton описан в главе 11, “Разработка компонентов VCL”).

Компонент TddgLaunchPad — потомок компонента TScrollBox. Одно из свойств но

вого компонента — RunButtons — является потомком класса TCollection и поддержива

ет  список  компонентов TRunBtnItem. Компонент TRunBtnItem —  это  потомок класса

TCollectionItem, свойства которого используются для создания компонента TddgRun-Button, помещенного в компонент TddgLaunchPad. В следующих разделах рассматри

ваются важные  моменты, связанные с его созданием.

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

По теме:

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