--- oup/current/Tools/BinEdit.pas 2007/05/13 22:18:18 179 +++ oup/current/Tools/BinEdit.pas 2007/11/26 11:02:28 248 @@ -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, + _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,44 +27,38 @@ type value_viewer_context_copyasbitset: TMenuItem; value_viewer_context_copyasstring: TMenuItem; value_viewer_context_copyashex: TMenuItem; - VTHPopup: TVTHeaderPopupMenu; - panel_imexport: TPanel; - btn_export: TButton; - btn_import: TButton; - 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: 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; @@ -65,13 +66,11 @@ type 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, _TemplateFile; + type PNodeData = ^TNodeData; @@ -118,29 +117,8 @@ begin // end; -procedure TForm_BinEdit.NewFile(fileinfo: TFileInfo); -begin - LoadDat(fileinfo.ID); -end; - - - -function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; - ARecord: TNodeData): PVirtualNode; -var - Data: PNodeData; -begin - Result := AVST.AddChild(ANode); - Data := AVST.GetNodeData(Result); - AVST.ValidateNode(Result, False); - Data^ := ARecord; -end; - - - - -procedure TForm_BinEdit.LoadDat(_fileid: Integer); +procedure TForm_BinEdit.NewFile(fileinfo: TFileInfo); var mem: TMemoryStream; begin @@ -155,24 +133,28 @@ begin end; end; end; - if _fileid >= 0 then + if fileinfo.ID >= 0 then begin - fileid := _fileid; + fileid := fileinfo.ID; ConID := ConnectionID; - if ConManager.Connection[ConID].ExtractFileIDOfName(filelist.Items.Strings[filelist.ItemIndex]) <> fileid then - Self.SelectFileID(ConnectionID, fileid); +// if ConManager.Connection[ConID].ExtractFileIDOfName(filelist.Items.Strings[filelist.ItemIndex]) <> fileid then +// Self.SelectFileID(ConnectionID, fileid); Self.ClearStructViewer; - mem := nil; - ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem)); - rawlist := ConManager.Connection[ConID].GetRawList(fileid); - hex.LoadFromStream(mem); - mem.Free; ClearValues; - WriteStructureInfos; + mem := nil; + hex.DataSize := 0; + if fileinfo.Size > 0 then + begin + ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem)); + rawlist := ConManager.Connection[ConID].GetRawList(fileid); + hex.LoadFromStream(mem); + mem.Free; + WriteStructureInfos; + end; end else begin - fileid := _fileid; + fileid := -1; ConID := -1; Self.ClearStructViewer; ClearValues; @@ -183,11 +165,26 @@ end; + +function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; + ARecord: TNodeData): PVirtualNode; +var + Data: PNodeData; +begin + Result := AVST.AddChild(ANode); + Data := AVST.GetNodeData(Result); + AVST.ValidateNode(Result, False); + Data^ := ARecord; +end; + + + + + function TForm_BinEdit.GetValue(datatype: Word; offset: Integer): String; var Data: TByteData; i: Integer; - tempi: Integer; floatformat: TFormatSettings; begin floatformat.DecimalSeparator := '.'; @@ -225,6 +222,7 @@ begin 11: begin if Length(rawlist) > 0 then + begin for i := 0 to High(rawlist) do if rawlist[i].SrcOffset = offset then begin @@ -234,6 +232,9 @@ begin Result := 'unused'; Break; end; + if i > High(rawlist) then + Result := 'unused'; + end; end; 12: if hex.Data[offset] = 1 then @@ -756,7 +757,7 @@ var node: PVirtualNode; nodedata: PNodeData; rawinfo: TRawDataInfo; - form: TForm_ToolTemplate; + form: TForm_TemplateFileList; begin if VST.FocusedColumn = 3 then begin @@ -777,7 +778,7 @@ begin if rawinfo.RawSize > 0 then begin form := nil; - form := Form_Main.open_child('rawedit', ConID, fileid); + form := TForm_TemplateFileList(Form_Main.open_child('rawedit', ConID, fileid)); if Assigned(form) then TForm_RawEdit(form).LoadRaw(rawinfo); end; @@ -796,7 +797,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; @@ -986,7 +987,6 @@ end; - procedure TForm_BinEdit.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = [ssCtrl]) and (Key = 83) then