📄 mainfrm.pas
字号:
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 + -