--- oup/current/Tools/BinEdit.pas 2007/02/21 03:12:33 109 +++ oup/current/Tools/BinEdit.pas 2007/06/18 14:20:33 221 @@ -1,18 +1,25 @@ unit BinEdit; + interface + uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, Template, StdCtrls, ExtCtrls, VirtualTrees, Grids, Wrapgrid, - MPHexEditor, VTHeaderPopup, Menus, StrUtils, Clipbrd, - Data, TypeDefs, ConnectionManager, Buttons; + Dialogs, VirtualTrees, Grids, Wrapgrid, MPHexEditor, + StdCtrls, Menus, ExtCtrls, Buttons, + Data, TypeDefs, ConnectionManager, Template, + _TemplateFileList, VTHeaderPopup, ComCtrls; type - TForm_BinEdit = class(TForm_ToolTemplate) + TForm_BinEdit = class(TForm_TemplateFileList) + panel_imexport: TPanel; + btn_export: TButton; + btn_import: TButton; hex: TMPHexEditor; Splitter2: TSplitter; value_viewer: TWrapGrid; - VST: TVirtualStringTree; Splitter3: TSplitter; + VST: TVirtualStringTree; + VTHPopup: TVTHeaderPopupMenu; value_viewer_context: TPopupMenu; value_viewer_context_copy: TMenuItem; value_viewer_context_copyasdec: TMenuItem; @@ -20,54 +27,51 @@ type value_viewer_context_copyasbitset: TMenuItem; value_viewer_context_copyasstring: TMenuItem; value_viewer_context_copyashex: TMenuItem; - VTHPopup: TVTHeaderPopupMenu; - procedure FormCreate(Sender: TObject); procedure NewFile(fileinfo: TFileInfo); - procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); - - procedure hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure hexSelectionChanged(Sender: TObject); - procedure hexChange(Sender: TObject); - procedure LoadDat(_fileid: Integer); function Save: Boolean; - function GetValue(datatype: Word; offset: LongWord): String; - procedure SetNewValue(datatype: Word; offset: LongWord; Value: String); + function GetValue(datatype: Word; offset: Integer): String; + procedure SetNewValue(datatype: Word; offset: Integer; Value: String); procedure WriteStructureInfos; procedure ClearStructViewer; - procedure VSTDblClick(Sender: TObject); - procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; - Column: TColumnIndex); - procedure VTHPopupColumnChange(const Sender: TBaseVirtualTree; - const Column: TColumnIndex; Visible: Boolean); - procedure VSTHeaderDragged(Sender: TVTHeader; Column: TColumnIndex; - OldPosition: Integer); - procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; - Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); procedure ClearValues; procedure WriteValues; + + procedure FormCreate(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure hexChange(Sender: TObject); + procedure hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure hexSelectionChanged(Sender: TObject); procedure value_viewerDblClick(Sender: TObject); - procedure value_viewer_context_copyClick(Sender: TObject); + procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure value_viewer_contextPopup(Sender: TObject); procedure value_viewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - procedure value_viewer_contextPopup(Sender: TObject); + procedure value_viewer_context_copyClick(Sender: TObject); + procedure VSTDblClick(Sender: TObject); + procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex); + procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); + procedure VSTHeaderDragged(Sender: TVTHeader; Column: TColumnIndex; + OldPosition: Integer); + procedure VTHPopupColumnChange(const Sender: TBaseVirtualTree; + const Column: TColumnIndex; Visible: Boolean); private fileid: Integer; ConID: Integer; + rawlist: TRawDataList; public end; -var - Form_BinEdit: TForm_BinEdit; - implementation - -uses ValueEdit, Main, Functions, DatStructureLoader{, RawEdit}; {$R *.dfm} +uses ValueEdit, Main, Functions, DatStructureLoader, RawEdit, RawList, + StrUtils, Clipbrd; + type PNodeData = ^TNodeData; @@ -114,6 +118,7 @@ begin // end; + procedure TForm_BinEdit.NewFile(fileinfo: TFileInfo); begin LoadDat(fileinfo.ID); @@ -139,7 +144,6 @@ end; procedure TForm_BinEdit.LoadDat(_fileid: Integer); var mem: TMemoryStream; - Data: TByteData; begin if ConID <> -1 then begin @@ -161,6 +165,7 @@ begin Self.ClearStructViewer; mem := nil; ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem)); + rawlist := ConManager.Connection[ConID].GetRawList(fileid); hex.LoadFromStream(mem); mem.Free; ClearValues; @@ -173,15 +178,16 @@ begin Self.ClearStructViewer; ClearValues; hex.DataSize := 0; + SetLength(rawlist, 0); end; end; -function TForm_BinEdit.GetValue(datatype: Word; offset: LongWord): String; +function TForm_BinEdit.GetValue(datatype: Word; offset: Integer): String; var Data: TByteData; - i: Word; + i: Integer; floatformat: TFormatSettings; begin floatformat.DecimalSeparator := '.'; @@ -217,10 +223,28 @@ begin 10: Result := IntToBin(hex.Data[offset]); 11: - Result := '0x' + IntToHex(ConManager.Connection[ConID].GetRawInfo(fileid, offset).RawAddr, 8); + begin + if Length(rawlist) > 0 then + begin + for i := 0 to High(rawlist) do + if rawlist[i].SrcOffset = offset then + begin + if rawlist[i].RawAddr > 0 then + Result := '0x' + IntToHex(rawlist[i].RawAddr, 8) + else + Result := 'unused'; + Break; + end; + if i > High(rawlist) then + Result := 'unused'; + end; + end; 12: - Result := FormatNumber(hex.Data[offset + 1] + hex.Data[offset + 2] * 256 + - hex.Data[offset + 3] * 256 * 256, 5, '0'); + if hex.Data[offset] = 1 then + Result := FormatNumber(hex.Data[offset + 1] + hex.Data[offset + 2] * 256 + + hex.Data[offset + 3] * 256 * 256, 5, '0') + else + Result := 'no link'; 13: Result := IntToStr(hex.Data[offset]); 14: @@ -273,7 +297,7 @@ end; procedure TForm_BinEdit.WriteStructureInfos; var - i, j: LongWord; + i, j: Integer; pdata: PNodeData; Data: TNodeData; node: PVirtualNode; @@ -307,8 +331,8 @@ begin begin if Pos('#', SubName) > 0 then begin - Data.Offset := HexToLong(MidStr(SubName, Pos('#', SubName) + 1, 8)); - Data.Value := + Data.Offset := StrToInt('$'+MidStr(SubName, Pos('#', SubName) + 1, 8)); + Data.Value := '$' + MidStr(SubName, PosEx('#', SubName, Pos('#', SubName) + 1) + 1, 8); Data.Caption := MidStr(SubName, 1, Pos('#', SubName) - 1); Data.Description := SubDesc; @@ -375,7 +399,7 @@ var i, j: Integer; Data: TByteData; str: String; - Value: LongWord; + Value: Integer; floatformat: TFormatSettings; begin floatformat.DecimalSeparator := '.'; @@ -458,8 +482,10 @@ begin str := ''; if hex.SelCount = 0 then begin - while (hex.Data[hex.SelStart + j] > 0) and ((hex.SelStart + j) < hex.DataSize) do + while (hex.SelStart + j) < hex.DataSize do begin + if hex.Data[hex.SelStart + j] = 0 then + Break; if hex.Data[hex.selstart + j] >= 32 then str := str + Char(hex.Data[hex.SelStart + j]) else @@ -488,7 +514,7 @@ end; function TForm_BinEdit.Save: Boolean; var mem: TMemoryStream; - i: LongWord; + i: Integer; begin case MessageBox(Self.Handle, PChar('Save changes to file ' + ConManager.Connection[ConID].GetFileInfo(fileid).Name + '?'), PChar('Data changed...'), @@ -670,7 +696,7 @@ end; procedure TForm_BinEdit.value_viewer_context_copyClick(Sender: TObject); var Name: String; - Value: LongWord; + Value: Integer; begin Name := TMenuItem(Sender).Name; if Pos('asstring', Name) > 0 then @@ -733,7 +759,8 @@ procedure TForm_BinEdit.VSTDblClick(Send var node: PVirtualNode; nodedata: PNodeData; - form: TForm_ToolTemplate; + rawinfo: TRawDataInfo; + form: TForm_TemplateFileList; begin if VST.FocusedColumn = 3 then begin @@ -748,12 +775,18 @@ begin end else begin - if nodedata.DataType = 11 then + if (nodedata.DataType = 11) and (nodedata.Value <> 'unused') then begin - if ConManager.Connection[ConID].GetRawInfo(fileid, nodedata.offset).RawSize > 0 then - Form_Main.open_child('rawedit', ConID, fileid); + rawinfo := ConManager.Connection[ConID].GetRawInfo(fileid, nodedata.offset); + if rawinfo.RawSize > 0 then + begin + form := nil; + form := TForm_TemplateFileList(Form_Main.open_child('rawedit', ConID, fileid)); + if Assigned(form) then + TForm_RawEdit(form).LoadRaw(rawinfo); + end; end; - if nodedata.DataType = 12 then + if (nodedata.DataType = 12) and (nodedata.Value <> 'no link') then begin if (StrToInt(nodedata.Value) < ConManager.Connection[ConID].GetFileCount) and (StrToInt(nodedata.Value) > 0) and @@ -767,7 +800,7 @@ begin end; if (nodedata.DataType >= 100) and (nodedata.DataType <= 300) then begin - form := Form_Main.open_child('binedit', ConID, -1); + form := TForm_TemplateFileList(Form_Main.open_child('binedit', ConID)); if Assigned(form) then form.SetFileFilters(nodedata.Value, '', False); end; @@ -793,7 +826,7 @@ begin else begin hex.SelStart := Data.Offset; - hex.SelEnd := Data.Offset + HexToLong(Data.Value) - 1; + hex.SelEnd := Data.Offset + StrToInt(Data.Value) - 1; end; end; @@ -824,7 +857,7 @@ begin if Data.DataType > 0 then CellText := Data.Value //GetValue(data.DataType, data.Offset) else if Length(Data.Value) > 0 then - CellText := IntToStr(HexToLong(Data.Value)) + ' Bytes'; + CellText := IntToStr(StrToInt(Data.Value)) + ' Bytes'; 4: CellText := Data.Description; end; @@ -855,7 +888,7 @@ end; -procedure TForm_BinEdit.SetNewValue(datatype: Word; offset: LongWord; Value: String); +procedure TForm_BinEdit.SetNewValue(datatype: Word; offset: Integer; Value: String); var Data: TByteData; value_int: LongWord; @@ -922,7 +955,7 @@ end; procedure TForm_BinEdit.value_viewerDblClick(Sender: TObject); var - offset: LongWord; + offset: Integer; datatype: Word; objectname: String; Value: String; @@ -957,7 +990,6 @@ end; - procedure TForm_BinEdit.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = [ssCtrl]) and (Key = 83) then