home *** CD-ROM | disk | FTP | other *** search
- unit UXlsColInfo;
-
- interface
- uses Classes, SysUtils, UXlsBaseRecords, UXlsBaseList, XlsMessages;
-
- type
- TColInfoDat=packed Record
- FirstColumn: word;
- LastColumn: word;
- Width: word;
- XF: word;
- Options: word;
- Reserved: Word;
- end;
- PColInfoDat=^TColInfoDat;
-
- TColInfo=class
- public
- Column: word;
- Width: Word;
- XF: Word;
- Options: Word;
-
- constructor Create (const aColumn, aWidth, aXF, aOptions: word);
-
- function IsEqual(const aColInfo: TColInfo): boolean;
- end;
-
- TColInfoRecord=class(TBaseRecord)
- function D: TColInfoDat;
- end;
-
- TColInfoList= class(TBaseList) //Items are TColInfo
- {$INCLUDE TColInfoListHdr.inc}
- private
- procedure SaveOneRecord(const i, k: integer; const DataStream: TStream);
- public
- procedure CopyFrom(const aColInfoList: TColInfoList);
-
- procedure AddRecord(const R: TColInfoRecord);
- procedure SaveToStream(const DataStream: TStream);
- function TotalSize: int64;
- end;
-
- implementation
- {$INCLUDE TColInfoListImp.inc}
-
- { TColInfoList }
-
- procedure TColInfoList.AddRecord(const R: TColInfoRecord);
- var
- i: integer;
- begin
- for i:=R.D.FirstColumn to R.D.LastColumn do
- Add(TColInfo.Create(i, R.D.Width, R.D.XF, R.D.Options ));
- R.Free;
- end;
-
- procedure TColInfoList.CopyFrom(const aColInfoList: TColInfoList);
- var
- i: integer;
- begin
- Clear;
- for i:=0 to aColInfoList.Count-1 do Add(TColInfo.Create(aColInfoList[i].Column, aColInfoList[i].Width, aColInfoList[i].XF, aColInfoList[i].Options));
- end;
-
- procedure TColInfoList.SaveOneRecord(const i,k: integer; const DataStream: TStream);
- var
- RecordHeader: TRecordHeader;
- Info: TColInfoDat;
- begin
- RecordHeader.Id:= xlr_COLINFO;
- RecordHeader.Size:=SizeOf(TColInfoDat);
- DataStream.Write(RecordHeader, SizeOf(RecordHeader));
- Info.FirstColumn:=Items[i].Column;
- Info.LastColumn:=Items[k].Column;
- Info.Width:=Items[i].Width;
- Info.XF:=Items[i].XF;
- Info.Options:=Items[i].Options;
- Info.Reserved:=0;
- DataStream.Write(Info, SizeOf(Info));
- end;
-
- procedure TColInfoList.SaveToStream(const DataStream: TStream);
- var
- i,k: integer;
- begin
- if not Sorted then Sort;
-
- //Mix similar columns
- i:=0;
- while i<Count do
- begin
- k:=i+1;
- while (k<Count) and Items[i].IsEqual(Items[k]) do inc(k);
- SaveOneRecord(i, k-1,DataStream);
- i:=k;
- end;
- end;
-
- function TColInfoList.TotalSize: int64;
- var
- i,k: integer;
- begin
- if not Sorted then Sort;
- Result:=0;
- //Mix similar columns
- i:=0;
- while i<Count do
- begin
- k:=i+1;
- while (k<Count) and Items[i].IsEqual(Items[k]) do inc(k);
- inc(Result, SizeOf(TRecordHeader)+SizeOf(TColInfoDat));
- i:=k;
- end;
- end;
-
- { TColInfoRecord }
-
- function TColInfoRecord.D: TColInfoDat;
- begin
- Result:= PColInfoDat(Data)^;
- end;
-
- { TColInfo }
-
- constructor TColInfo.Create(const aColumn, aWidth, aXF, aOptions: word);
- begin
- inherited Create;
- Column:=aColumn;
- Width:=aWidth;
- XF:=aXF;
- Options:=aOptions;
- end;
-
- function TColInfo.IsEqual(const aColInfo: TColInfo): boolean;
- begin
- Result:= // don't compare the column .... (Column = aColInfo.Column) and
- (Width = aColInfo.Width) and
- (XF = aColInfo.XF) and
- (Options= acolInfo.Options);
- end;
-
- end.
-