Поиск по этому блогу

понедельник, 17 октября 2011 г.

Шаблон для создания коллекций

Шаблон для создания коллекций (TCollection) в Delphi


unit GroupCollection;

interface

uses SysUtils, Classes;

type
TOlapType = (oUnknow,oDimCol,oDimRow,oFact,oAgg); // тип
// элементы
TGrpItem = class;
TGrpItemClass = class of TGrpItem;
// коллекция упреждающее объявление
TGrpCollection = class;
TGrpCollectionClass = class of TGrpCollection;


// элементы группы
TGrpItem = class(TCollectionItem)
private
FFactCol: Integer;
FOlapType: TOlapType;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
end;


TGrpCollection = class(TCollection)
private
//FOwnerObject: TObject; // или Tcomponent ...

function GetItem(Index: Integer): TGrpItem;
procedure SetItem(Index: Integer; const Value: TGrpItem);
public
//constructor Create;
constructor Create(OwnerObject: TObject);
function Add: TGrpItem;
property Items[Index: Integer]: TGrpItem read GetItem write SetItem; default;
end;


implementation

{ TGrpItem элемент коллекции }

constructor TGrpItem.Create(Collection: TCollection);
begin
//inherited;
inherited Create(Collection);
end;

destructor TGrpItem.Destroy;
begin

inherited;
end;

{ TGrpCollection сама коллекция}

function TGrpCollection.Add: TGrpItem;
begin
// Вызываем метод предка Add и результат приводим к TGrpItem
Result := (inherited Add) as TGrpItem; // или так TGrpItem(inherited Add);
end;

constructor TGrpCollection.Create(OwnerObject: TObject);
begin
// Создаем коллекцию
inherited Create(TGrpItem);
//FOwnerObject := OwnerObject; //

end;

function TGrpCollection.GetItem(Index: Integer): TGrpItem;
begin
// Получить элемент
Result := (inherited GetItem(index)) as TGrpItem;
end;

procedure TGrpCollection.SetItem(Index: Integer; const Value: TGrpItem);
begin
inherited SetItem(Index, Value);// Установить значение
end;

end.

Создание коллекции
var RowDims: TGrpCollection;
RowDims := TGrpCollection.Create(nil);

Добавление элемента в коллекцию
var It: TGrpItem;
It := RowDims.Add

Освобождение
RowDims.Free;

Стандартные свойства, методы элементов коллекций
TCollectionItem = class(TPersistent)
ID уникальное свойство ID, этот номер не повторяется даже если удалить элемент
Index - порядковый номер
Collection: TCollection - экземпляр класса коллекции, к которой принадлежит элемент

TCollection = class(TPersistent)
Count - число элементов
TCollectionItemClass = class of TCollectionItem;
FItemClass: TCollectionItemClass; - класс-наследник TCollectionItem, экземпляры которого собраны в коллекцию

function Owner: TPersistent; // владелец коллекции

// управление элементами коллекции
property Items[Index: Integer]: TCollectionItem - элемент коллекции
function Add: TCollectionItem;
function Insert(Index: Integer): TCollectionItem;
procedure Delete(Index: Integer);
function FindItemID(ID: Integer): TCollectionItem;
procedure Clear;