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

  1. unit UXlsColInfo;
  2.  
  3. interface
  4. uses Classes, SysUtils, UXlsBaseRecords, UXlsBaseList, XlsMessages;
  5.  
  6. type
  7.   TColInfoDat=packed Record
  8.     FirstColumn: word;
  9.     LastColumn: word;
  10.     Width: word;
  11.     XF: word;
  12.     Options: word;
  13.     Reserved: Word;
  14.   end;
  15.   PColInfoDat=^TColInfoDat;
  16.  
  17.   TColInfo=class
  18.   public
  19.     Column: word;
  20.     Width: Word;
  21.     XF: Word;
  22.     Options: Word;
  23.  
  24.     constructor Create (const aColumn, aWidth, aXF, aOptions: word);
  25.  
  26.     function IsEqual(const aColInfo: TColInfo): boolean;
  27.   end;
  28.  
  29.   TColInfoRecord=class(TBaseRecord)
  30.     function D: TColInfoDat;
  31.   end;
  32.  
  33.   TColInfoList= class(TBaseList)  //Items are TColInfo
  34.   {$INCLUDE TColInfoListHdr.inc}
  35.   private
  36.     procedure SaveOneRecord(const i, k: integer; const DataStream: TStream);
  37.   public
  38.     procedure CopyFrom(const aColInfoList: TColInfoList);
  39.  
  40.     procedure AddRecord(const R: TColInfoRecord);
  41.     procedure SaveToStream(const DataStream: TStream);
  42.     function TotalSize: int64;
  43.   end;
  44.  
  45. implementation
  46. {$INCLUDE TColInfoListImp.inc}
  47.  
  48. { TColInfoList }
  49.  
  50. procedure TColInfoList.AddRecord(const R: TColInfoRecord);
  51. var
  52.   i: integer;
  53. begin
  54.   for i:=R.D.FirstColumn to R.D.LastColumn do
  55.     Add(TColInfo.Create(i, R.D.Width, R.D.XF, R.D.Options ));
  56.   R.Free;
  57. end;
  58.  
  59. procedure TColInfoList.CopyFrom(const aColInfoList: TColInfoList);
  60. var
  61.   i: integer;
  62. begin
  63.   Clear;
  64.   for i:=0 to aColInfoList.Count-1 do Add(TColInfo.Create(aColInfoList[i].Column, aColInfoList[i].Width, aColInfoList[i].XF, aColInfoList[i].Options));
  65. end;
  66.  
  67. procedure TColInfoList.SaveOneRecord(const i,k: integer; const DataStream: TStream);
  68. var
  69.   RecordHeader: TRecordHeader;
  70.   Info: TColInfoDat;
  71. begin
  72.   RecordHeader.Id:= xlr_COLINFO;
  73.   RecordHeader.Size:=SizeOf(TColInfoDat);
  74.   DataStream.Write(RecordHeader, SizeOf(RecordHeader));
  75.   Info.FirstColumn:=Items[i].Column;
  76.   Info.LastColumn:=Items[k].Column;
  77.   Info.Width:=Items[i].Width;
  78.   Info.XF:=Items[i].XF;
  79.   Info.Options:=Items[i].Options;
  80.   Info.Reserved:=0;
  81.   DataStream.Write(Info, SizeOf(Info));
  82. end;
  83.  
  84. procedure TColInfoList.SaveToStream(const DataStream: TStream);
  85. var
  86.   i,k: integer;
  87. begin
  88.   if not Sorted then Sort;
  89.  
  90.   //Mix similar columns
  91.   i:=0;
  92.   while i<Count do
  93.   begin
  94.     k:=i+1;
  95.     while (k<Count) and Items[i].IsEqual(Items[k]) do inc(k);
  96.     SaveOneRecord(i, k-1,DataStream);
  97.     i:=k;
  98.   end;
  99. end;
  100.  
  101. function TColInfoList.TotalSize: int64;
  102. var
  103.   i,k: integer;
  104. begin
  105.   if not Sorted then Sort;
  106.   Result:=0;
  107.   //Mix similar columns
  108.   i:=0;
  109.   while i<Count do
  110.   begin
  111.     k:=i+1;
  112.     while (k<Count) and Items[i].IsEqual(Items[k]) do inc(k);
  113.     inc(Result, SizeOf(TRecordHeader)+SizeOf(TColInfoDat));
  114.     i:=k;
  115.   end;
  116. end;
  117.  
  118. { TColInfoRecord }
  119.  
  120. function TColInfoRecord.D: TColInfoDat;
  121. begin
  122.   Result:= PColInfoDat(Data)^;
  123. end;
  124.  
  125. { TColInfo }
  126.  
  127. constructor TColInfo.Create(const aColumn, aWidth, aXF, aOptions: word);
  128. begin
  129.   inherited Create;
  130.   Column:=aColumn;
  131.   Width:=aWidth;
  132.   XF:=aXF;
  133.   Options:=aOptions;
  134. end;
  135.  
  136. function TColInfo.IsEqual(const aColInfo: TColInfo): boolean;
  137. begin
  138.   Result:= // don't compare the column .... (Column = aColInfo.Column) and
  139.            (Width  = aColInfo.Width)  and
  140.            (XF     = aColInfo.XF)     and
  141.            (Options= acolInfo.Options);
  142. end;
  143.  
  144. end.
  145.