我有一个程序,实现一些消息传递功能,客户端使用
Indy TcpClient;用一个单独线程监听收到的消息。
收发消息时会动态生成或释放一些 TabSheet,
刚运行时程序正常,收发若干消息后
会出现按任意键均报错的现象,错误是Access violation,
在集成环境中运行出现异常转入调试模式也没有跳到出错代码。
可我并没有在ApplicationMessage中处理按键消息,
请教高手,问题可能出在什么地方?
我真是没办法了。天哪!!!

解决方案 »

  1.   

    5555,没人理我啊,再问一下。     
         我又试了一下,屏蔽PageControl的WM_KEYDOWN消息后不会出现错误提示
         (设置PageControl的WindowProc处理发给PageControl的消息),但如果
         PageControl中的某个TabSheet上有TEdit时,当该Edit获得输入焦点时
         按键则仍然出现错误
         
         这是为什么呢?请教高手Delphi是怎么在VCL控件中Dispatch消息的,
         默认又是怎么处理的呢?可能是什么原因导致出现Access Violation的
         呢?
         
         Thanks for your help.
      

  2.   

    出现这种错误的原因很多,根据我经验,一般是资源没有释放,或者是资源没有分配空间就直接访问!
    分派消息是循环分配的啊,该是谁的消息就是谁的啊,你是怎么捕获消息的啊!
    怎么edit的keydown你也捕获给pagecocontrol了啊,难道你处理的是formkeydown
      

  3.   

    我不是说把edit的消息捕获给Pagecontrol,
    只是屏蔽了Pagecontrol的WM_KEYDOWN消息
    这样当TabSheet上没有Edit之类的控件时,按键
    就不会报错,而当在Edit中按键时因为我没有处理
    该消息,按说系统会缺省处理的,但是总是报错,
    不知道是否和线程有关。
      

  4.   

    啊啊啊啊,帮帮我啊
    还是没有解决这个问题,
    我跟踪发现在TEdit获TMemo中按键执行到Forms单元中
    TApplication.IsKeyMsg时出错,
    我把该函数拷贝到ApplicationMessage中自己处理按键消息,
    发现执行到
    if SendMessage(Wnd, CN_BASE + Message, WParam, LParam) <> 0 then
              Result := True;
    时出错,不知道系统为什么没有找到该控件,
    我看了,wnd指针地址与刚开始执行时的值是一样的,
    那为什么开始能正确相应按键消息,后来就
    Access violation了呢?
    请高手指教。而且在TMemo中点鼠标右键“粘贴”可以正常反应, 会将剪贴版内容添加到Memo中,也不出错
    真不知道为什么按键消息处理就错了呢.
      

  5.   

    我现在自己处理了这个消息,
    直接调用
    TranslationMessage(Msg);
    DispatchMessage(Msg);
    不会报错了,
    可惜Tab,Enter键对获取焦点控件的切换、处理也相应失效了,
    各位有什么好办法吗?