2

Outlook から電子メールの添付ファイルをドラッグ アンド ドロップしています。ファイルは仮想ツリー ビューにドロップされます。

ドラッグ オーバー イベントの最後にあるインポート機能では、ファイルの処理に時間がかかり、機能が終了するまで Outlook アプリケーションがフリーズします。

関数の途中でドラッグ操作を終了できるようにしたい。

procedure TForm.vstItemsDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  fileList          : IStringList;
  drop              : IOleDrop;
begin
  fileList:= TIStringList.Create;

  drop := COleDrop.Create.def(DataObject);
  fileList := drop.GetDroppedFileList(fileWarnings);

  //I want to terminate the drag operator here because I already have what I need

  //This imports parts takes a while to run so I want to end the drag and drop operation
  //Outlook freezes still has cursor state on copy and doesn't respond to clicks or ESC
  ImportParts( fileList)    
end;
4

1 に答える 1

4

私は通常、Drop イベントで情報を取得し (つまり、処理しません)、処理する新しい情報があるというメッセージをフォームに送り返します。したがって、Drop イベントはすぐに終了し、メッセージ ハンドラーは、ドロップされたものをピックアップして処理します。

あなたの場合、次のようなものを作成する必要があります。

CONST
  WM_PROCESS_DROPPED_FILES = WM_USER+42;

TYPE
  TMainForm = CLASS(TForm)
                .
                .
              PRIVATE
                fileList : IStringList; // Ie. move the declaration here...
                PROCEDURE ProcessFiles(VAR MSG : TMessage); MESSAGE WM_PROCESS_DROPPED_FILES;
                .
                .
              END;

そしてドロップイベントで、fileListの宣言を削除し(ローカル変数ではなくフォームのプライベートメンバーにしました)、置き換えます

ImportParts(fileList)

PostMessage(Handle,WM_PROCESS_DROPPED_FILES)

次に実装します

PROCEDURE TMainForm.ProcessFiles(VAR MSG : TMessage);
  BEGIN
    ImportParts(fileList)
  END;

Drop イベントの終了時に IStringList への参照が終了する場合は、代わりに fileList 変数を TStringList にして、そこに情報をコピーする必要があるかもしれませんが、一般的な原則は同じです - Drop でデータを処理しないでください。 Drop イベントが終了したまで延期します。

于 2016-09-15T06:09:32.900 に答える