home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kolekce / d567 / FLEXCEL.ZIP / XLSAdapter / XlsBaseTemplateStore.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-09-26  |  6.0 KB  |  259 lines

  1. unit XlsBaseTemplateStore;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Classes,
  7.   Contnrs,
  8.   {$IFDEF WIN32}WOLE2Stream,{$ENDIF}
  9.   {$IFDEF LINUX}KGsfStream, {$ENDIF}
  10.   XlsMessages;
  11.  
  12. type
  13.   TXlsStorageList=class;
  14.  
  15.   TXlsStorage = class
  16.   private
  17.     FCompress: boolean;
  18.     procedure SetCompress(const Value: boolean);
  19.   public
  20.     Name: string;
  21.     Data: TMemoryStream;
  22.     SubStorages: TXlsStorageList;
  23.  
  24.     property Compress: boolean read FCompress write SetCompress;
  25.  
  26.     constructor Create;
  27.     destructor Destroy;override;
  28.  
  29.     procedure WriteData(Stream: TStream);
  30.     procedure ReadData(Stream: TStream);
  31.  
  32.     procedure SaveToDoc( const DocOUT: TOle2Storage);
  33.   end;
  34.  
  35.   TXlsStorageList=class(TObjectList)
  36.   public
  37.     Compress: boolean;
  38.     procedure WriteData(Stream: TStream);
  39.     procedure ReadData(Stream: TStream);
  40.     procedure LoadFrom(const aFileName: TFileName);
  41.     procedure SaveAs(const aFileName: TFileName);
  42.   private
  43.     procedure LoadStorage(const DocIN: TOle2Storage);
  44.     function GetItems(index: integer): TXlsStorage;
  45.     function GetStream(Name: widestring): TStream;
  46.   public
  47.     property Items[index: integer]: TXlsStorage read GetItems; default;
  48.     property Stream[Name: widestring]: TStream read GetStream;
  49.   end;
  50.  
  51.  
  52.  
  53.   TXlsBaseTemplateStore = class(TComponent)
  54.   private
  55.     { Private declarations }
  56.   protected
  57.     function GetStorages(Name: string): TXlsStorageList;virtual;abstract;
  58.     { Protected declarations }
  59.   public
  60.     property Storages[Name: String]: TXlsStorageList read GetStorages;
  61.     { Public declarations }
  62.   published
  63.     { Published declarations }
  64.   end;
  65.  
  66. implementation
  67. { TXlsStorage }
  68.  
  69. constructor TXlsStorage.Create;
  70. begin
  71.   inherited Create;
  72.   Data:= TMemoryStream.Create;
  73.   SubStorages:= TXlsStorageList.Create;
  74. end;
  75.  
  76. destructor TXlsStorage.Destroy;
  77. begin
  78.   FreeandNil(Data);
  79.   FreeAndNil(SubStorages);
  80.   inherited;
  81. end;
  82.  
  83. procedure TXlsStorage.ReadData(Stream: TStream);
  84. var
  85.   Ds: integer;
  86. begin
  87.   Stream.ReadBuffer(Ds, SizeOf(Ds));
  88.   SetLength(Name, Ds);
  89.   Stream.ReadBuffer(Name[1], Ds);
  90.   Stream.ReadBuffer(Ds, SizeOf(Ds));
  91.   Data.Size:=Ds;
  92.   Data.Position:=0;
  93.   Stream.Read(Data.Memory^, Ds);
  94.   SubStorages.ReadData(Stream);
  95. end;
  96.  
  97. procedure TXlsStorage.SaveToDoc(const DocOUT: TOle2Storage);
  98. var
  99.   StreamOUT: TOle2Stream;
  100.   i:integer;
  101.   WideName: WideString;
  102. begin
  103.   WideName:=Name;
  104.   if Data.Size> 0 then
  105.   begin
  106.     StreamOUT:= TOle2Stream.Create(DocOUT, WideName);
  107.     try
  108.       StreamOUT.Write(Data.Memory^, Data.Size);
  109.     finally
  110.       FreeAndNil(StreamOut);
  111.     end;
  112.   end else
  113.   if SubStorages.Count>0 then
  114.   begin
  115.     DocOut.CdDown(WideName, true);
  116.     try
  117.       for i:=0 to SubStorages.Count-1 do (SubStorages[i] as TXlsStorage).SaveToDoc(DocOUT);
  118.     finally
  119.       DocOut.CdUp;
  120.     end;
  121.   end;
  122. end;
  123.  
  124. procedure TXlsStorage.SetCompress(const Value: boolean);
  125. begin
  126.   FCompress := Value;
  127.   SubStorages.Compress:=Value;
  128. end;
  129.  
  130. procedure TXlsStorage.WriteData(Stream: TStream);
  131. var
  132.   Ln: integer;
  133. begin
  134.   Ln:=Length(Name);
  135.   Stream.WriteBuffer(Ln, SizeOf(Ln));
  136.   Stream.WriteBuffer(Name[1], Ln);
  137.   Ln:=Data.Size;
  138.   Stream.WriteBuffer(Ln, SizeOf(Ln));
  139.   Data.Position:=0;
  140.   Stream.Write(Data.Memory^, Data.Size);
  141.   SubStorages.WriteData(Stream);
  142. end;
  143.  
  144. { TXlsStorageList }
  145.  
  146. procedure TXlsStorageList.LoadStorage(const DocIN: TOle2Storage);
  147. var
  148.   StreamIN: TOle2Stream;
  149.   Stor: TXlsStorage;
  150.   i: integer;
  151.   DirInfo: TMsOleDirInfoArray;
  152.   //PENDING: Compress: TCompressionStream;
  153.  
  154. begin
  155.   DocIN.GetDirectories(DirInfo);
  156.   for i:= Low(DirInfo) to High(DirInfo) do
  157.   begin
  158.     case DirInfo[i].OleType of
  159.       MsOLEStreamT:
  160.         begin
  161.           StreamIn:= TOle2Stream.Create( DocIN, DirInfo[i].Name);
  162.           try
  163.             Stor:=(Items[Add(TXlsStorage.Create)] as TXlsStorage);
  164. //          Compress:= TCompressionStream.Create(clMax, Stor.Data);
  165.             try
  166. //            Compress.CopyFrom(OleStreamIn, OleStreamIn.Size);
  167.               Stor.Data.CopyFrom(StreamIn, StreamIn.Size);
  168.               finally
  169. //              FreeAndNil(Compress);
  170.             end; //finally
  171.             Stor.Name:=DirInfo[i].Name;
  172.           finally
  173.             FreeAndNil(StreamIn);
  174.           end; //finally
  175.         end;
  176.  
  177.       MsOLEStorageT:
  178.         begin
  179.           DocIN.CDDown(DirInfo[i].Name, False);
  180.           try
  181.             Stor:=(Items[Add(TXlsStorage.Create)] as TXlsStorage);
  182.             Stor.Name:=DirInfo[i].Name;
  183.             Stor.SubStorages.LoadStorage(DocIN);
  184.           finally
  185.             DocIN.CdUp;
  186.           end; //finally
  187.         end;
  188.     end; //case
  189.   end; //for
  190.  
  191. end;
  192.  
  193. procedure TXlsStorageList.LoadFrom(const aFileName: TFileName);
  194. var
  195.   DocIN: TOle2Storage;
  196. begin
  197.   Clear;
  198.  
  199.   //Open template
  200.   DocIN:= TOle2Storage.Create(aFileName, Ole2_Read);
  201.   try
  202.     LoadStorage(DocIN);
  203.   finally
  204.     FreeAndNil(DocIN);
  205.   end;
  206. end;
  207.  
  208. procedure TXlsStorageList.ReadData(Stream: TStream);
  209. var
  210.   Cnt, i: integer;
  211. begin
  212.   Stream.Read(Cnt, sizeOf(Cnt));
  213.   Clear;
  214.   for i:=0 to Cnt-1 do
  215.    (Items[Add(TXlsStorage.Create)]as TXlsStorage).ReadData(Stream);
  216. end;
  217.  
  218. procedure TXlsStorageList.WriteData(Stream: TStream);
  219. var
  220.   i:integer;
  221. begin
  222.   Stream.Write(Count, SizeOf(Count));
  223.   for i:=0 to Count-1 do
  224.    (Items[i]as TXlsStorage).WriteData(Stream);
  225. end;
  226.  
  227. function TXlsStorageList.GetItems(index: integer): TXlsStorage;
  228. begin
  229.   Result:=inherited Items[index] as TXlsStorage;
  230. end;
  231.  
  232. function TXlsStorageList.GetStream(Name: widestring): TStream;
  233. var
  234.   i:integer;
  235. begin
  236.   for i:=0 to Count-1 do if Items[i].Name=Name then
  237.   begin
  238.     Result:= Items[i].Data;
  239.     exit;
  240.   end;
  241.   raise Exception.CreateFmt(ErrStreamNotFound,[Name]);
  242. end;
  243.  
  244. procedure TXlsStorageList.SaveAs(const aFileName: TFileName);
  245. var
  246.   DocOUT: TOle2Storage;
  247.   i: integer;
  248. begin
  249.   //Create template
  250.   DocOut:=TOle2Storage.Create(aFileName, Ole2_Write);
  251.   try
  252.     for i:=0 to Count-1 do Items[i].SaveToDoc(DocOUT);
  253.   finally
  254.     FreeAndNil(DocOUT);
  255.   end;
  256. end;
  257.  
  258. end.
  259.