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

  1. unit UXlsClientData;
  2.  
  3. interface
  4. uses Classes, SysUtils, UXlsBaseRecords, UXlsBaseRecordLists, UXlsOtherRecords, UXlsChart,
  5.      UXlsSST, XlsMessages, UXlsSheet, UXlsBaseClientData;
  6. type
  7.   TMsObj = class(TBaseClientData)
  8.   private
  9.     FObjRecord: TObjRecord;
  10.     FChart: TChart;
  11.     HasPictFmla: boolean;
  12.   protected
  13.     function GetId: Word; override;
  14.     procedure SetId(const Value: Word); override;
  15.     procedure ScanRecord( myRecord: TBaseRecord);
  16.   public
  17.     procedure  ArrangeId(var MaxId: word);override;
  18.  
  19.     constructor Create;
  20.     destructor Destroy; override;
  21.     procedure Clear; override;
  22.     function CopyTo: TBaseClientData; override;
  23.     procedure LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST); override;
  24.     procedure SaveToStream(const DataStream: TStream); override;
  25.     function TotalSize: int64;override;
  26.  
  27.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);override;
  28.     procedure ArrangeCopySheet(const SheetInfo: TSheetInfo);override;
  29.  
  30.     class function ObjRecord: ClassOfTBaseRecord; override;
  31.  
  32.   end;
  33.  
  34.   TTXO= class (TBaseClientData)
  35.   private
  36.     FTXO: TTXORecord;
  37.     function GetValue: WideString;
  38.     procedure SetValue(const aValue: WideString);
  39.   public
  40.     constructor Create;
  41.     destructor Destroy; override;
  42.     procedure Clear; override;
  43.     function CopyTo: TBaseClientData; override;
  44.     procedure LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST); override;
  45.     procedure SaveToStream(const DataStream: TStream); override;
  46.     function TotalSize: int64;override;
  47.  
  48.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);override;
  49.     procedure ArrangeCopySheet(const SheetInfo: TSheetInfo);override;
  50.     class function ObjRecord: ClassOfTBaseRecord; override;
  51.  
  52.     property Value: WideString read GetValue write SetValue;
  53.   end;
  54.  
  55. implementation
  56.  
  57. { TMsObj }
  58.  
  59. procedure TMsObj.Clear;
  60. begin
  61.   FreeAndNil(FObjRecord);
  62.   FreeAndNil(FChart);
  63.   FreeAndNil(RemainingData);
  64. end;
  65.  
  66. function TMsObj.CopyTo: TBaseClientData;
  67. begin
  68.   if HasPictFmla then Raise Exception.Create(ErrCantCopyPictFmla);
  69.   Result:= TMsObj.Create;
  70.   (Result as TMsObj).FObjRecord:= FObjRecord.CopyTo as TObjRecord;
  71.   if FChart<>nil then (Result as TMsObj).FChart:= FChart.CopyTo as TChart;
  72. end;
  73.  
  74. constructor TMsObj.Create;
  75. begin
  76.   inherited;
  77. end;
  78.  
  79. destructor TMsObj.Destroy;
  80. begin
  81.   Clear;
  82.   inherited;
  83. end;
  84.  
  85. procedure TMsObj.ArrangeInsert(const aPos, aCount: integer; const SheetInfo: TSheetInfo);
  86. begin
  87.   if FChart<>nil then FChart.ArrangeInsert(aPos, aCount, SheetInfo);
  88. end;
  89.  
  90. procedure TMsObj.ArrangeCopySheet(const SheetInfo: TSheetInfo);
  91. begin
  92.   if FChart<>nil then FChart.ArrangeCopySheet(SheetInfo);
  93. end;
  94.  
  95.  
  96. procedure TMsObj.LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST);
  97. var
  98.   RecordHeader: TRecordHeader;
  99.   R: TBaseRecord;
  100. begin
  101.   Clear;
  102.   if ((First as TObjRecord).ObjId= ftCmo) and ((First as TObjRecord).CmoId = xlCmo_Chart) then
  103.   begin
  104.     if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
  105.        raise Exception.Create(ErrExcelInvalid);
  106.     R:=LoadRecord(DataStream, RecordHeader);
  107.     try
  108.       if not(R is TBOFRecord) then raise Exception.Create(ErrExcelInvalid);
  109.       FChart:= TChart.Create(nil);
  110.       try
  111.         FChart.LoadFromStream(DataStream, R as TBOFRecord, SST);
  112.       except
  113.         FreeAndNil(FChart);
  114.         raise
  115.       end; //except
  116.     except
  117.       FreeAndNil(R);
  118.       raise
  119.     end; //Except
  120.   end;
  121.  
  122.   ScanRecord(First);
  123.  
  124.   //this must be the last statment, so if there is an exception, we dont take First
  125.   FObjRecord:= First as TObjRecord;
  126.  
  127. end;
  128.  
  129. procedure TMsObj.SaveToStream(const DataStream: TStream);
  130. begin
  131.   if FObjRecord=nil then raise Exception.Create(ErrExcelInvalid);
  132.   FObjRecord.SaveToStream(DataStream);
  133.   if FChart<>nil then FChart.SaveToStream(DataStream);
  134. end;
  135.  
  136. function TMsObj.TotalSize: int64;
  137. begin
  138.   if FObjRecord=nil then raise Exception.Create(ErrExcelInvalid);
  139.   Result:=FObjRecord.TotalSize;
  140.   if FChart<>nil then Result:=Result+FChart.TotalSize;
  141. end;
  142.  
  143.  
  144.  
  145. class function TMsObj.ObjRecord: ClassOfTBaseRecord;
  146. begin
  147.   Result:= TObjRecord;
  148. end;
  149.  
  150. function TMsObj.GetId: Word;
  151. begin
  152.   if FObjRecord<>nil then GetId:=GetWord( FObjRecord.Data, 6) else GetId:=0;
  153. end;
  154.  
  155. procedure TMsObj.SetId(const Value: Word);
  156. begin
  157.   if FObjRecord<>nil then SetWord( FObjRecord.Data, 6, Value);
  158. end;
  159.  
  160. procedure TMsObj.ArrangeId(var MaxId: word);
  161. begin
  162.   inherited;
  163.   inc(MaxId);
  164.   Id:=MaxId;
  165. end;
  166.  
  167. procedure TMsObj.ScanRecord( myRecord: TBaseRecord);
  168. var
  169.   RHeader: TRecordHeader;
  170.   aPos: integer;
  171. begin
  172.   aPos:=0;
  173.   repeat
  174.     ReadMem(myRecord, aPos, SizeOf(RHeader), @RHeader);
  175.     if RHeader.Id= 9 then HasPictFmla:=true;
  176.     if (Rheader.Size+aPos>myRecord.DataSize) then //This shouldn't be really necessary, but Obj records sometimes don't count right. So, we have to ensure all is in the same Obj record. I assume there are no continues here.
  177.     begin
  178.       //Longer than expected???
  179.       RemainingData:=myRecord.Continue;
  180.       MyRecord.Continue:=nil;
  181.       exit;
  182.     end;
  183.  
  184.     try
  185.       ReadMem(myRecord, aPos, RHeader.Size, nil);
  186.     except
  187.       //Longer than expected???
  188.       RemainingData:=nil;
  189.       exit;
  190.     end;
  191.  
  192.   until RHeader.Id=0; // ftEnd
  193.   RemainingData:=myRecord.Continue;
  194.   myRecord.Continue:=nil;
  195. end;
  196.  
  197. { TTXO }
  198.  
  199. procedure TTXO.ArrangeCopySheet(const SheetInfo: TSheetInfo);
  200. begin
  201.   //nothing
  202. end;
  203.  
  204. procedure TTXO.ArrangeInsert(const aPos, aCount: integer;
  205.   const SheetInfo: TSheetInfo);
  206. begin
  207. end;
  208.  
  209. procedure TTXO.Clear;
  210. begin
  211.   FreeAndNil(FTXO);
  212. end;
  213.  
  214. function TTXO.CopyTo: TBaseClientData;
  215. begin
  216.   Result:= TTXO.Create;
  217.   if FTXO <>nil then (Result as TTXO).FTXO:= FTXO.CopyTo as TTXORecord;
  218. end;
  219.  
  220. constructor TTXO.Create;
  221. begin
  222.   inherited;
  223. end;
  224.  
  225. destructor TTXO.Destroy;
  226. begin
  227.   Clear;
  228.   inherited;
  229. end;
  230.  
  231. function TTXO.GetValue: WideString;
  232. var
  233.   Len: integer;
  234.   s: string;
  235.   ws:Widestring;
  236.   TxtRec: TBaseRecord;
  237.   aPos: integer;
  238. begin
  239.   Result:='';
  240.   if FTXO.Continue=nil then exit;
  241.   Len:= GetWord(FTXO.Data, 10);
  242.   if Len=0 then exit;
  243.  
  244.   TxtRec:=FTXO.Continue; aPos:=1;
  245.   case FTXO.Continue.Data[0] of
  246.     0:  //single byte string
  247.     begin
  248.       SetLength(s, Len);
  249.       ReadMem(TxtRec, aPos, Len, @(s[1]));
  250.       Result:=s;
  251.     end;
  252.     1:  //double byte string
  253.     begin
  254.       SetLength(Ws, Len);
  255.       ReadMem(TxtRec, aPos, Len*2, @(ws[1]));
  256.       Result:=Ws;
  257.     end;
  258.     else Raise Exception.Create(ErrExcelInvalid);
  259.   end; //case
  260. end;
  261.  
  262. procedure TTXO.LoadFromStream(const DataStream: TStream;
  263.   const First: TBaseRecord; const SST: TSST);
  264. begin
  265.   FTXO:=First as TTXORecord;
  266. end;
  267.  
  268. class function TTXO.ObjRecord: ClassOfTBaseRecord;
  269. begin
  270.   Result:= TTXORecord;
  271. end;
  272.  
  273. procedure TTXO.SaveToStream(const DataStream: TStream);
  274. begin
  275.   if FTXO<>nil then FTXO.SaveToStream(DataStream);
  276. end;
  277.  
  278. procedure TTXO.SetValue(const aValue: WideString);
  279. var
  280.   Len: integer;
  281.   Dat: PArrayOfByte;
  282.   s:string;
  283. begin
  284.   Len:=Length(aValue);
  285.   SetWord(FTXO.Data, 10, Len); //length of text
  286.   if Len>0 then SetWord(FTXO.Data, 12, 16) else SetWord(FTXO.Data, 12, 0); //length of formatting runs
  287.   FreeAndNil(FTXO.Continue);
  288.   if Len>0 then
  289.   begin
  290.     if IsWide(aValue) then
  291.       begin
  292.         GetMem(Dat, Len*2+1);
  293.         Dat[0]:=1;
  294.         move(aValue[1], Dat[1], Len*2);
  295.         FTXO.Continue:=TContinueRecord.Create(xlr_CONTINUE, Dat, Len*2+1);
  296.       end else
  297.       begin
  298.         GetMem(Dat, Len+1);
  299.         Dat[0]:=0;
  300.         s:=aValue;
  301.         move(s[1], Dat[1], Len);
  302.         FTXO.Continue:=TContinueRecord.Create(xlr_CONTINUE, Dat, Len+1);
  303.       end;
  304.  
  305.       Len:= 2*8;
  306.       GetMem(Dat, Len);
  307.       FillChar(Dat^, Len, 0);
  308.       SetWord(Dat, 8, Length(aValue));
  309.  
  310.       FTXO.Continue.Continue:= TContinueRecord.Create(xlr_CONTINUE, Dat, Len);
  311.   end;
  312.  
  313. end;
  314.  
  315. function TTXO.TotalSize: int64;
  316. begin
  317.   Result:= FTXO.TotalSize;
  318. end;
  319.  
  320. end.
  321.