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 >
Pascal/Delphi Source File  |  2002-05-12  |  5KB  |  159 lines

  1. unit UEscherEdit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Menus, ImgList, ActnList, ComCtrls, StdCtrls, ToolWin,
  8.   ExtCtrls, URecordEdit, UBiffEditUtil, UEscherUtil, UWaitCursor, UBiffData;
  9.  
  10. type
  11.   TEscherEdit = class(TRecordEdit)
  12.     ActionOk: TAction;
  13.     ActionCancel: TAction;
  14.     PanelVersion: TPanel;
  15.     Label1: TLabel;
  16.     edInstance: TEdit;
  17.     Label2: TLabel;
  18.     edSize: TEdit;
  19.     procedure FormCreate(Sender: TObject);
  20.     procedure ActionOkExecute(Sender: TObject);
  21.     procedure ActionCancelExecute(Sender: TObject);
  22.     procedure ActionEditExecute(Sender: TObject);
  23.     procedure ListRecordsGetImageIndex(Sender: TObject; Item: TListItem);
  24.   private
  25.     EscherEdit: TEscherEdit;
  26.     { Private declarations }
  27.   protected
  28.     function GetIdName(const Id: word): string;override;
  29.   public
  30.     procedure Load(const HexData: string; const Instance: word; const size: cardinal);
  31.     function HexData: string;
  32.     { Public declarations }
  33.   end;
  34.  
  35. implementation
  36.  
  37. {$R *.DFM}
  38.  
  39. procedure TEscherEdit.FormCreate(Sender: TObject);
  40. begin
  41.   inherited;
  42.   SearchDialog.IdName.Text:='';
  43.   SearchDialog.Edit1.Text:='';
  44.   btnOpen.Action:=ActionOk;
  45.   btnSaveAs.Action:=ActionCancel;
  46.   IsBiff:=false;
  47. end;
  48.  
  49. procedure TEscherEdit.ActionOkExecute(Sender: TObject);
  50. begin
  51.   ModalResult:=mrOk;
  52. end;
  53.  
  54. procedure TEscherEdit.ActionCancelExecute(Sender: TObject);
  55. begin
  56.   ModalResult:=mrCancel;
  57. end;
  58.  
  59. procedure TEscherEdit.Load(const HexData: string; const Instance: word; const size: cardinal);
  60. var
  61.   RecordHeader: TEscherRecordHeader;
  62.   s:string;
  63.   StreamPos: int64;
  64.   DataRec: PRecord;
  65.   WaitCursor: IWaitCursor;
  66.   Data: string;
  67. begin
  68.   WaitCursor:=TWaitCursor.Create;
  69.   StreamPos:=0;
  70.   Data:=HexToStr(HexData, (Length(HexData)-1) div 3 +1);
  71.  
  72.   DataRecords.Clear;
  73.   edHex.Text:= '';
  74.   edInstance.Text:=Format('%x',[Instance]);
  75.   edSize.Text:=IntToStr(Size);
  76.   UpdateRecordCount;
  77.   while StreamPos+SizeOf(RecordHeader)<=Length(Data) do
  78.   begin
  79.     System.Move(Data[StreamPos+1], RecordHeader, SizeOf(RecordHeader));
  80.     New(DataRec);
  81.     try
  82.       DataRec.Id:=RecordHeader.Id;
  83.       DataRec.IdName:= GetEscherIdName(DataRec.Id);
  84.       DataRec.Version:=RecordHeader.Instance;
  85.       DataRec.Size:=RecordHeader.Size;
  86.       DataRec.Offset:=StreamPos;
  87.  
  88.       if (StreamPos+SizeOf(RecordHeader)+RecordHeader.Size>Length(Data)) then
  89.         RecordHeader.Size:=Length(Data)-(StreamPos+SizeOf(RecordHeader));
  90.       s:=copy(Data, StreamPos+1+SizeOf(RecordHeader), RecordHeader.Size);
  91.       DataRec.Data:=SkipZero(s);
  92.       DataRec.HexData:=StrToHex(s);
  93.  
  94.       DataRecords.Add(DataRec);
  95.     except
  96.       Dispose(DataRec);
  97.       DataRecords.Clear;
  98.       raise;
  99.     end; //Except
  100.     StreamPos:=StreamPos+SizeOf(RecordHeader)+ RecordHeader.Size;
  101.   end; //while
  102.   UpdateRecordCount;
  103. end;
  104.  
  105. procedure TEscherEdit.ActionEditExecute(Sender: TObject);
  106. var
  107.   index: integer;
  108.   s: string;
  109. begin
  110.   if ListRecords.Selected= nil then exit;
  111.   Index:=ListRecords.Selected.Index;
  112.   if (DataRecords[Index].Version and $F) = $F then
  113.   begin
  114.     //Container
  115.     if EscherEdit=nil then EscherEdit:=TEscherEdit.Create(Self);
  116.     EscherEdit.Caption:=Caption+'\'+Trim(ListRecords.Selected.Caption);
  117.     EscherEdit.Load(DataRecords[Index].HexData, DataRecords[Index].Version, DataRecords[Index].Size);
  118.     if EscherEdit.ShowModal = mrOk then
  119.     begin
  120.       s:=HexToStr(EscherEdit.HexData, (Length(EscherEdit.HexData)-1) div 3 +1);
  121.       DataRecords[Index].Size:= StrToInt64(EscherEdit.edSize.Text);;
  122.       DataRecords[Index].Version:= StrToInt('$'+EscherEdit.edInstance.Text);
  123.       DataRecords[Index].HexData:= EscherEdit.HexData;
  124.       DataRecords[Index].Data:= SkipZero(s);
  125.       ListRecordsSelectItem( Self, ListRecords.Selected, true);
  126.       FixStreamOffsets(ListRecords.Selected.Index-1);
  127.     end;
  128.  
  129.   end else inherited;
  130.  
  131. end;
  132.  
  133. procedure TEscherEdit.ListRecordsGetImageIndex(Sender: TObject;
  134.   Item: TListItem);
  135. begin
  136.   if (Item<>nil) and ((DataRecords[Item.Index].Version and $F) = $F) then
  137.     Item.ImageIndex:=0 else Item.ImageIndex:=-1;
  138. end;
  139.  
  140. function TEscherEdit.GetIdName(const Id: word): string;
  141. begin
  142.   GetIdName:=GetEscherIdName(Id);
  143. end;
  144.  
  145. function TEscherEdit.HexData: string;
  146. var
  147.   i: integer;
  148. begin
  149.   Result:='';
  150.   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',
  151.      [lo(DataRecords[i].Version), hi(DataRecords[i].Version),
  152.       lo(DataRecords[i].Id), hi(DataRecords[i].Id),
  153.       lo(DataRecords[i].Size and $FFFF), hi(DataRecords[i].Size and $FFFF),
  154.       lo(DataRecords[i].Size shr 16), hi(DataRecords[i].Size shr 16) ,
  155.       DataRecords[i].HexData]);
  156. end;
  157.  
  158. end.
  159.