鼠标进入自定义TPanel时访问冲突

时间:2014-02-22 15:30:38

标签: delphi delphi-xe3

我有一个处理TPanel的自定义WMNCHitTest。在运行时,当鼠标进入面板时,我得到以下AV:

  

项目ClientDatasetEditor.exe引发异常类$ C0000005,并显示消息'访问冲突位于0x00405219:读取地址0x0000000c'

调用堆栈显示:

> :00405219 SysGetMem + $30
• :0040b7c6 @DynArraySetLength + $A
• :005394e7 TWinControl.MainWndproc + $2F
• :004c945a StdWndProc + $16
• :76ff7694 user32.CaIINextt-iookEx + 0x97
• :76ff8baa; C: \WIND0WSysWOW64iser32.dII
• :76ff8468; C:\WINDOWSysW0W64iser32.dII
• :76ff9c40 user32.DispatchMessageW + Ox1O

关注WMNCHitTest句柄:

procedure tExGraphicControl.WMNCHitTest(var Message: tWMNCHitTest);
begin
  inherited;

  if not (csDesigning in  ComponentState) or
         (msOver      in fMouseStates   )    then Exit;

  if  Message.Msg = WM_NCRButtonUp then begin
      fMouseStates := [msLeftUp];
      Exit                      ;
  end;

  if  Message.Msg = WM_NCMBUTTONUP then begin
      fMouseStates := [msLeftUp];
      Exit                      ;
  end;

  if IsMouseOverControl (Self) then begin
     fMouseStates := [msOver, msMove];
     if  Assigned (fOnMouseEvent) then
          fOnMouseEvent (Self, fMouseStates);
  end;
end;

有关导致AV的原因的任何想法吗?

1 个答案:

答案 0 :(得分:0)

  

知道造成AV的原因是什么?

GetMem中的访问冲突是由堆损坏引起的。您的程序中存在损坏堆的缺陷。

跟踪故障的最佳方法是在完全调试模式下使用FastMM内存管理器。希望这可以告诉您代码中破坏堆的重点。