如何正确显示基于资源管理器的右键单击菜单

时间:2013-03-16 18:00:23

标签: delphi properties menu lazarus right-click

我使用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中它也是实际的。

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

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

1 个答案:

答案 0 :(得分:3)

您尚未指定错误编号,但当我尝试复制这些步骤时,OleCheck调用失败并显示0x80270000。保存错误位的高字部分是0x27(39),即{winerror.h'中定义的FACILTY_SHELL。如您所见,低位字为“0”,shell不提供任何特定的错误代码,实际上代码与ERROR_SUCCESSNO_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;
    ...