⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hexchfrm.pas

📁 MiniHex 1.1 源程序说明 “MiniHex11SrcSource”目录中的所有文件是MiniHex 1.1的主程序; “MiniHex11SrcControls”目录中的是该软件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit HexChFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls, Menus,
  ComCtrls, ToolWin, StdActns, ActnList, ImgList,
  StdCtrls, ShellApi, Clipbrd, Printers, Misc,
  TransCharset, ActsMgr;

const
  ScrollBarWH = 18;
  BookMarkCount = 10;
  DefaultFileName = 'NONAME.dat';

type
  TRadix = (raDec, raHex, raOct, raBin);
  TValueType = (vt8s, vt8u, vt16s, vt16u, vt32s, vt32u, vt64s, vtSingle, vtDouble, vtReal48);
  TCryptType = (ctGOST, ctTwoFish, ctBlowFish);
  TSearchKind = (skNone, skSearchText, skSearchHex, skSearchInt, skSearchFloat, skReplaceText, skReplaceHex);

  TBlock = record
    Active: Boolean;
    StartOffset: Integer;      //from 0
    EndOffset: Integer;
  end;

  TBookmark = record
    Active: Boolean;
    DLen: Integer;
    CurInHex: Boolean;
  end;

  THexChForm = class(TForm)
    MainMenu: TMainMenu;
    EditMenu: TMenuItem;
    ActionList: TActionList;
    ImageList: TImageList;
    CopyAct: TEditCopy;
    CutAct: TEditCut;
    PasteAct: TEditPaste;
    EditCutItem: TMenuItem;
    EditCopyItem: TMenuItem;
    EditPasteItem: TMenuItem;
    FormBackPanel: TPanel;
    VertScrollBar: TScrollBar;
    HoriScrollBar: TScrollBar;
    ViewBackPanel: TPanel;
    ViewPaintBox: TPaintBox;
    StatusBar: TStatusBar;
    ViewPopupMenu: TPopupMenu;
    PopupDefBlockStartItem: TMenuItem;
    PopupDefBlockEndItem: TMenuItem;
    PopupShowBlockItem: TMenuItem;
    PopupWriteBlockItem: TMenuItem;
    PopupN1Item: TMenuItem;
    PopupCutItem: TMenuItem;
    PopupCopyItem: TMenuItem;
    PopupPasteItem: TMenuItem;
    PosMenu: TMenuItem;
    SearchMenu: TMenuItem;
    UndoAct: TAction;
    RedoAct: TAction;
    EditUndoItem: TMenuItem;
    EditRedoItem: TMenuItem;
    EditN1Item: TMenuItem;
    EditSelAllItem: TMenuItem;
    EditN2Item: TMenuItem;
    ShowBlockAct: TAction;
    EditShowBlockItem: TMenuItem;
    WriteBlockAct: TAction;
    EditWriteBlockItem: TMenuItem;
    EditInsertCharItem: TMenuItem;
    EditDefBlockItem: TMenuItem;
    EditFillBlockItem: TMenuItem;
    EditN3Item: TMenuItem;
    EditN4Item: TMenuItem;
    EditConvItem: TMenuItem;
    EditConvCryptItem: TMenuItem;
    EditConvCaseItem: TMenuItem;
    SearchTextItem: TMenuItem;
    SearchFloatItem: TMenuItem;
    SearchReplaceTextItem: TMenuItem;
    SearchN2Item: TMenuItem;
    SearchNextItem: TMenuItem;
    SearchFirstItem: TMenuItem;
    PosGotoOffsetItem: TMenuItem;
    EditAdjustBlockItem: TMenuItem;
    PosN1Item: TMenuItem;
    PosGotoFirstItem: TMenuItem;
    PosGotoEndItem: TMenuItem;
    PosN3Item: TMenuItem;
    PosGotoBlockStartItem: TMenuItem;
    PosGotoBlockEndItem: TMenuItem;
    PosN4Item: TMenuItem;
    PosGotoLineFirstItem: TMenuItem;
    PosGotoLineEndItem: TMenuItem;
    PosN2Item: TMenuItem;
    PosDefBookmarkItem: TMenuItem;
    PosGotoBookmarkItem: TMenuItem;
    PosDefBk0Item: TMenuItem;
    PosDefBk1Item: TMenuItem;
    PosDefBk2Item: TMenuItem;
    PosDefBk3Item: TMenuItem;
    PosDefBk4Item: TMenuItem;
    PosDefBk5Item: TMenuItem;
    PosDefBk6Item: TMenuItem;
    PosDefBk7Item: TMenuItem;
    PosDefBk8Item: TMenuItem;
    PosDefBk9Item: TMenuItem;
    PosGotoBk0Item: TMenuItem;
    PosGotoBk1Item: TMenuItem;
    PosGotoBk2Item: TMenuItem;
    PosGotoBk3Item: TMenuItem;
    PosGotoBk4Item: TMenuItem;
    PosGotoBk5Item: TMenuItem;
    PosGotoBk6Item: TMenuItem;
    PosGotoBk7Item: TMenuItem;
    PosGotoBk8Item: TMenuItem;
    PosGotoBk9Item: TMenuItem;
    SaveDialog: TSaveDialog;
    LengthPopupMenu: TPopupMenu;
    LenPopupDecItem: TMenuItem;
    LenPopupHexItem: TMenuItem;
    LenPopupN1Item: TMenuItem;
    LenPopupChgLenItem: TMenuItem;
    OffsetPopupMenu: TPopupMenu;
    OffPopupDecItem: TMenuItem;
    OffPopupHexItem: TMenuItem;
    OffPopupN1Item: TMenuItem;
    OffPopupGotoItem: TMenuItem;
    BlockInfoPopupMenu: TPopupMenu;
    BlkPopupDecItem: TMenuItem;
    BlkPopupHexItem: TMenuItem;
    BlkPopupN1Item: TMenuItem;
    BlkPopupDefBlockItem: TMenuItem;
    DefBlockAct: TAction;
    BlkPopupN2Item: TMenuItem;
    BlkPopupBlockLenItem: TMenuItem;
    CurValuePopupMenu: TPopupMenu;
    CurValPopup8sItem: TMenuItem;
    CurValPopup8uItem: TMenuItem;
    CurValPopup16sItem: TMenuItem;
    CurValPopup16uItem: TMenuItem;
    CurValPopup32sItem: TMenuItem;
    CurValPopup32uItem: TMenuItem;
    CurValPopupSingleItem: TMenuItem;
    CurValPopupDoubleItem: TMenuItem;
    ChgLenAct: TAction;
    EditChgLenItem: TMenuItem;
    FillBlockAct: TAction;
    SearchN1Item: TMenuItem;
    SearchIntegerItem: TMenuItem;
    SearchHexItem: TMenuItem;
    SearchReplaceHexItem: TMenuItem;
    GotoOffsetAct: TAction;
    SearchCompareItem: TMenuItem;
    SearchN3Item: TMenuItem;
    SearchCompareNextItem: TMenuItem;
    PopupN2Item: TMenuItem;
    InsCharAct: TAction;
    PopupInsertCharItem: TMenuItem;
    PopupFillBlockItem: TMenuItem;
    PopupShowRadixItem: TMenuItem;
    PopupN3Item: TMenuItem;
    PopupShowBkmkMgrItem: TMenuItem;
    SelAllAct: TAction;
    EditConvCharsetItem: TMenuItem;
    DeleteBlockAct: TAction;
    B1: TMenuItem;
    procedure CopyActExecute(Sender: TObject);
    procedure CutActExecute(Sender: TObject);
    procedure PasteActExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ViewPaintBoxPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure ViewBackPanelResize(Sender: TObject);
    procedure VertScrollBarChange(Sender: TObject);
    procedure HoriScrollBarChange(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ViewPaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ViewPaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ViewPaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure UndoActExecute(Sender: TObject);
    procedure RedoActExecute(Sender: TObject);
    procedure ShowBlockActExecute(Sender: TObject);
    procedure WriteBlockActExecute(Sender: TObject);
    procedure PosGotoFirstItemClick(Sender: TObject);
    procedure PosGotoEndItemClick(Sender: TObject);
    procedure PosGotoLineFirstItemClick(Sender: TObject);
    procedure PosGotoLineEndItemClick(Sender: TObject);
    procedure StatusBarMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    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 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 ChgLenActExecute(Sender: TObject);
    procedure EditAdjustBlockItemClick(Sender: TObject);
    procedure DefBlockActExecute(Sender: TObject);
    procedure FillBlockActExecute(Sender: TObject);
    procedure PosGotoBlockStartItemClick(Sender: TObject);
    procedure PosGotoBlockEndItemClick(Sender: TObject);
    procedure PosDefBk0ItemClick(Sender: TObject);
    procedure PosGotoBk1ItemClick(Sender: TObject);
    procedure PosDefBookmarkItemClick(Sender: TObject);
    procedure PosGotoBookmarkItemClick(Sender: TObject);
    procedure SearchTextItemClick(Sender: TObject);
    procedure SearchIntegerItemClick(Sender: TObject);
    procedure SearchFloatItemClick(Sender: TObject);
    procedure SearchReplaceTextItemClick(Sender: TObject);
    procedure SearchNextItemClick(Sender: TObject);
    procedure SearchFirstItemClick(Sender: TObject);
    procedure SearchHexItemClick(Sender: TObject);
    procedure SearchReplaceHexItemClick(Sender: TObject);
    procedure GotoOffsetActExecute(Sender: TObject);
    procedure BlockInfoPopupMenuPopup(Sender: TObject);
    procedure SearchCompareItemClick(Sender: TObject);
    procedure EditConvCryptItemClick(Sender: TObject);
    procedure EditConvCaseItemClick(Sender: TObject);
    procedure PopupDefBlockStartItemClick(Sender: TObject);
    procedure PopupDefBlockEndItemClick(Sender: TObject);
    procedure InsCharActExecute(Sender: TObject);
    procedure ViewPaintBoxDblClick(Sender: TObject);
    procedure SelAllActExecute(Sender: TObject);
    procedure EditConvCharsetItemClick(Sender: TObject);
    procedure SearchCompareNextItemClick(Sender: TObject);
    procedure PopupShowRadixItemClick(Sender: TObject);
    procedure PopupShowBkmkMgrItemClick(Sender: TObject);
    procedure DeleteBlockActExecute(Sender: TObject);
  private
    { Private declarations }
    FBuf: TMemoryStream;     //缓冲区
    FBlock: TBlock;          //块
    FBookmark: array[0..9] of TBookmark;   //书签
    FFileName: string;       //文件全路径名

    FBufPointer: PChar;      //缓冲区首址
    FBufSize: Integer;       //缓冲区字节数
    FRowCount: Integer;      //总行数
    FTopRow: Integer;        //顶行的绝对行号
    FCurRow: Integer;        //光标所在的绝对行号
    FCurCol: Integer;        //光标所在的列号
    FVisRow: Integer;        //窗口所能容纳的行数
    FCurInHex: Boolean;      //光标是否在HEX区域
    FCurInHigh: Boolean;     //光标是否在高4位区域
    FCtrlKPressed: Boolean;  //Ctrl + K 是否按下
    FCtrlQPressed: Boolean;  //Ctrl + Q 是否按下
    FMouseDownFlag: Boolean; //Mouse是否按下
    FMsDownOffset: Integer;  //Mouse按下时指针所在位置的偏移值
    FMsMoveSameItem: Boolean;//Mouse拖动定义块时,是否还在按下时的字节上
    FModified: Boolean;      //数据是否被修改
    FFormShowed: Boolean;    //窗体是否已激活

    FActsMgr: TActsMgr;      //管理 Undo Redo

    function GetRowCount(Size: Integer): Integer;
    function GetCharW(S: String = 'H'): Integer;
    function GetCharH(S: String = 'H'): Integer;
    function GetRowPointer(AbsRow: Integer): PChar;
    function GetRowColPointer(AbsRow, Col: Integer): PChar;
    function GetOffset(AbsRow, Col: Integer): Integer; overload;
    function GetOffset: Integer; overload;
    function GetOffsetForProperty: Integer;
    function GetDLen(AbsRow, Col: Integer; CurInHigh: Boolean): Integer; overload;
    function GetDLen: Integer; overload;
    function GetRowTotalWidth: Integer;
    function GetFormMaxWidth: Integer;
    function GetAddrAreaLeft: Integer;
    function GetHexAreaLeft: Integer;
    function GetChrAreaLeft: Integer;
    function GetCharAttrByRowCol(AbsRow, Col: Integer; CurInHex: Boolean): TCharAttr;
    function GetOffsetByMove(DLenOffset: Integer): Integer;
    function GetOffsetByMoveTo(DLen: Integer): Integer;
    function GetHexAreaStr(AbsRow: Integer): string;
    function GetChrAreaStr(AbsRow: Integer; ShowAllChar: Boolean = True): string;
    function GetByteAtPos(Offset: Integer): Byte;
    function GetStrAtPos(Offset, Count: Integer; var S: string): Boolean;

    procedure SetLengthRadix(Value: TRadix);
    procedure SetOffsetRadix(Value: TRadix);
    procedure SetBlockInfoRadix(Value: TRadix);
    procedure SetCurValueType(Value: TValueType);
    procedure SetBlockVisible(Value: Boolean = True);
    procedure SetOffsetForProperty(Value: Integer);

    function CheckCursorInWindow: Boolean;

    procedure DrawText(X, Y: Integer; S: String; CharAttr: TCharAttr);
    //procedure LocateCaret(AbsRow, Col: Integer);
    //procedure SetCaretVisible(Show: Boolean = True);
    procedure PosToDLen(var DLen: Integer; AbsRow, Col: Integer; CurInHigh: Boolean);
    procedure DLenToPos(var AbsRow, Col: Integer; var CurInHigh: Boolean; DLen: Integer);
    function  XYToRowCol(var OffRow, Col: Integer; var CurInHex: Boolean; X, Y: Integer): Boolean;
    procedure MoveCur(DLenOffset: Integer);
    procedure MoveCurTo(DLen: Integer);
    procedure AdjustBlockA(Offset1, Offset2: Integer);
    procedure AdjustBlockB(Offset1, Offset2: Integer);
    procedure AdjScrBarAfterChgSize;
    procedure AdjustUndoRedoEnabled;
    procedure DoMouseRoll;

    procedure DrawAddrRow(OffRow, AbsRow: Integer);
    procedure DrawHexRow(OffRow, AbsRow: Integer);
    procedure DrawChrRow(OffRow, AbsRow: Integer);
    procedure DrawStrForChrRow(S: string; OffRow, Col: Integer; CharAttr: TCharAttr);
    procedure DrawOneRow(OffRow, AbsRow: Integer);
    procedure DrawSpcRow(OffRow: Integer);
    procedure DrawItem(OffRow, Col: Integer; HexCharAttr, ChrCharAttr: TCharAttr);
    procedure DrawCurItem(Show: Boolean = True);
    procedure DrawCursor(Show: Boolean = True);
    procedure DrawAllRow;

    procedure ShowStatusInfo;
    procedure ShowOffset;
    procedure ShowLength;
    procedure ShowBlockInfo;
    procedure ShowCurValue;
    procedure ShowModifyFlag;

    procedure DoUpKey(ShiftPressed: Boolean);
    procedure DoDownKey(ShiftPressed: Boolean);
    procedure DoLeftKey(ShiftPressed: Boolean);
    procedure DoRightKey(ShiftPressed: Boolean);
    procedure DoPageUpKey(ShiftPressed: Boolean);
    procedure DoPageDownKey(ShiftPressed: Boolean);
    procedure DoHomeKey(ShiftPressed: Boolean);
    procedure DoEndKey(ShiftPressed: Boolean);
    procedure DoTabKey;
    procedure DoCtrlJKey;
    procedure DoCtrlKKey(Key: Word);
    procedure DoCtrlQKey(Key: Word);
    procedure DoCtrlKNumKey(Key: Word);
    procedure DoCtrlKBKey(Key: Word);
    procedure DoCtrlKKKey(Key: Word);
    procedure DoCtrlKHKey(Key: Word);
    procedure DoCtrlKWKey(Key: Word);
    procedure DoCtrlQNumKey(Key: Word);
    procedure DoCtrlQFKey(Key: Word);
    procedure DoCtrlQAKey(Key: Word);
    procedure DoCtrlUpKey;
    procedure DoCtrlDownKey;
    procedure DoCtrlLeftKey;
    procedure DoCtrlRightKey;
    procedure DoCtrlPageUpKey(ShiftPressed: Boolean);
    procedure DoCtrlPageDownKey(ShiftPressed: Boolean);
    procedure DoCharKey(Key: Char);
    procedure DoCharKeyForHexArea(Key: Char);
    procedure DoCharKeyForChrArea(Key: Char);

    function SaveToFile(FileName: string): Boolean;
    function InsertChar(Offset: Integer; Chr: Char; Count: Integer): Boolean;
    function InsertRndChar(Offset: Integer; FromVal, ToVal: Integer; Count: Integer): Boolean;
    function InsertRange(Offset: Integer; S: string): Boolean;
    function DeleteRange(Offset, Count: Integer): Boolean;
    function DeleteBlock: Boolean;
    function ModifyRange(Offset: Integer; S: string): Boolean; overload;
    function ModifyRange(Offset, Count: Integer; S: string): Boolean; overload;
    function SelectAll: Boolean;
    function TransCharsetRange(Offset, Count: Integer; FromType, ToType: TCharsetType): Boolean;
    function CryptRange(Offset, Count: Integer; CryptType: TCryptType; Key: string; Encrypt: Boolean): Boolean;
    function TransCaseRange(Offset, Count: Integer; LowerToUpper: Boolean): Boolean;
    function ChangeBufSize(NewSize: Integer): Boolean;
    function ConvertHexToBin(AFrom, ATo: PChar; const ACount: Integer; var BytesTranslated: Integer): PChar;
    function ConvertBinToHex(AFrom, ATo: PChar; const ACount: Integer): PChar;
    function CreateUndoForModify(Offset, OldCount, NewCount: Integer): Boolean;
    function CreateUndoForInsert(Offset, Count: Integer): Boolean;
    function CreateUndoForDelete(Offset, Count: Integer): Boolean;
    function CreateRedoForModify(Offset, OldCount, NewCount: Integer): Boolean;
    function CreateRedoForInsert(Offset, Count: Integer): Boolean;
    function CreateRedoForDelete(Offset, Count: Integer): Boolean;

    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;

  public
    { Public declarations }
    property FileName: string read FFileName;
    property BufPointer: PChar read FBufPointer;
    property BufSize: Integer read FBufSize;
    property Offset: Integer read GetOffsetForProperty write SetOffsetForProperty;
    property Block: TBlock read FBlock;
    property Modified: Boolean read FModified;

    procedure SetBuf(BufPointer: PChar; BufSize: Integer);
    procedure SetBestSize;
    procedure FlashCursor;
    procedure ReDraw;
    procedure FillDataInspValue;
    procedure ChangeMaxUndo(Value: Integer);
    procedure ReplaceRange(Offset, Count: Integer; S: string);
    procedure DoSearch;
    procedure DoCut;
    procedure DoCopy;
    procedure DoPaste;
    function Undo: Boolean;
    function Redo: Boolean;

    function NewBuf(BufSize: Integer): Boolean;
    function LoadFromFile(FileName: string): Boolean;
    function Save: Boolean;
    function SaveAs: Boolean;
    function ExportToText: Boolean;
    function Print: Boolean;
    function Execute: Boolean;
    function OpenWidthEditor: Boolean;
    function LoadFromDiskSector(Drive: Char; FromSector, SectorCount: Integer): Boolean;
    function SaveToDiskSector(Drive: Char; FromSector: Integer): Boolean;
    function LoadFromCMOS(DataSize: Integer): Boolean;
    function SaveToCMOS: Boolean;

  end;

var
  HexChForm: THexChForm;

implementation

{$R *.DFM}

uses
  OptionFrm, MainFrm, InsCharFrm, SetSizeFrm,
  AdjBlockFrm, DefBlockFrm, FillBlockFrm, GotoOffsetFrm,
  SearchTextFrm, SearchHexFrm, SearchIntFrm, SearchFloatFrm,
  ReplaceTextFrm, ReplaceHexFrm, ExportFrm, ProgressFrm,
  PrintFrm, ConvCryptFrm, ConvCaseFrm, ConvChrsetFrm,
  DataCompFrm, RadixConvFrm, BkmkMgrFrm, DataInspFrm,
  Gost, Search, Compare, Radix, DiskIO, CMOSTool;

var
  SearchKind: TSearchKind;         //当前使用的查找(或替换)类型
  SearchTextMgr: TSearchBaseMgr;   //查找文本
  SearchHexMgr: TSearchBaseMgr;    //查找十六进制串
  SearchIntMgr: TSearchBaseMgr;    //查找整型值
  SearchFloatMgr: TSearchBaseMgr;  //查找浮点值
  ReplaceTextMgr: TReplaceTextMgr; //替换文本
  ReplaceHexMgr: TReplaceHexMgr;   //替换十六进制串
  CompareMgr: TCompareMgr;         //数据比较
  FDiskIO: TDiskIO;                //磁盘低级读写

function THexChForm.GetRowCount(Size: Integer): Integer;
begin
  Result := Size div 16;
  if Size mod 16 <> 0 then Inc(Result);
end;

function THexChForm.GetCharW(S: string): Integer;
begin
  Result := Canvas.TextWidth(S);
end;

function THexChForm.GetCharH(S: string): Integer;
begin
  Result := Canvas.TextHeight(S);
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -