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

📄 mainfrm.pas

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls, StdCtrls,
  Menus, ComCtrls, ToolWin, ActnList, ImgList, ShellApi,
  Registry, HexChFrm, SysTray;

const
  WM_OPENFILE = WM_USER + 1;
  MINIHEX_VERSION_INFO = 'MiniHex 1.1';

type
  TMHMainForm = class(TForm)
    StatusBar: TStatusBar;
    ActionList: TActionList;
    OpenAct: TAction;
    MainMenu: TMainMenu;
    FileMenu: TMenuItem;
    FileNewItem: TMenuItem;
    ImageList: TImageList;
    NewAct: TAction;
    FileOpenItem: TMenuItem;
    HelpContentAct: TAction;
    AboutAct: TAction;
    HelpMenu: TMenuItem;
    HelpContentItem: TMenuItem;
    HelpAboutItem: TMenuItem;
    OpenFileDialog: TOpenDialog;
    SaveAct: TAction;
    SaveAsAct: TAction;
    ExecuteAct: TAction;
    PropertyAct: TAction;
    PrintAct: TAction;
    OpenFolderAct: TAction;
    QuitAct: TAction;
    FileN1Item: TMenuItem;
    FileSaveItem: TMenuItem;
    FileSaveAsItem: TMenuItem;
    FileExecuteItem: TMenuItem;
    FilePropertyItem: TMenuItem;
    FilePrintItem: TMenuItem;
    FileOpenFolderItem: TMenuItem;
    FileN4Item: TMenuItem;
    FileQuitItem: TMenuItem;
    FileN5Item: TMenuItem;
    ViewMenu: TMenuItem;
    ViewToolBarItem: TMenuItem;
    ViewStatusBarItem: TMenuItem;
    ViewN2Item: TMenuItem;
    ViewOnTopItem: TMenuItem;
    ToolMenu: TMenuItem;
    WindowMenu: TMenuItem;
    WinMgrItem: TMenuItem;
    WinMgrAct: TAction;
    WinCascAct: TAction;
    WinHoriTileAct: TAction;
    WinArrangeAct: TAction;
    WinBestAct: TAction;
    WinCascItem: TMenuItem;
    WinTileItem: TMenuItem;
    WinArrangeItem: TMenuItem;
    WinBestItem: TMenuItem;
    WinN1Item: TMenuItem;
    CloseAct: TAction;
    FileCloseItem: TMenuItem;
    OptionsAct: TAction;
    ToolOptionsItem: TMenuItem;
    HelpHomePageItem: TMenuItem;
    HelpEmailItem: TMenuItem;
    HelpN1Item: TMenuItem;
    ToolN3Item: TMenuItem;
    ToolFileSplitItem: TMenuItem;
    ToolFileCombinItem: TMenuItem;
    ToolN1Item: TMenuItem;
    ToolDiskReadItem: TMenuItem;
    ToolDiskWriteItem: TMenuItem;
    ToolN2Item: TMenuItem;
    ToolRadixConvItem: TMenuItem;
    ToolCalItem: TMenuItem;
    ToolDecHexTableItem: TMenuItem;
    ToolASCIITableItem: TMenuItem;
    FileMRU1Item: TMenuItem;
    FileMRU2Item: TMenuItem;
    FileMRU3Item: TMenuItem;
    FileMRU4Item: TMenuItem;
    OnTopAct: TAction;
    Timer: TTimer;
    ExportAct: TAction;
    E1: TMenuItem;
    CloseAllAct: TAction;
    L1: TMenuItem;
    FileN6Item: TMenuItem;
    SaveAllAct: TAction;
    V1: TMenuItem;
    FileN3Item: TMenuItem;
    SaveDialog: TSaveDialog;
    ToolBkmkMgrItem: TMenuItem;
    DataInspectorAct: TAction;
    ViewDataInspItem: TMenuItem;
    FilePrintSetupItem: TMenuItem;
    PrinterSetupDialog: TPrinterSetupDialog;
    HelpN2Item: TMenuItem;
    EditorAct: TAction;
    FileEditorItem: TMenuItem;
    FileN8Item: TMenuItem;
    ViewN1Item: TMenuItem;
    ViewLanguageItem: TMenuItem;
    ViewLangAutoItem: TMenuItem;
    ViewLangChineseItem: TMenuItem;
    ViewLangEnglishItem: TMenuItem;
    SysTray: TSysTray;
    SysTrayPopupMenu: TPopupMenu;
    STPopupHelpItem: TMenuItem;
    STPopupAboutItem: TMenuItem;
    STPopupQuitItem: TMenuItem;
    STPopupN2Item: TMenuItem;
    STPopupShowMainWinItem: TMenuItem;
    STPopupN1Item: TMenuItem;
    ToolBar: TToolBar;
    NewToolButton: TToolButton;
    OpenToolButton: TToolButton;
    SaveToolButton: TToolButton;
    ToolButton6: TToolButton;
    PropToolButton: TToolButton;
    PrintToolButton: TToolButton;
    ToolButton10: TToolButton;
    CutToolButton: TToolButton;
    CopyToolButton: TToolButton;
    PasteToolButton: TToolButton;
    ToolButton12: TToolButton;
    UndoToolButton: TToolButton;
    RedoToolButton: TToolButton;
    ToolButton15: TToolButton;
    OnTopToolButton: TToolButton;
    OptionToolButton: TToolButton;
    CalcToolButton: TToolButton;
    ToolButton22: TToolButton;
    ToolN4Item: TMenuItem;
    ToolToolsItem: TMenuItem;
    ToolToolsN1Item: TMenuItem;
    ToolToolsMgrItem: TMenuItem;
    HelpGPLItem: TMenuItem;
    T1: TMenuItem;
    WinVertTileAct: TAction;
    ToolButton1: TToolButton;
    CascToolButton: TToolButton;
    TileVertToolButton: TToolButton;
    TileHoriToolButton: TToolButton;
    ToolButton5: TToolButton;
    SearchToolButton: TToolButton;
    HelpContentToolButton: TToolButton;
    ToolsMgrAct: TAction;
    ToolCMOSReadItem: TMenuItem;
    ToolCMOSWriteItem: TMenuItem;
    ToolDiskToolItem: TMenuItem;
    ToolCMOSToolItem: TMenuItem;
    ToolCMOSN1Item: TMenuItem;
    ToolCMOSBackupItem: TMenuItem;
    ToolCMOSRestoreItem: TMenuItem;
    procedure NewActExecute(Sender: TObject);
    procedure OpenActExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure SaveActExecute(Sender: TObject);
    procedure SaveAsActExecute(Sender: TObject);
    procedure CloseActExecute(Sender: TObject);
    procedure ExecuteActExecute(Sender: TObject);
    procedure PropertyActExecute(Sender: TObject);
    procedure PrintActExecute(Sender: TObject);
    procedure OpenFolderActExecute(Sender: TObject);
    procedure QuitActExecute(Sender: TObject);
    procedure OptionsActExecute(Sender: TObject);
    procedure WinMgrActExecute(Sender: TObject);
    procedure WinCascActExecute(Sender: TObject);
    procedure WinHoriTileActExecute(Sender: TObject);
    procedure WinArrangeActExecute(Sender: TObject);
    procedure WinBestActExecute(Sender: TObject);
    procedure HelpContentActExecute(Sender: TObject);
    procedure AboutActExecute(Sender: TObject);
    procedure HelpHomePageItemClick(Sender: TObject);
    procedure HelpEmailItemClick(Sender: TObject);
    procedure ViewToolBarItemClick(Sender: TObject);
    procedure ViewStatusBarItemClick(Sender: TObject);
    procedure OnTopActExecute(Sender: TObject);
    procedure ToolFileSplitItemClick(Sender: TObject);
    procedure ToolFileCombinItemClick(Sender: TObject);
    procedure ToolDiskReadItemClick(Sender: TObject);
    procedure ToolDiskWriteItemClick(Sender: TObject);
    procedure ToolRadixConvItemClick(Sender: TObject);
    procedure ToolDecHexTableItemClick(Sender: TObject);
    procedure ToolASCIITableItemClick(Sender: TObject);
    procedure ToolCalItemClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FileMRU1ItemClick(Sender: TObject);
    procedure CloseAllActExecute(Sender: TObject);
    procedure ExportActExecute(Sender: TObject);
    procedure SaveAllActExecute(Sender: TObject);
    procedure ToolBkmkMgrItemClick(Sender: TObject);
    procedure DataInspectorActExecute(Sender: TObject);
    procedure FilePrintSetupItemClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure EditorActExecute(Sender: TObject);
    procedure STPopupShowMainWinItemClick(Sender: TObject);
    procedure SysTrayIconMouseDown(Sender: TObject; Button: TMouseButton;
      X, Y: Integer);
    procedure WinVertTileActExecute(Sender: TObject);
    procedure CutToolButtonClick(Sender: TObject);
    procedure CopyToolButtonClick(Sender: TObject);
    procedure PasteToolButtonClick(Sender: TObject);
    procedure UndoToolButtonClick(Sender: TObject);
    procedure RedoToolButtonClick(Sender: TObject);
    procedure SearchToolButtonClick(Sender: TObject);
    procedure ToolsMgrActExecute(Sender: TObject);
    procedure HelpGPLItemClick(Sender: TObject);
    procedure ToolCMOSReadItemClick(Sender: TObject);
    procedure ToolCMOSWriteItemClick(Sender: TObject);
    procedure ToolCMOSBackupItemClick(Sender: TObject);
    procedure ToolCMOSRestoreItemClick(Sender: TObject);
  private
    { Private declarations }
    procedure ShowToolBar(Value: Boolean = True);
    procedure ShowStatusBar(Value: Boolean = True);
    procedure ShowDataInsp(Value: Boolean = True);
    procedure SetOnTop(Value: Boolean = True);

    procedure ShowKeyState;

    procedure InitMRUMenuItem;
    procedure InitToolsMenuItem;
    procedure SaveFormRect;
    procedure LoadFormRect;
    function  DoParam: Boolean;
    function  OpenFile(FileName: string): Boolean;

    procedure WMOpenFile(var Message: TMessage); message WM_OPENFILE;
    procedure AppMinimize(Sender: TObject);
    procedure ToolsItemClick(Sender: TObject);

  public
    { Public declarations }
    procedure AddToContentMenu(Add: Boolean);
    function GetMDIClientRect: TRect;
    function GetCurDoc: THexChForm;
    function GetDocCount: Integer;
    procedure ShowStatusMsg(Msg: string);
    procedure ReDrawAllDoc;
    procedure ChangeMaxUndo(Value: Integer);

  end;

var
  MHMainForm: TMHMainForm;
  CheckPreInsAtom: TAtom; 

implementation

uses
  Misc, IniMgr, MRUMgr, ToolsMgr, BkmkMgr, OptionFrm,
  FilePropFrm, RadixConvFrm, SetSizeFrm,
  DecHexFrm, AsciiFrm, BkmkMgrFrm, WinMgrFrm,
  DataInspFrm, AboutFrm, ToolsMgrFrm,
  DiskIOFrm, FileSplitFrm, FileCombinFrm,
  CMOSTool, CMOSBackupFrm, CMOSRestoreFrm;

{$R *.DFM}

procedure TMHMainForm.ShowToolBar(Value: Boolean = True);
begin
  ToolBar.Visible := Value;
  ViewToolBarItem.Checked := Value;
end;

procedure TMHMainForm.ShowStatusBar(Value: Boolean = True);
begin
  StatusBar.Visible := Value;
  ViewStatusBarItem.Checked := Value;
end;

procedure TMHMainForm.ShowDataInsp(Value: Boolean = True);
begin
  ShowDataInspForm(Value);
  if GetCurDoc <> nil then GetCurDoc.FillDataInspValue;
  ViewDataInspItem.Checked := Value;
end;

procedure TMHMainForm.SetOnTop(Value: Boolean = True);
begin
  SetStayOnTop(Self, Value);
  OnTopAct.Checked := Value;
end;

procedure TMHMainForm.ShowKeyState;
var
  Caps, Num, Ins: Integer;
begin
  Ins := GetKeyState(VK_INSERT);
  Caps := GetKeyState(VK_CAPITAL);
  Num := GetKeyState(VK_NUMLOCK);

  if Ins = 1 then StatusBar.Panels[1].Text := 'INS'
  else StatusBar.Panels[1].Text := '';

  if Caps = 1 then StatusBar.Panels[2].Text := 'CAPS'
  else StatusBar.Panels[2].Text := '';

  if Num = 1 then StatusBar.Panels[3].Text := 'NUM'
  else StatusBar.Panels[3].Text := '';
end;

function TMHMainForm.GetCurDoc: THexChForm;
begin
  if Self.ActiveMDIChild is THexChForm then
    Result := Self.ActiveMDIChild as THexChForm
  else
    Result := nil;
end;

function TMHMainForm.GetDocCount: Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Self.MDIChildCount - 1 do
  begin
    if Self.MDIChildren[i] is THexChForm then
      Inc(Result);
  end;
end;

procedure TMHMainForm.InitMRUMenuItem;
var
  i: Integer;
  MenuItem: TMenuItem;
begin
  for i := 1 to MRUManager.Items.Count do
  begin
    MenuItem := FindComponent('FileMRU' + IntToStr(i) + 'Item') as TMenuItem;
    MenuItem.Caption := '&' + IntToStr(MenuItem.Tag) + ' ' + MRUManager.GetLimitLenStr(MRUManager.Items[i-1], 20);
    MenuItem.Visible := True;
  end;
  FileN5Item.Visible := MRUManager.Items.Count > 0;
end;

procedure TMHMainForm.InitToolsMenuItem;
var
  i: Integer;
  MenuItem: TMenuItem;
begin
  i := 0;
  while i < ToolToolsItem.Count do
  begin
    MenuItem := ToolToolsItem.Items[i];
    if MenuItem.Tag <> -1 then
      ToolToolsItem.Delete(i)
    else
      Inc(i);
  end;

  for i := 0 to High(ToolsManager.Items) do
  begin
    MenuItem := TMenuItem.Create(Self);
    ToolToolsItem.Insert(i, MenuItem);
    MenuItem.Tag := i;
    MenuItem.Caption := ToolsManager.Items[i].Title;
    MenuItem.OnClick := ToolsItemClick;
    if i < 9 then
      MenuItem.ShortCut := ShortCut(Word(Ord('1')+i), [ssAlt]);
  end;
  ToolToolsN1Item.Visible := Length(ToolsManager.Items) > 0;
end;

procedure TMHMainForm.SaveFormRect;
var
  R: TRect;
begin
  if WindowState = wsMaximized then
    R := GetWorkAreaRect
  else
    R := Self.BoundsRect;
  IniManager.SaveFormRect(R);
end;

procedure TMHMainForm.LoadFormRect;
var
  R: TRect;
begin
  Self.SetBounds(Screen.Width div 2 - Width div 2, Screen.Height div 2 - Height div 2, Width, Height);
  R := Self.BoundsRect;
  if Options.SaveWinSize then
  begin
    IniManager.LoadFormRect(R);
    Self.BoundsRect := R;
  end;
end;

function TMHMainForm.DoParam: Boolean;
var
  i: Integer;
begin
  for i := 1 to ParamCount do
  begin
    OpenFile(ParamStr(i));
  end;
  Result := (ParamCount >= 1);
end;

function TMHMainForm.OpenFile(FileName: string): Boolean;
var
  Frm: THexChForm;
begin
  Timer.Enabled := False;
  if not FileExists(FileName) then
  begin
    MessageBox(Handle, PChar('文件' + FileName + '不存在!'), '错误', 48);
    Result := False;
  end else
  begin
    if GetFileSize(FileName) = 0 then
      MessageBox(Handle, PChar('文件' + FileName + '长度为0字节!'), '提示', 48);

    Frm := THexChForm.Create(Self);
    if Frm.LoadFromFile(FileName) then
    begin
      Frm.Caption := FileName;
      MRUManager.AddMRU(FileName);
      InitMRUMenuItem;
      Result := True;
    end else
    begin
      Frm.Free;
      MessageBox(Handle, PChar('加载文件' + FileName + '时出现错误,请检查文件是否存在或被其它应用程序占用。'), '错误', 48);
      Result := False;
    end;
  end;
  Timer.Enabled := True;
end;

procedure TMHMainForm.WMOpenFile(var Message: TMessage);
var
  S: array[0..MAX_PATH] of Char;
begin
  GlobalGetAtomName(Message.LParam, S, 255);
  OpenFile(S);
end;

procedure TMHMainForm.AppMinimize(Sender: TObject);
begin
  if Options.MinState = msSysTray then
  begin
    ShowWindow(Application.Handle, SW_HIDE);
    SysTray.Active := True;
  end;
end;

procedure TMHMainForm.ToolsItemClick(Sender: TObject);
var
  MenuItem: TMenuItem;
  Idx, RunMode: Integer;
  Item: TToolsItem;
  Hnd: THandle;
begin
  MenuItem := Sender as TMenuItem;
  Idx := MenuItem.Tag;
  Item := ToolsManager.Items[Idx];
  if Item.RunMode = 0 then RunMode := SW_SHOWDEFAULT
  else if Item.RunMode = 1 then RunMode := SW_SHOWMAXIMIZED
  else RunMode := SW_SHOWMINIMIZED;
  Hnd := ShellExecute(Application.Handle, 'Open', PChar(Item.CmdLine), PChar(Item.Para), PChar(Item.WorkDir), RunMode);
  if Hnd <= 32 then
    MessageBox(Handle, PChar('常用工具 ' + MenuItem.Caption + ' 执行失败。'), '提示', 48);
end;

procedure TMHMainForm.AddToContentMenu(Add: Boolean);
var
  R: TRegistry;
  Key: string;
begin
  R := TRegistry.Create;
  R.RootKey := HKEY_CLASSES_ROOT;

  Key := '\*\Shell\用 MiniHex 打开';
  R.OpenKey(Key + '\Command', True);
  if Add then
  begin
    R.WriteString('', Application.ExeName + ' "%1"');
  end else
    R.DeleteKey(Key);

  R.Free;
end;

function TMHMainForm.GetMDIClientRect: TRect;
begin
  Result.Left := 0;
  Result.Top := 0;
  Result.Right := ClientWidth - 4;
  Result.Bottom := ClientHeight - ToolBar.Height - StatusBar.Height - 4;
end;

procedure TMHMainForm.ShowStatusMsg(Msg: string);
begin
  if Msg = '' then Msg := MINIHEX_VERSION_INFO;
  StatusBar.Panels[0].Text := Msg;
  StatusBar.Refresh;
end;

procedure TMHMainForm.ReDrawAllDoc;
var
  i: Integer;
  Frm: THexChForm;
begin
  for i := 0 to Self.MDIChildCount - 1 do
  begin
    if Self.MDIChildren[i] is THexChForm then
    begin
      Frm := Self.MDIChildren[i] as THexChForm;
      Frm.ReDraw;
    end;

⌨️ 快捷键说明

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