在 Delphi 应用程序中结束或取消拖放操作
Ending or Cancelling a Drag Drop Operation in a Delphi Application
我正在从 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;
我通常只是在 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;
可能需要将 fileList 变量改为 TStringList 并复制 那里的信息,以防在 Drop 事件退出时结束对 IStringList 的引用,但是一般原则是相同的 - 不要处理 Drop 事件中的数据,将其推迟到 Drop 事件退出后。
我正在从 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;
我通常只是在 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;
可能需要将 fileList 变量改为 TStringList 并复制 那里的信息,以防在 Drop 事件退出时结束对 IStringList 的引用,但是一般原则是相同的 - 不要处理 Drop 事件中的数据,将其推迟到 Drop 事件退出后。