home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 October
/
Chip_2002-10_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
FLEXCEL.ZIP
/
XLSAdapter
/
UXlsClientData.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-06-15
|
8KB
|
307 lines
unit UXlsClientData;
interface
uses classes, sysutils, UXlsBaseRecords, UXlsBaseRecordLists, UXlsOtherRecords, UXlsChart,
USST, XlsMessages, UXlsSheet, UXlsBaseClientData;
type
TMsObj = class(TBaseClientData)
private
FObjRecord: TObjRecord;
FChart: TChart;
HasPictFmla: boolean;
protected
function GetId: Word; override;
procedure SetId(const Value: Word); override;
procedure ScanRecord( myRecord: TBaseRecord);
public
procedure ArrangeId(var MaxId: word);override;
constructor Create;
destructor Destroy; override;
procedure Clear; override;
function CopyTo: TBaseClientData; override;
procedure LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST); override;
procedure SaveToStream(const DataStream: TStream); override;
function TotalSize: int64;override;
procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);override;
class function ObjRecord: ClassOfTBaseRecord; override;
end;
TTXO= class (TBaseClientData)
private
FTXO: TTXORecord;
function GetValue: WideString;
procedure SetValue(const aValue: WideString);
public
constructor Create;
destructor Destroy; override;
procedure Clear; override;
function CopyTo: TBaseClientData; override;
procedure LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST); override;
procedure SaveToStream(const DataStream: TStream); override;
function TotalSize: int64;override;
procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);override;
class function ObjRecord: ClassOfTBaseRecord; override;
property Value: WideString read GetValue write SetValue;
end;
implementation
{ TMsObj }
procedure TMsObj.Clear;
begin
FreeAndNil(FObjRecord);
FreeAndNil(FChart);
FreeAndNil(RemainingData);
end;
function TMsObj.CopyTo: TBaseClientData;
begin
if HasPictFmla then Raise Exception.Create(ErrCantCopyPictFmla);
Result:= TMsObj.Create;
(Result as TMsObj).FObjRecord:= FObjRecord.CopyTo as TObjRecord;
if FChart<>nil then (Result as TMsObj).FChart:= FChart.CopyTo as TChart;
end;
constructor TMsObj.Create;
begin
inherited;
end;
destructor TMsObj.Destroy;
begin
Clear;
inherited;
end;
procedure TMsObj.ArrangeInsert(const aPos, aCount: integer; const SheetInfo: TSheetInfo);
begin
if FChart<>nil then FChart.ArrangeInsert(aPos, aCount, SheetInfo);
end;
procedure TMsObj.LoadFromStream(const DataStream: TStream; const First: TBaseRecord; const SST: TSST);
var
RecordHeader: TRecordHeader;
R: TBaseRecord;
begin
Clear;
if ((First as TObjRecord).ObjId= ftCmo) and ((First as TObjRecord).CmoId = xlCmo_Chart) then
begin
if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
raise Exception.Create(ErrExcelInvalid);
R:=LoadRecord(DataStream, RecordHeader);
try
if not(R is TBOFRecord) then raise Exception.Create(ErrExcelInvalid);
FChart:= TChart.Create(nil);
try
FChart.LoadFromStream(DataStream, R as TBOFRecord, SST);
except
FreeAndNil(FChart);
raise
end; //except
except
FreeAndNil(R);
raise
end; //Except
end;
ScanRecord(First);
//this must be the last statment, so if there is an exception, we dont take First
FObjRecord:= First as TObjRecord;
end;
procedure TMsObj.SaveToStream(const DataStream: TStream);
begin
if FObjRecord=nil then raise Exception.Create(ErrExcelInvalid);
FObjRecord.SaveToStream(DataStream);
if FChart<>nil then FChart.SaveToStream(DataStream);
end;
function TMsObj.TotalSize: int64;
begin
if FObjRecord=nil then raise Exception.Create(ErrExcelInvalid);
Result:=FObjRecord.TotalSize;
if FChart<>nil then Result:=Result+FChart.TotalSize;
end;
class function TMsObj.ObjRecord: ClassOfTBaseRecord;
begin
Result:= TObjRecord;
end;
function TMsObj.GetId: Word;
begin
if FObjRecord<>nil then GetId:=GetWord( FObjRecord.Data, 6) else GetId:=0;
end;
procedure TMsObj.SetId(const Value: Word);
begin
if FObjRecord<>nil then SetWord( FObjRecord.Data, 6, Value);
end;
procedure TMsObj.ArrangeId(var MaxId: word);
begin
inherited;
inc(MaxId);
Id:=MaxId;
end;
procedure TMsObj.ScanRecord( myRecord: TBaseRecord);
var
RHeader: TRecordHeader;
aPos: integer;
begin
aPos:=0;
repeat
ReadMem(myRecord, aPos, SizeOf(RHeader), @RHeader);
if RHeader.Id= 9 then HasPictFmla:=true;
if (myRecord.continue=nil)and(Rheader.Size+aPos>myRecord.DataSize) then //This is not really necessary, just to avoid exceptions
begin
//Longer than expected???
RemainingData:=nil;
exit;
end;
try
ReadMem(myRecord, aPos, RHeader.Size, nil);
except
//Longer than expected???
RemainingData:=nil;
exit;
end;
until RHeader.Id=0; // ftEnd
RemainingData:=myRecord.Continue;
myRecord.Continue:=nil;
end;
{ TTXO }
procedure TTXO.ArrangeInsert(const aPos, aCount: integer;
const SheetInfo: TSheetInfo);
begin
end;
procedure TTXO.Clear;
begin
FreeAndNil(FTXO);
end;
function TTXO.CopyTo: TBaseClientData;
begin
Result:= TTXO.Create;
if FTXO <>nil then (Result as TTXO).FTXO:= FTXO.CopyTo as TTXORecord;
end;
constructor TTXO.Create;
begin
inherited;
end;
destructor TTXO.Destroy;
begin
Clear;
inherited;
end;
function TTXO.GetValue: WideString;
var
Len: integer;
s: string;
ws:Widestring;
TxtRec: TBaseRecord;
aPos: integer;
begin
Result:='';
if FTXO.Continue=nil then exit;
Len:= GetWord(FTXO.Data, 10);
if Len=0 then exit;
TxtRec:=FTXO.Continue; aPos:=1;
case FTXO.Continue.Data[0] of
0: //single byte string
begin
SetLength(s, Len);
ReadMem(TxtRec, aPos, Len, @(s[1]));
Result:=s;
end;
1: //double byte string
begin
SetLength(Ws, Len);
ReadMem(TxtRec, aPos, Len*2, @(ws[1]));
Result:=Ws;
end;
else Raise Exception.Create(ErrExcelInvalid);
end; //case
end;
procedure TTXO.LoadFromStream(const DataStream: TStream;
const First: TBaseRecord; const SST: TSST);
begin
FTXO:=First as TTXORecord;
end;
class function TTXO.ObjRecord: ClassOfTBaseRecord;
begin
Result:= TTXORecord;
end;
procedure TTXO.SaveToStream(const DataStream: TStream);
begin
if FTXO<>nil then FTXO.SaveToStream(DataStream);
end;
procedure TTXO.SetValue(const aValue: WideString);
var
Len: integer;
Dat: PArrayOfByte;
s:string;
begin
Len:=Length(aValue);
SetWord(FTXO.Data, 10, Len); //length of text
if Len>0 then SetWord(FTXO.Data, 12, 16) else SetWord(FTXO.Data, 12, 0); //length of formatting runs
FreeAndNil(FTXO.Continue);
if Len>0 then
begin
if IsWide(aValue) then
begin
GetMem(Dat, Len*2+1);
Dat[0]:=1;
move(aValue[1], Dat[1], Len*2);
FTXO.Continue:=TContinueRecord.Create(xlr_CONTINUE, Dat, Len*2+1);
end else
begin
GetMem(Dat, Len+1);
Dat[0]:=0;
s:=aValue;
move(s[1], Dat[1], Len);
FTXO.Continue:=TContinueRecord.Create(xlr_CONTINUE, Dat, Len+1);
end;
Len:= 2*8;
GetMem(Dat, Len);
FillChar(Dat^, Len, 0);
SetWord(Dat, 8, Length(aValue));
FTXO.Continue.Continue:= TContinueRecord.Create(xlr_CONTINUE, Dat, Len);
end;
end;
function TTXO.TotalSize: int64;
begin
Result:= FTXO.TotalSize;
end;
end.