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

  1. unit UXlsPageBreaks;
  2.  
  3. interface
  4. uses UXlsBaseRecords, UXlsBaseList, XlsMessages, Classes, SysUtils;
  5.  
  6. type
  7.   TBreakData= Packed Record
  8.     Row: Word;
  9.     Col1: Word;
  10.     Col2: Word;
  11.   end;
  12.  
  13.   THPageBreakRecord = class (TBaseRecord)
  14.   public
  15.     function Count: Word;
  16.     function BreakData(const index: integer): TBreakData;
  17.   end;
  18.  
  19.   TPageBreak=class
  20.   public
  21.     BreakData: TBreakData;
  22.  
  23.     constructor Create(const aBreakData: TBreakData);
  24.     function CopyTo: TPageBreak;
  25.   end;
  26.  
  27.   TPageBreakList= class (TBaseList)
  28.   {$INCLUDE TPageBreakListHdr.inc}
  29.   public
  30.     procedure AddRecord(const aRecord: THPageBreakRecord);
  31.     procedure AddBreak(const aRow: Longint);
  32.     procedure CopyFrom(const aBreakList: TPageBreakList);
  33.     procedure SaveToStream(const DataStream: TStream);
  34.     function TotalSize: int64;
  35.  
  36.     procedure InsertRows(const DestRow: integer; const aCount: integer);
  37.     procedure DeleteRows(const DestRow: integer; const aCount: integer);
  38.   end;
  39.  
  40. implementation
  41. {$INCLUDE TPageBreakListImp.inc}
  42.  
  43. { THPageBreakRecord }
  44.  
  45. function THPageBreakRecord.BreakData(const index: integer): TBreakData;
  46. begin
  47.   Move(Data[2+index*SizeOf(TBreakData)],Result, SizeOf(TBreakData));
  48. end;
  49.  
  50. function THPageBreakRecord.Count: Word;
  51. begin
  52.   Result:= GetWord(Data, 0);
  53. end;
  54.  
  55. { TPageBreak }
  56.  
  57. function TPageBreak.CopyTo: TPageBreak;
  58. begin
  59.   Result:= TPageBreak.Create(BreakData);
  60. end;
  61.  
  62. constructor TPageBreak.Create(const aBreakData: TBreakData);
  63. begin
  64.   inherited Create;
  65.   BreakData:= aBreakData;
  66. end;
  67.  
  68. { TPageBreakList }
  69.  
  70. procedure TPageBreakList.AddBreak(const aRow: Integer);
  71. var
  72.   Index: integer;
  73.   BreakData: TBreakData;
  74. begin
  75.   BreakData.Row:=aRow;
  76.   BreakData.Col1:=0;
  77.   BreakData.Col2:=$FF;
  78.   if Count>MaxHPageBreaks then raise Exception.Create(ErrTooManyPageBreaks);
  79.   if not Find(aRow, Index) then Insert(Index, TPageBreak.Create(BreakData));
  80. end;
  81.  
  82. procedure TPageBreakList.AddRecord(const aRecord: THPageBreakRecord);
  83. var
  84.   i, Index: integer;
  85. begin
  86.   for i:=0 to aRecord.Count - 1 do
  87.     if not Find(aRecord.BreakData(i).Row, Index) then Insert(Index, TPageBreak.Create(aRecord.BreakData(i)));
  88.   aRecord.Free;
  89. end;
  90.  
  91. procedure TPageBreakList.CopyFrom(const aBreakList: TPageBreakList);
  92. var
  93.   i:integer;
  94. begin
  95.   if aBreakList=nil then exit;
  96.   for i:=0 to aBreakList.Count-1 do Add(aBreakList[i].CopyTo);
  97. end;
  98.  
  99.  
  100. procedure TPageBreakList.DeleteRows(const DestRow, aCount: integer);
  101. var
  102.   Index: integer;
  103.   i: integer;
  104. begin
  105.   Find(DestRow, Index);
  106.   for i:=Count-1 downto Index do
  107.     if Items[i].BreakData.Row<DestRow+aCount then Delete(i) else dec(Items[i].BreakData.Row, aCount);
  108. end;
  109.  
  110. procedure TPageBreakList.InsertRows(const DestRow, aCount: integer);
  111. var
  112.   Index: integer;
  113.   i: integer;
  114. begin
  115.   Find(DestRow, Index);
  116.   for i:=Index to Count-1 do IncMax(Items[i].BreakData.Row, aCount, $FFFF);
  117. end;
  118.  
  119. procedure TPageBreakList.SaveToStream(const DataStream: TStream);
  120. var
  121.   RecordHeader: TRecordHeader;
  122.   i: integer;
  123.   MyCount: word;
  124. begin
  125.   if Count > 0 then
  126.   begin
  127.     Sort; //Just in case...
  128.     RecordHeader.Id:= xlr_HORIZONTALPAGEBREAKS;
  129.     RecordHeader.Size:= SizeOf(MyCount)+Count*SizeOf(TBreakData);
  130.  
  131.     MyCount:=Count;
  132.     if DataStream.Write(RecordHeader, Sizeof(RecordHeader)) <> Sizeof(RecordHeader) then raise Exception.Create(ErrCantWrite);
  133.     if DataStream.Write(MyCount, Sizeof(MyCount)) <> Sizeof(MyCount) then raise Exception.Create(ErrCantWrite);
  134.     for i:=0 to Count-1 do
  135.     begin
  136.       if DataStream.Write(Items[i].BreakData, SizeOf(Items[i].BreakData)) <> SizeOf(Items[i].BreakData) then
  137.         raise Exception.Create(ErrCantWrite);
  138.     end;
  139.   end;
  140. end;
  141.  
  142. function TPageBreakList.TotalSize: int64;
  143. begin
  144.   if Count=0 then Result:=0
  145.   else Result:=sizeOf(TRecordHeader)+SizeOf(Word)+Count*SizeOf(TBreakData);
  146. end;
  147.  
  148. end.
  149.