📄 childfrm.pas
字号:
unit ChildFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ImgList, StdActns, ActnList, ShellApi, Clipbrd, ComCtrls,
Printers, HexEdit, Global;
const
SDefaultFileName = 'Noname.dat';
type
TCryptType = (ctGOST);
TSearchKind = (skNone, skSearchText, skSearchHex, skSearchInt, skSearchFloat, skReplaceText, skReplaceHex);
TChildForm = class(TForm)
StatusBar: TStatusBar;
HexEdit: THexEdit;
MainMenu: TMainMenu;
EditMenu: TMenuItem;
EditUndoItem: TMenuItem;
EditRedoItem: TMenuItem;
EditN1Item: TMenuItem;
EditCutItem: TMenuItem;
EditCopyItem: TMenuItem;
EditPasteItem: TMenuItem;
EditSelAllItem: TMenuItem;
EditN2Item: TMenuItem;
EditChgLenItem: TMenuItem;
EditInsertCharItem: TMenuItem;
EditN3Item: TMenuItem;
EditWriteBlockItem: TMenuItem;
EditAdjustBlockItem: TMenuItem;
EditDefBlockItem: TMenuItem;
EditFillBlockItem: TMenuItem;
B1: TMenuItem;
EditN4Item: TMenuItem;
EditConvItem: TMenuItem;
EditConvCharsetItem: TMenuItem;
EditConvCryptItem: TMenuItem;
EditConvCaseItem: TMenuItem;
SearchMenu: TMenuItem;
SearchTextItem: TMenuItem;
SearchHexItem: TMenuItem;
SearchIntegerItem: TMenuItem;
SearchFloatItem: TMenuItem;
SearchN1Item: TMenuItem;
SearchReplaceTextItem: TMenuItem;
SearchReplaceHexItem: TMenuItem;
SearchN2Item: TMenuItem;
SearchNextItem: TMenuItem;
SearchFirstItem: TMenuItem;
SearchN3Item: TMenuItem;
SearchCompareItem: TMenuItem;
SearchCompareNextItem: TMenuItem;
PosMenu: TMenuItem;
PosGotoOffsetItem: TMenuItem;
PosN1Item: TMenuItem;
PosGotoFirstItem: TMenuItem;
PosGotoEndItem: TMenuItem;
PosN3Item: TMenuItem;
PosGotoBlockStartItem: TMenuItem;
PosGotoBlockEndItem: TMenuItem;
PosN4Item: TMenuItem;
PosGotoLineFirstItem: TMenuItem;
PosGotoLineEndItem: TMenuItem;
PosN2Item: TMenuItem;
PosDefBookmarkItem: TMenuItem;
PosDefBk1Item: TMenuItem;
PosDefBk2Item: TMenuItem;
PosDefBk3Item: TMenuItem;
PosDefBk4Item: TMenuItem;
PosDefBk5Item: TMenuItem;
PosDefBk6Item: TMenuItem;
PosDefBk7Item: TMenuItem;
PosDefBk8Item: TMenuItem;
PosDefBk9Item: TMenuItem;
PosDefBk0Item: TMenuItem;
PosGotoBookmarkItem: TMenuItem;
PosGotoBk1Item: TMenuItem;
PosGotoBk2Item: TMenuItem;
PosGotoBk3Item: TMenuItem;
PosGotoBk4Item: TMenuItem;
PosGotoBk5Item: TMenuItem;
PosGotoBk6Item: TMenuItem;
PosGotoBk7Item: TMenuItem;
PosGotoBk8Item: TMenuItem;
PosGotoBk9Item: TMenuItem;
PosGotoBk0Item: TMenuItem;
ActionList: TActionList;
UndoAction: TAction;
RedoAction: TAction;
CopyAction: TEditCopy;
CutAction: TEditCut;
PasteAction: TEditPaste;
SelAllAction: TAction;
WriteBlockAction: TAction;
DeleteBlockAction: TAction;
FillBlockAction: TAction;
DefBlockAction: TAction;
ChgLenAction: TAction;
InsCharAction: TAction;
GotoOffsetAction: TAction;
ViewPopupMenu: TPopupMenu;
PopupWriteBlockItem: TMenuItem;
PopupFillBlockItem: TMenuItem;
PopupN1Item: TMenuItem;
PopupCutItem: TMenuItem;
PopupCopyItem: TMenuItem;
PopupPasteItem: TMenuItem;
PopupN2Item: TMenuItem;
PopupInsertCharItem: TMenuItem;
PopupN3Item: TMenuItem;
PopupShowNumBaseItem: TMenuItem;
PopupShowBkmkMgrItem: TMenuItem;
SaveDialog: TSaveDialog;
CurValuePopupMenu: TPopupMenu;
CurValPopup8sItem: TMenuItem;
CurValPopup8uItem: TMenuItem;
CurValPopup16sItem: TMenuItem;
CurValPopup16uItem: TMenuItem;
CurValPopup32sItem: TMenuItem;
CurValPopup32uItem: TMenuItem;
CurValPopupSingleItem: TMenuItem;
CurValPopupDoubleItem: TMenuItem;
BlockInfoPopupMenu: TPopupMenu;
BlkPopupDecItem: TMenuItem;
BlkPopupHexItem: TMenuItem;
BlkPopupN1Item: TMenuItem;
BlkPopupDefBlockItem: TMenuItem;
BlkPopupN2Item: TMenuItem;
BlkPopupBlockLenItem: TMenuItem;
OffsetPopupMenu: TPopupMenu;
OffPopupDecItem: TMenuItem;
OffPopupHexItem: TMenuItem;
OffPopupN1Item: TMenuItem;
OffPopupGotoItem: TMenuItem;
LengthPopupMenu: TPopupMenu;
LenPopupDecItem: TMenuItem;
LenPopupHexItem: TMenuItem;
LenPopupN1Item: TMenuItem;
LenPopupChgLenItem: TMenuItem;
AdjustBlockAction: TAction;
PopupN4Item: TMenuItem;
PopupUndoItem: TMenuItem;
PopupRedoItem: TMenuItem;
procedure UndoActionExecute(Sender: TObject);
procedure RedoActionExecute(Sender: TObject);
procedure CopyActionExecute(Sender: TObject);
procedure CutActionExecute(Sender: TObject);
procedure PasteActionExecute(Sender: TObject);
procedure SelAllActionExecute(Sender: TObject);
procedure ChgLenActionExecute(Sender: TObject);
procedure HexEditCaretMove(Sender: TObject);
procedure HexEditSelectionChange(Sender: TObject);
procedure StatusBarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure HexEditChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure InsCharActionExecute(Sender: TObject);
procedure WriteBlockActionExecute(Sender: TObject);
procedure DeleteBlockActionExecute(Sender: TObject);
procedure FillBlockActionExecute(Sender: TObject);
procedure DefBlockActionExecute(Sender: TObject);
procedure AdjustBlockActionExecute(Sender: TObject);
procedure EditConvCharsetItemClick(Sender: TObject);
procedure EditConvCryptItemClick(Sender: TObject);
procedure EditConvCaseItemClick(Sender: TObject);
procedure SearchTextItemClick(Sender: TObject);
procedure SearchHexItemClick(Sender: TObject);
procedure SearchIntegerItemClick(Sender: TObject);
procedure SearchFloatItemClick(Sender: TObject);
procedure SearchReplaceTextItemClick(Sender: TObject);
procedure SearchReplaceHexItemClick(Sender: TObject);
procedure SearchNextItemClick(Sender: TObject);
procedure SearchFirstItemClick(Sender: TObject);
procedure SearchCompareItemClick(Sender: TObject);
procedure SearchCompareNextItemClick(Sender: TObject);
procedure CurValPopup8sItemClick(Sender: TObject);
procedure CurValPopup8uItemClick(Sender: TObject);
procedure CurValPopup16sItemClick(Sender: TObject);
procedure CurValPopup16uItemClick(Sender: TObject);
procedure CurValPopup32sItemClick(Sender: TObject);
procedure CurValPopup32uItemClick(Sender: TObject);
procedure CurValPopupSingleItemClick(Sender: TObject);
procedure CurValPopupDoubleItemClick(Sender: TObject);
procedure LenPopupDecItemClick(Sender: TObject);
procedure LenPopupHexItemClick(Sender: TObject);
procedure OffPopupDecItemClick(Sender: TObject);
procedure OffPopupHexItemClick(Sender: TObject);
procedure BlkPopupDecItemClick(Sender: TObject);
procedure BlkPopupHexItemClick(Sender: TObject);
procedure BlockInfoPopupMenuPopup(Sender: TObject);
procedure GotoOffsetActionExecute(Sender: TObject);
procedure PosGotoFirstItemClick(Sender: TObject);
procedure PosGotoEndItemClick(Sender: TObject);
procedure PosGotoBlockStartItemClick(Sender: TObject);
procedure PosGotoBlockEndItemClick(Sender: TObject);
procedure PosGotoLineFirstItemClick(Sender: TObject);
procedure PosGotoLineEndItemClick(Sender: TObject);
procedure PosDefBkItemClick(Sender: TObject);
procedure PosGotoBkItemClick(Sender: TObject);
procedure PosDefBookmarkItemClick(Sender: TObject);
procedure PosGotoBookmarkItemClick(Sender: TObject);
procedure PopupShowNumBaseItemClick(Sender: TObject);
procedure HexEditDblClick(Sender: TObject);
procedure PopupShowBkmkMgrItemClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure StatusBarResize(Sender: TObject);
private
{ Private declarations }
FFileName: string;
FDisplayName: string; //显示在页面切换栏上
FIsNewDoc: Boolean; //是不是新建的文档
FShowing: Boolean; //子窗口是否正显示
function GetDataSize: Integer;
function GetDisplayName: string;
procedure SetLengthNumBase(Value: TNumBase);
procedure SetOffsetNumBase(Value: TNumBase);
procedure SetBlockInfoNumBase(Value: TNumBase);
procedure SetCurValueType(Value: TValueType);
procedure InitBounds;
procedure InitEditorAppearance;
procedure ShowStatusInfo;
procedure ShowOffset;
procedure ShowLength;
procedure ShowBlockInfo;
procedure ShowCurValue;
procedure ShowModifyFlag;
function SaveToFile(const FileName: string): Boolean;
procedure AdjustUndoRedoEnabled;
procedure AdjustClipboardEnabled;
procedure AdjustBlockEnabled;
function CheckSelExists: Boolean;
procedure CreateBackup;
public
{ Public declarations }
function NewBuffer(Size: Integer): Boolean;
function LoadFromFile(const FileName: string): Boolean;
function Save: Boolean;
function SaveAs: Boolean;
function Execute: Boolean;
function OpenWithEditor: Boolean;
function Print: Boolean;
function ExportToText: Boolean;
function LoadFromLogicSector(Drive: Char; SectorStart, SectorCount: Integer): Boolean;
function SaveToLogicSector(Drive: Char; SectorStart: Integer): Boolean;
procedure ReDraw;
procedure FillDataInspector;
procedure SearchText;
procedure GotoAddress;
procedure Undo;
procedure Redo;
property FileName: string read FFileName;
property DisplayName: string read GetDisplayName;
property DataSize: Integer read GetDataSize;
end;
var
ChildForm: TChildForm;
implementation
uses
Misc, SysOptMgr, OptionFrm, MainFrm, InsCharFrm, SetSizeFrm, AdjBlockFrm,
DefBlockFrm, FillBlockFrm, GotoOffsetFrm, SearchTextFrm, SearchHexFrm,
SearchIntFrm, SearchFloatFrm, ReplaceTextFrm, ReplaceHexFrm, ExportFrm,
ProgressFrm, PrintFrm, ConvCryptFrm, ConvCaseFrm, ConvChrsetFrm, DataCompFrm,
NumBaseConvFrm, BkmkMgrFrm, DataInspFrm, Gost, Search, Compare, NumBase,
DiskIO, TransCharset;
var
SearchMgr: TSearchMgr; //数据搜索
CompareMgr: TCompareMgr; //数据比较
{$R *.dfm}
{ Misc }
procedure ShowWinNoAnimate(Handle: HWnd; CmdShow: Integer);
function GetAnimation: Boolean;
var
Info: TAnimationInfo;
begin
Info.cbSize := SizeOf(TAnimationInfo);
if SystemParametersInfo(SPI_GETANIMATION, SizeOf(Info), @Info, 0) then
Result := Info.iMinAnimate <> 0 else
Result := False;
end;
procedure SetAnimation(Value: Boolean);
var
Info: TAnimationInfo;
begin
Info.cbSize := SizeOf(TAnimationInfo);
BOOL(Info.iMinAnimate) := Value;
SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;
var
Animation: Boolean;
begin
Animation := GetAnimation;
if Animation then SetAnimation(False);
ShowWindow(Handle, CmdShow);
if Animation then SetAnimation(True);
end;
{ TChildForm }
function TChildForm.GetDataSize: Integer;
begin
Result := HexEdit.DataSize;
end;
function TChildForm.GetDisplayName: string;
begin
Result := FDisplayName;
end;
procedure TChildForm.SetLengthNumBase(Value: TNumBase);
begin
LenPopupDecItem.Checked := (Value = raDec);
LenPopupHexItem.Checked := (Value <> raDec);
OptMgr.Values[SOptStatusLengthNumBase] := Value;
ShowLength;
end;
procedure TChildForm.SetOffsetNumBase(Value: TNumBase);
begin
OffPopupDecItem.Checked := (Value = raDec);
OffPopupHexItem.Checked := (Value <> raDec);
OptMgr.Values[SOptStatusOffsetNumBase] := Value;
ShowOffset;
end;
procedure TChildForm.SetBlockInfoNumBase(Value: TNumBase);
begin
BlkPopupDecItem.Checked := (Value = raDec);
BlkPopupHexItem.Checked := (Value <> raDec);
OptMgr.Values[SOptStatusBlockInfoNumBase] := Value;
ShowBlockInfo;
end;
procedure TChildForm.SetCurValueType(Value: TValueType);
begin
CurValPopup8sItem.Checked := (Value = vt8s);
CurValPopup8uItem.Checked := (Value = vt8u);
CurValPopup16sItem.Checked := (Value = vt16s);
CurValPopup16uItem.Checked := (Value = vt16u);
CurValPopup32sItem.Checked := (Value = vt32s);
CurValPopup32uItem.Checked := (Value = vt32u);
CurValPopupSingleItem.Checked := (Value = vtSingle);
CurValPopupDoubleItem.Checked := (Value = vtDouble);
OptMgr.Values[SOptStatusCurValueType] := Value;
ShowCurValue;
end;
procedure TChildForm.InitBounds;
begin
if MainForm.GetDocCount = 1 then
begin
BoundsRect := MainForm.GetMDIClientRect;
ShowWinNoAnimate(Handle, SW_MAXIMIZE);
end;
end;
procedure TChildForm.InitEditorAppearance;
begin
GetEditFontFromOpt(HexEdit.Font);
HexEdit.Colors.AddressBackColor := OptMgr.Values[SOptAddrBColor];
HexEdit.Colors.AddressForeColor := OptMgr.Values[SOptAddrFColor];
HexEdit.Colors.HexBackColor := OptMgr.Values[SOptHexBColor];
HexEdit.Colors.HexForeColor := OptMgr.Values[SOptHexFColor];
HexEdit.Colors.CharBackColor := OptMgr.Values[SOptChrBColor];
HexEdit.Colors.CharForeColor := OptMgr.Values[SOptChrFColor];
HexEdit.Colors.SelectionBackColor := OptMgr.Values[SOptBlockBColor];
HexEdit.Colors.SelectionForeColor := OptMgr.Values[SOptBlockFColor];
HexEdit.Colors.CaretBackColor := OptMgr.Values[SOptCurItemBColor];
HexEdit.Colors.CaretForeColor := OptMgr.Values[SOptCurItemFColor];
HexEdit.DrawCharStyle := TDrawCharStyle(OptMgr.Values[SOptDrawCharStyle]);
end;
procedure TChildForm.ShowStatusInfo;
begin
StatusBar.Panels.BeginUpdate;
ShowLength;
ShowOffset;
ShowBlockInfo;
ShowCurValue;
ShowModifyFlag;
StatusBar.Panels.EndUpdate;
end;
procedure TChildForm.ShowOffset;
var
S: string;
Value: Integer;
begin
Value := HexEdit.Offset;
S := '偏移: ';
if OptMgr.Values[SOptStatusOffsetNumBase] = raDec then
S := S + Format('%10dD', [Value])
else
S := S + ' ' + IntToHex(Value, 8) + 'H';
StatusBar.Panels[1].Text := S;
end;
procedure TChildForm.ShowLength;
var
S: string;
Value: Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -