home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 October
/
Chip_2002-10_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
FLEXCEL.ZIP
/
BiffEdit
/
UEscherEdit.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-05-12
|
5KB
|
159 lines
unit UEscherEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ImgList, ActnList, ComCtrls, StdCtrls, ToolWin,
ExtCtrls, URecordEdit, UBiffEditUtil, UEscherUtil, UWaitCursor, UBiffData;
type
TEscherEdit = class(TRecordEdit)
ActionOk: TAction;
ActionCancel: TAction;
PanelVersion: TPanel;
Label1: TLabel;
edInstance: TEdit;
Label2: TLabel;
edSize: TEdit;
procedure FormCreate(Sender: TObject);
procedure ActionOkExecute(Sender: TObject);
procedure ActionCancelExecute(Sender: TObject);
procedure ActionEditExecute(Sender: TObject);
procedure ListRecordsGetImageIndex(Sender: TObject; Item: TListItem);
private
EscherEdit: TEscherEdit;
{ Private declarations }
protected
function GetIdName(const Id: word): string;override;
public
procedure Load(const HexData: string; const Instance: word; const size: cardinal);
function HexData: string;
{ Public declarations }
end;
implementation
{$R *.DFM}
procedure TEscherEdit.FormCreate(Sender: TObject);
begin
inherited;
SearchDialog.IdName.Text:='';
SearchDialog.Edit1.Text:='';
btnOpen.Action:=ActionOk;
btnSaveAs.Action:=ActionCancel;
IsBiff:=false;
end;
procedure TEscherEdit.ActionOkExecute(Sender: TObject);
begin
ModalResult:=mrOk;
end;
procedure TEscherEdit.ActionCancelExecute(Sender: TObject);
begin
ModalResult:=mrCancel;
end;
procedure TEscherEdit.Load(const HexData: string; const Instance: word; const size: cardinal);
var
RecordHeader: TEscherRecordHeader;
s:string;
StreamPos: int64;
DataRec: PRecord;
WaitCursor: IWaitCursor;
Data: string;
begin
WaitCursor:=TWaitCursor.Create;
StreamPos:=0;
Data:=HexToStr(HexData, (Length(HexData)-1) div 3 +1);
DataRecords.Clear;
edHex.Text:= '';
edInstance.Text:=Format('%x',[Instance]);
edSize.Text:=IntToStr(Size);
UpdateRecordCount;
while StreamPos+SizeOf(RecordHeader)<=Length(Data) do
begin
System.Move(Data[StreamPos+1], RecordHeader, SizeOf(RecordHeader));
New(DataRec);
try
DataRec.Id:=RecordHeader.Id;
DataRec.IdName:= GetEscherIdName(DataRec.Id);
DataRec.Version:=RecordHeader.Instance;
DataRec.Size:=RecordHeader.Size;
DataRec.Offset:=StreamPos;
if (StreamPos+SizeOf(RecordHeader)+RecordHeader.Size>Length(Data)) then
RecordHeader.Size:=Length(Data)-(StreamPos+SizeOf(RecordHeader));
s:=copy(Data, StreamPos+1+SizeOf(RecordHeader), RecordHeader.Size);
DataRec.Data:=SkipZero(s);
DataRec.HexData:=StrToHex(s);
DataRecords.Add(DataRec);
except
Dispose(DataRec);
DataRecords.Clear;
raise;
end; //Except
StreamPos:=StreamPos+SizeOf(RecordHeader)+ RecordHeader.Size;
end; //while
UpdateRecordCount;
end;
procedure TEscherEdit.ActionEditExecute(Sender: TObject);
var
index: integer;
s: string;
begin
if ListRecords.Selected= nil then exit;
Index:=ListRecords.Selected.Index;
if (DataRecords[Index].Version and $F) = $F then
begin
//Container
if EscherEdit=nil then EscherEdit:=TEscherEdit.Create(Self);
EscherEdit.Caption:=Caption+'\'+Trim(ListRecords.Selected.Caption);
EscherEdit.Load(DataRecords[Index].HexData, DataRecords[Index].Version, DataRecords[Index].Size);
if EscherEdit.ShowModal = mrOk then
begin
s:=HexToStr(EscherEdit.HexData, (Length(EscherEdit.HexData)-1) div 3 +1);
DataRecords[Index].Size:= StrToInt64(EscherEdit.edSize.Text);;
DataRecords[Index].Version:= StrToInt('$'+EscherEdit.edInstance.Text);
DataRecords[Index].HexData:= EscherEdit.HexData;
DataRecords[Index].Data:= SkipZero(s);
ListRecordsSelectItem( Self, ListRecords.Selected, true);
FixStreamOffsets(ListRecords.Selected.Index-1);
end;
end else inherited;
end;
procedure TEscherEdit.ListRecordsGetImageIndex(Sender: TObject;
Item: TListItem);
begin
if (Item<>nil) and ((DataRecords[Item.Index].Version and $F) = $F) then
Item.ImageIndex:=0 else Item.ImageIndex:=-1;
end;
function TEscherEdit.GetIdName(const Id: word): string;
begin
GetIdName:=GetEscherIdName(Id);
end;
function TEscherEdit.HexData: string;
var
i: integer;
begin
Result:='';
for i:= 0 to DataRecords.Count -1 do Result:=Result+ Format('%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %s',
[lo(DataRecords[i].Version), hi(DataRecords[i].Version),
lo(DataRecords[i].Id), hi(DataRecords[i].Id),
lo(DataRecords[i].Size and $FFFF), hi(DataRecords[i].Size and $FFFF),
lo(DataRecords[i].Size shr 16), hi(DataRecords[i].Size shr 16) ,
DataRecords[i].HexData]);
end;
end.