2013-03-16 62 views
3

我创建一个使用代码此菜单按Sertac Akyuz在回答放在这里: Show the default right-click menu - Delphi 和它的作品不错,但有问题:当我在创建菜单中单击 :删除(删除文件来回收) - 它问我:Are you sure want to delete?如何正确显示的基于Internet Explorer的右键菜单

当我点击是 - 它工作正常,但是当我点击没有 - 它让我看到一个错误, 我在调试器中看到的,错误是路线:

OleCheck(ContextMenu.InvokeCommand(CommandInfo)); 

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

我使用拉撒路,但我认为,吨德尔福的帽子也是实际的。

在我看来,菜单(Windows)试图返回到我的程序的答案 - 没有,并在这种情况下发生错误。

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

+0

请不要标记为德尔福调试运行时问题在拉撒路。这很混乱。如果你问一个调试问题,请选择一个工具。 – 2013-03-16 21:39:53

+1

尝试在[Double Commander](http://doublecmd.sourceforge.net/)资源中挖掘它的实现:'svn co https://doublecmd.svn.sourceforge.net/svnroot/doublecmd doublecmd'。
我不确定,但可能会在这个文件中找到答案:'doublecmd \ trunk \ src \ platform \ win \ ushellcontextmenu.pas' – Abelisto 2013-03-16 20:10:07

回答

3

您还没有指定错误号码,但是当我尝试复制这些步骤时,OleCheck呼叫失败,请拨打0x80270000。高位字部分保存错误位,为0x27(39),即'winerror.h'中定义的FACILTY_SHELL。正如你所看到的,低字是'0',外壳没有给出任何特定的错误代码,实际上代码与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; 
    ... 
+0

谢谢先生。塞尔特克Akyuz。有用。 – user2154246 2013-03-17 05:07:28

+0

但是,如果我不想分析结果,我可以这样做: 尝试OleCheck(ContextMenu.InvokeCommand(CommandInfo));除了结束; 或简单地说:InvokeResult:= ContextMenu.InvokeCommand(CommandInfo);而不分析结果。 – user2154246 2013-03-17 05:15:40

+0

你的代码是正确的 - 没有菜单项:重命名。 在我的应用程序中,我不需要此项目,但理论上:我们如何修改代码以显示项目:重命名并处理该项目的单击,并显示特殊窗体,用户可以在其中重命名。 – user2154246 2013-03-17 05:36:32

相关问题