home *** CD-ROM | disk | FTP | other *** search
- 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.
-