Melander Drag& Dop - OnClick永远不会执行

时间:2014-01-17 15:01:59

标签: delphi drag-and-drop

我有一个特定于Melander's Drag& Drop(v5.2)的问题。我希望这适合StackOverflow。我想将一些文件从TFileListBox拖到另一个控件,我使用此代码来执行此操作:

procedure TFrmManager.FileListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
VAR i: Integer;
begin
 //EXIT;    <-------- 'Exit' makes the OnClik work

 { DRAG BETWEEN INTERNAL CONTROLS }
 if DragDetectPlus(TWinControl(Sender)) then      <------------- HERE IS THE 'BLACKHOLE'
  begin
    Frm1.DropFileSource.Files.Clear;          { Delete anything from a previous drag }
    Frm1.DropFileSource.Files.Add(FileList.Items[0]);
    Frm1.DropFileSource.Execute;               { Start the drag operation }
  end;
end;

然后我在FileListBox的OnClick中有一些代码:

procedure TFrmManager.FileListClick(Sender: TObject);
begin
 Preview(Sender);   <------ Never executes
end;

事情是,一旦执行DragDetectPlus,FileListBox.OnClick就永远不会执行。换句话说,如果我将EXIT放在MouseDown过程的顶部,那么OnClick就可以了。 我做错了什么?

(我希望我能很好地解释这个问题)。


更新: 我刚刚尝试了Melander软件包中提供的“源演示”演示项目。在多次拖动文件后,我设法冻结它和整个IDE。我也在我的应用程序中观察到了这种行为。所以看来这个伟大的图书馆(我真的非常喜欢它)有一些严重的问题。太伤心了。

1 个答案:

答案 0 :(得分:2)

IDE冻结是由IDE中的错误引起的。我在D2006或D2007现场测试期间进行了报告,所以毫不奇怪它尚未修复。

问题的原因是调试器死锁。其中一个单元(DropSource AFAIR)中有一些代码可以通过在调试应用程序时基本上禁用IDE作为放置目标来解决它。它正在使用一些未记录的Windows内容,我不记得它是否默认启用,所以你必须自己挖一点。您使用BTW的哪个版本的Delphi和Windows?

WRT你的原始问题,你不能同时检测拖动的开始(DragDetectDragDetectPlus期望有OnClick火。 DragDetect*通过从Windows消息队列中读取鼠标移动和上/下消息来工作。用于生成OnClick事件(特别是WM_LBUTTONUP消息)的相同消息。

常规DragDetect将在DragDetectPlus将其留在队列中时从队列中删除邮件。无论你使用哪一个拖拽操作本身都会改变消息队列的内容,所以一旦DropSource.Execute返回,消息可能不再在队列中。

作为一种解决方法,我建议您直接从OnClick处理程序调用{​​{1}}处理程序。