unit _MetaManager; interface uses _MetaTypes; type TMetaManager = class protected FFiles: array of TResource; FRoot: TExtensions; FConnectionID: Integer; FDataAccess: TObject; function GetFileCount: Integer; function GetFileById(Id: Integer): TResource; private public constructor Create(ConnectionID: Integer; DataAccess: TObject); procedure InitFile(id: Integer); procedure InitFileFields(id: Integer); property Root: TExtensions read FRoot; property FileCount: Integer read GetFileCount; property FileById[Id: Integer]: TResource read GetFileById; end; implementation uses Classes, ConnectionManager, Access_OniArchive, TypeDefs, Dialogs, SysUtils, StrUtils, DataAccess, _Extensions; { TFileManager } constructor TMetaManager.Create(ConnectionID: Integer; DataAccess: TObject); begin FConnectionID := ConnectionID; FDataAccess := DataAccess; SetLength(FFiles, TDataAccess(DataAccess).GetFileCount); FRoot := TExtensions.Create(DataAccess, ConnectionID); end; function TMetaManager.GetFileById(Id: Integer): TResource; begin InitFile(Id); Result := FFiles[Id]; end; function TMetaManager.GetFileCount: Integer; begin Result := Length(FFiles); end; procedure TMetaManager.InitFile(id: Integer); var typei: Integer; finfo: TFileInfo; begin if id < ConManager.Connection[FConnectionID].GetFileCount then begin if not Assigned(FFiles[id]) then begin finfo := ConManager.Connection[FConnectionID].GetFileInfo(id); if finfo.Size > 0 then begin for typei := 0 to High(ResourceDescs) do begin if ResourceDescs[typei].ext = finfo.Extension then begin FFiles[id] := TResourceClass(ResourceDescs[typei].ftype).Create(FConnectionID, id); Break; end; end; if typei > High(ResourceDescs) then FFiles[id] := TFile_Empty.Create(FConnectionID, id); end else FFiles[id] := TFile_Empty.Create(FConnectionID, id); Exit; end; end; end; procedure TMetaManager.InitFileFields(id: Integer); begin if id < ConManager.Connection[FConnectionID].GetFileCount then begin if not Assigned(FFiles[id]) then begin InitFile(id); if not (FFiles[id] is TFile_Empty) then FFiles[id].InitDataFields; end; end; end; end.