Шаблон для создания коллекций (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;