4

Sertac Akyuzがここに答えて配置したコードを使用してこのメ​​ニューを作成します: デフォルトの右クリックメニューを表示します-Delphi とそれはうまく機能しますが、問題があります:作成されたメニューをクリックすると:削除(ファイルをリサイクルに削除)-それは尋ねます自分:Are you sure want to delete?

[はい]をクリックすると(問題なく動作しますが、[いいえ]をクリックすると)エラーが表示されます。デバッガーに表示されます。エラーはオンラインです。

OleCheck(ContextMenu.InvokeCommand(CommandInfo));

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

私はLazarusを使用していますが、Delphiでも実際に使用されていると思います。

メニュー(ウィンドウ)が私のプログラムに答えを戻そうとしているように見えます-いいえ、この状況ではエラーが発生します。

この問題を解決する方法は?「いいえ」と答えてこの状況をどの程度正しく解決しますか?

4

1 に答える 1

3

エラー番号を指定していませんが、手順を複製しようとすると、OleCheck呼び出しが。で失敗しまし0x80270000た。エラービットを除いた上位ワード部分は0x27(39)であり、これFACILTY_SHELLは「winerror.h」で定義されているとおりです。ご覧のとおり、下位ワードは「0」であり、シェルは特定のエラーコードを生成しません。実際、コードはまたはと同じERROR_SUCCESSですNO_ERROR

私の解釈では、シェルはコマンド(削除操作)が失敗したことを通知しているだけです。失敗は、ユーザーが操作をキャンセルしたことが原因です。私の提案は、適切と思われるようにコードを適宜変更することです。操作が失敗したことはわかっていますが、それを無視するか、ユーザーに通知することもできます。多分このようなもの:

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;
    ...
于 2013-03-17T02:54:15.367 に答える