臭虫在Delphi VCL拖放?

我用Delphi 2007编译的应用程序都拖动和网格之间拖放和正常工作的大部分时间。 但有时随机我得到了访问冲突。 我把它给调试方法Controls.pas在DragTo VCL。

它是这样开始的:

begin if (ActiveDrag <> dopNone) or (Abs(DragStartPos.X - Pos.X) >= DragThreshold) or (Abs(DragStartPos.Y - Pos.Y) >= DragThreshold) then begin Target := DragFindTarget(Pos, TargetHandle, DragControl.DragKind, DragControl);

例外的最后一行是因为DragControl为零。 DragControl是类型的TControl的全局变量。 我曾试图平息这种方法与assigncheck如果DragControl =零打电话CancelDrag,但失败也是因为DragObject也为零。

procedure CancelDrag; begin if DragObject <> nil then DragDone(False); DragControl := nil; end;

为了找出原因DragControl为零我检查DragInitControl。 有2条线,只是退出,如果DragControl为零。

procedure DragInitControl(Control: TControl; Immediate: Boolean; Threshold: Integer); var DragObject: TDragObject; StartPos: TPoint; begin DragControl := Control; try DragObject := nil; DragInternalObject := False; if Control.FDragKind = dkDrag then begin Control.DoStartDrag(DragObject); if DragControl = nil then Exit; if DragObject = nil then begin DragObject := TDragControlObjectEx.Create(Control); DragInternalObject := True; end end else begin Control.DoStartDock(DragObject); if DragControl = nil then Exit; if DragObject = nil then begin DragObject := TDragDockObjectEx.Create(Control); DragInternalObject := True; end; with TDragDockObject(DragObject) do begin if Control is TWinControl then GetWindowRect(TWinControl(Control).Handle, FDockRect) else begin if (Control.Parent = nil) and not (Control is TWinControl) then begin GetCursorPos(StartPos); FDockRect.TopLeft := StartPos; end else FDockRect.TopLeft := Control.ClientToScreen(Point(0, 0)); FDockRect.BottomRight := Point(FDockRect.Left + Control.Width, FDockRect.Top + Control.Height); end; FEraseDockRect := FDockRect; end; end; DragInit(DragObject, Immediate, Threshold); except DragControl := nil; raise; end; end;

可能是这个原因......所以我的问题。

  1. 有没有人有拖放类似的问题?
  2. 如果我发现DragControl =无我怎么能取消当前拖放?

编辑:目前我没有解决这个,但我可以添加一些关于它的更多信息。 该网格被称为超级电网。 这是我们发展到满足我们的需要的内部组件。 它的DevExpress继承TcxGrid。 我认为,(但不知道),这个问题来当用户在同一时间将一个网格行电网重载数据。 不知怎的,参考当前行变成零。 从长远来看,我们有计划,一个大胆的了解网格替换这个超级电网(我们用粗体德尔福)也从TcxGrid继承。 然后,电网一旦数据被改变(由用户或代码中没有刷新)更新,并希望这解决问题。

--------------解决方案-------------

  1. 不,我从来没有任何拖放通过VCL的问题(其中一种),而我与它相当的经验。
  2. DragControl是本地的控制单元,那么你如何检测DragControl = nil生产代码中? 通常情况下,有没有必要检查吧,至少我从来没有。 取消拖动操作,然后其他通过释放在没有接受目标鼠标,或按ESC键,通过调用完成CancelDrag 。 而当你发现自己已经,即程序调用DragDone只有当DragObject <> nil 。 因此appearantly DragObject是零已经说有,没有进行拖动操作(再)。

另外,你的意见,即在AV源是从在该特定线Controls.DragTo似乎是错误的。 在一个正常的拖放操作, DragControlnil不会导致一个AV。 然而,随着Controls.DragFindTarget ,它可以在一拖码头作业有问题,但你没有提到做任何对接。

请您在什么情况下,或者用什么代码这个“错误”出现澄清?

分类:德尔福 时间:2015-03-15 人气:3
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.941 (s). 10 q(s)