扩展Delphi主菜单

 新建一个设计期包,将下面的代码拷贝的一个新单元中加入到包,编译并安装包即可。方法参考RemObjects的菜单生成方式。

unit IDEHelpMenu;

interface

procedure Register;

implementation

uses Windows, Classes, SysUtils, ToolsAPI, Dialogs, ShellApi, TLHelp32, Menus,
  Registry;

type
  THelpClass = class
  public
    class function ReadEvnVariant(const AName: string): string;
  end;
  TIDEHelpMenu_ASPack = class(TNotifierObject,IOTAWizard,IOTAMenuWizard)
  protected
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
    procedure Execute;
    {IOTAMenuWizard的方法}
    function GetMenuText: string;
  end;

  TIDEHelpMenu_Kill = class(TNotifierObject,IOTAWizard,IOTAMenuWizard)
  protected
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
    procedure Execute;
    {IOTAMenuWizard的方法}
    function GetMenuText: string;
  end;

  TIDEExtend = class(TNotifierObject)
  private
    class procedure OnASPackMenuClick(Sender: TObject);
    class procedure OnKillMenuClick(Sender: TObject);
    class procedure OnPjtOutputDirMenuClick(Sender: TObject);
    class procedure OnExecProceXPMenuClick(Sender: TObject);
    class procedure OnDependsMenuClick(Sender: TObject);
    class procedure OnResourceBuildMenuClick(Sender: TObject);
    class procedure OnIBExpertMenuClick(Sender: TObject);
    class procedure OnDelphiHelpMenuClick(Sender: TObject);
    class procedure OnDelphiVCLHelpMenuClick(Sender: TObject);
  public
    class procedure CreateMenus;
  end;

{ TIDEHelpMenu }

function GetActiveProjectGroup: IOTAProjectGroup;
var
  I: Integer;
begin
  Result := nil;
 
  with BorlandIDEServices as IOTAModuleServices do
    for I := 0 to ModuleCount - 1 do
      if Supports(Modules[I], IOTAProjectGroup, Result) then
        Exit;
end;
 
function GetActiveProject: IOTAProject;
var
  ProjectGroup: IOTAProjectGroup;
  I: Integer;
begin
  Result := nil;
 
  ProjectGroup := GetActiveProjectGroup;
  if Assigned(ProjectGroup) then
    Result := ProjectGroup.ActiveProject
  else
    with BorlandIDEServices as IOTAModuleServices do
      for I := 0 to ModuleCount - 1 do
        if Supports(Modules[I], IOTAProject, Result) then
          Break;
end;

procedure TIDEHelpMenu_ASPack.Execute;
var
  oDlg: TOpenDialog;
  sFileName, sOutPutFileName, sCommand: string;
  iProject: IOTAProject;
begin
  oDlg := TOpenDialog.Create(nil);
  try
    oDlg.Filter := '可执行文件|*.exe;*.dll;*.bpl';
    iProject := GetActiveProject;
    if iProject <> nil then
      oDlg.FileName := GetActiveProject.ProjectOptions.TargetName;
    if oDlg.Execute then
    begin                                                               
      sFileName := oDlg.FileName;
      sOutPutFileName := ExtractFilePath(sFileName) + 'ASPack_' + ExtractFileName(sFileName);
      sCommand := Format('ASPack %s /O%s', [sFileName, sOutPutFileName]);
      WinExec(PChar(sCommand), SW_HIDE);
    end
    else
      WinExec(PChar('ASPack'), SW_HIDE);
  finally
    oDlg.Free;
  end;
end;

function TIDEHelpMenu_ASPack.GetIDString: string;
begin
  Result := 'Henreash.ASPack';
end;

function TIDEHelpMenu_ASPack.GetMenuText: string;
begin
  Result := 'ASPack快捷方式';
end;

function TIDEHelpMenu_ASPack.GetName: string;
begin
  Result := 'ASPack快捷方式';
end;

function TIDEHelpMenu_ASPack.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure Register;
begin
  TIDEExtend.CreateMenus;
  //RegisterPackageWizard(TIDEHelpMenu_ASPack.Create);
  //RegisterPackageWizard(TIDEHelpMenu_Kill.Create);
end;

{ TIDEHelpMenu_Kill }

procedure TIDEHelpMenu_Kill.Execute;
  procedure EndProcess(AFileName: string);
  const
    PROCESS_TERMINATE = $0001;
  var
    ContinueLoop: BOOL;
    FSnapShotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
  begin
    FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(AFileName))
      or (UpperCase(FProcessEntry32.szExeFile ) = UpperCase(AFileName))) then
      TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
                      FProcessEntry32.th32ProcessID), 0);
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  end;

var
  sFileName: string;
begin
  if GetActiveProject = nil then
    Exit;
  sFileName := ExtractFileName(GetActiveProject.ProjectOptions.TargetName);
  EndProcess(sFileName);
end;

function TIDEHelpMenu_Kill.GetIDString: string;
begin
  Result := 'Henreash.Kill';
end;

function TIDEHelpMenu_Kill.GetMenuText: string;
begin
  Result := '结束当前项目进程';
end;

function TIDEHelpMenu_Kill.GetName: string;
begin
  Result := '结束当前项目进程';
end;

function TIDEHelpMenu_Kill.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

{ TIDEExtend }

class procedure TIDEExtend.CreateMenus;
var
  iServices: INTAServices;
  oMainMenu: TMainMenu;
  oMainItem: TMenuItem;
  oASPackItem: TMenuItem;
  oKillItem: TMenuItem;
  oPjtOutputDirItem: TMenuItem;
  oProceXPItem: TMenuItem;
  oDependsItem: TMenuItem;
  oResourceBuild: TMenuItem;
  oIBExpert: TMenuItem;
  oToolsItem: TMenuItem;
  oDelphiVCLHelpTtem: TMenuItem;
begin
  iServices := (BorlandIDEServices as INTAServices);
  oMainMenu := iServices.MainMenu;
  oMainItem := TMenuItem.Create(oMainMenu);
  oMainItem.AutoHotkeys := maManual;
  oMainItem.Caption := '扩展功能(&g)';
  oMainMenu.Items.Add(oMainItem);

  oKillItem := TMenuItem.Create(oMainMenu);
  oKillItem.Caption := '结束当前项目进程(&k)';
  oKillItem.OnClick := OnKillMenuClick;
  oMainItem.Add(oKillItem);

  oPjtOutputDirItem := TMenuItem.Create(oMainMenu);
  oPjtOutputDirItem.Caption := '项目输出目录(&o)';
  oPjtOutputDirItem.OnClick := OnPjtOutputDirMenuClick;
  oMainItem.Add(oPjtOutputDirItem);

  oToolsItem := TMenuItem.Create(oMainMenu);
  oToolsItem.Caption := '常用工具(&t)';
  oMainItem.Add(oToolsItem);

  oASPackItem := TMenuItem.Create(oMainMenu);
  oASPackItem.Caption := '&ASPack快捷方式';
  oASPackItem.OnClick := OnASPackMenuClick;
  oToolsItem.Add(oASPackItem);

  oProceXPItem := TMenuItem.Create(oMainMenu);
  oProceXPItem.Caption := 'ProceX&P';
  oProceXPItem.OnClick := OnExecProceXPMenuClick;
  oToolsItem.Add(oProceXPItem);

  oDependsItem := TMenuItem.Create(oMainMenu);
  oDependsItem.Caption := '&Depends';
  oDependsItem.OnClick := OnDependsMenuClick;
  oToolsItem.Add(oDependsItem);

  oResourceBuild := TMenuItem.Create(oMainMenu);
  oResourceBuild.Caption := '资源编译器(&r)';
  oResourceBuild.OnClick := OnResourceBuildMenuClick;
  oToolsItem.Add(oResourceBuild);

  oIBExpert := TMenuItem.Create(oMainMenu);
  oIBExpert.Caption := '&IBExpert';
  oIBExpert.OnClick := OnIBExpertMenuClick;
  oToolsItem.Add(oIBExpert);

  oDelphiVCLHelpTtem := TMenuItem.Create(oMainMenu);
  oDelphiVCLHelpTtem.Caption := 'Delphi VCL Help';
  oDelphiVCLHelpTtem.OnClick := OnDelphiVCLHelpMenuClick;
  oMainItem.Add(oDelphiVCLHelpTtem);
end;

class procedure TIDEExtend.OnASPackMenuClick(Sender: TObject);
var
  oASPack: TIDEHelpMenu_ASPack;
begin
  oASPack := TIDEHelpMenu_ASPack.Create;
  try
    oASPack.Execute;
  finally
    oASPack.Free;
  end;
end;

class procedure TIDEExtend.OnDelphiHelpMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  ShellExecute(0, 'Open', pchar(sMyToolsDir + '\Delphi2007Help.chm'), nil, nil, SW_SHOWNORMAL)
end;

class procedure TIDEExtend.OnDelphiVCLHelpMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  ShellExecute(0, 'Open', pchar(sMyToolsDir + '\delphi2007vclwin32.chm'), nil, nil, SW_SHOWNORMAL)
end;

class procedure TIDEExtend.OnDependsMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  WinExec(PChar(sMyToolsDir + '\Depends.exe'), SW_SHOW);
end;

class procedure TIDEExtend.OnExecProceXPMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  WinExec(PChar(sMyToolsDir + '\ProceXP.exe'), SW_SHOW);
end;

class procedure TIDEExtend.OnIBExpertMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  WinExec(PChar(sMyToolsDir + '\IBExpert\IBExpert.exe'), SW_SHOW);
end;

class procedure TIDEExtend.OnKillMenuClick(Sender: TObject);
var
  oKill: TIDEHelpMenu_Kill;
begin
  oKill := TIDEHelpMenu_Kill.Create;
  try
    oKill.Execute;
  finally
    oKill.Free;
  end;
end;

class procedure TIDEExtend.OnPjtOutputDirMenuClick(Sender: TObject);
var
  sDir: string;
  iProject: IOTAProject;
begin
  iProject := GetActiveProject;
  if iProject = nil then
    Exit;
  sDir := ExtractFilePath(iProject.ProjectOptions.TargetName);
  WinExec(PChar('explorer ' + sDir), SW_SHOW);
end;

class procedure TIDEExtend.OnResourceBuildMenuClick(Sender: TObject);
var
  sMyToolsDir: string;
  oReg: TRegistry;
begin
  sMyToolsDir := THelpClass.ReadEvnVariant('MyTools');
  WinExec(PChar(sMyToolsDir + '\xasoftBrcc32\ResBuild.exe'), SW_SHOW);
end;

{ THelpClass }

class function THelpClass.ReadEvnVariant(const AName: string): string;
var
  oReg: TRegistry;
const
  REG_ENVIRONMENT = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
begin
  oReg := TRegistry.Create;
  try
    oReg.RootKey := HKEY_LOCAL_MACHINE;
    if not oReg.OpenKey(REG_ENVIRONMENT, True) then
    begin
      MessageDlg('打开注册表发生错误', mtInformation, [mbYes], 0);
      Exit;
    end;
    Result := oReg.ReadString(AName);
  finally
    oReg.Free;
  end;
end;

end.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值