【问题标题】:How correct show the Explorer-based right-click menu如何正确显示基于资源管理器的右键菜单
【发布时间】:2013-03-16 18:00:23
【问题描述】:

我使用 Sertac Akyuz 在此处回答时放置的代码创建此菜单: Show the default right-click menu - Delphi 而且效果很好,但是有问题: 当我点击创建的菜单时:删除(删除文件以回收)-它问我:Are you sure want to delete?

当我单击“是”时 - 它工作正常,但当我单击“否”时 - 它显示错误, 我在调试器中看到,错误在线:

OleCheck(ContextMenu.InvokeCommand(CommandInfo));

Error: ###(gdb unparsed remainder:s 0x0 out of bounds>)###.

我使用 Lazarus,但我认为,在 Delphi 中它也是实际的。

在我看来,菜单(窗口)试图返回我的程序答案 - 不,在这种情况下会发生错误。

如何解决这个问题?回答“否”如何正确解决这种情况?

【问题讨论】:

  • 尝试在Double Commander 来源中挖掘它的实现:svn co https://doublecmd.svn.sourceforge.net/svnroot/doublecmd doublecmd
    我不确定,但可以在此文件中找到答案:doublecmd\trunk\src\platform\win\ushellcontextmenu.pas
  • 请不要将 debug-runtime-issue-in-lazarus 标记为 delphi。这很令人困惑。如果您问的是调试问题,请选择一个工具。

标签: delphi properties menu lazarus right-click


【解决方案1】:

您尚未指定错误编号,但当我尝试复制这些步骤时,OleCheck 调用失败并显示0x80270000。保存错误位的高位字部分是0x27 (39),即“winerror.h”中定义的FACILTY_SHELL。可以看到,低位字是'0',shell没有给出具体的错误代码,实际上代码和ERROR_SUCCESS或者NO_ERROR是一样的。

我的解释是,shell 只是通知命令(删除操作)失败。失败是由于用户取消了操作。我的建议是,根据您的需要相应地修改代码。您知道操作失败,但您可以选择忽略它,或者可能通知用户。也许是这样的:

var
  ...
  InvokeResult: HRESULT;
begin

  ...
//      OleCheck(ContextMenu.InvokeCommand(CommandInfo));
      InvokeResult := ContextMenu.InvokeCommand(CommandInfo);
      if not Succeeded(InvokeResult) then begin
        if LoWord(InvokeResult) = NO_ERROR then
          ShowMessage('Command did not carried out')
        else
          OleError(InvokeResult);
      end;
    ...

【讨论】:

  • 但是如果我不想分析结果,我可以这样做:试试 OleCheck(ContextMenu.InvokeCommand(CommandInfo));除了结束;或者简单地说: InvokeResult := ContextMenu.InvokeCommand(CommandInfo);不分析结果。
  • 您的代码是正确的 - 没有菜单项:重命名。在我的应用程序中我不需要这个项目,但理论上:我们如何修改代码以显示项目:重命名并处理对该项目的点击并显示用户可以重命名的特殊表单。
  • @user - 您的第二条评论。是的,simply 部分将是要走的路,如果您不想检查结果,请不要调用 OleCheck。对于第 3 条评论 - 通常您会编写一个 shell 扩展,请参阅this question。我不知道是否可以在菜单显示后对其进行干预,如果您愿意,可以提出问题。而且,不客气。 :)
  • 我的意思是在标准资源管理器菜单中 - 有项目重命名,我检查了创建此菜单的其他一些实施变体,并且有项目重命名。
  • 我想我明白了:如果在 QueryContextMenu 命令中使用标志 CMF_CANRENAME,则会出现重命名项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多