2014-01-29 68 views
1

我目前正在处理多表单应用程序,并且在注册del键时遇到问题,需要del键的应用程序是带有框架的表单,在它上面可以选择,按下del键后,所选对象将通过deleteObjects方法删除。我目前正在使用的代码如下删除密钥不会触发KeyUp&KeyDown事件

void __fastcall TF_Image::KeyUpKbd(WORD &Key) 
{ 
    if(Key == VK_DELETE || Key == VK_DKEY) 
    { 
      deleteSelectedObjects(); 
    } 
} 

(注:有在函数调用其他paramenters但他们不使用)

TF_Image从TFRAME

继承

我试图映射除了del键以外的其他键,即D键,并且发现该方法被调用没有问题。我发现当按下(物理上)del键时,不会调用与KeyUp相关的方法。

编辑:所以我试图添加DeleteSelectedOb()方法到我的WndProc方法没有太多的运气。

void __fastcall TF_ImgBrowserOA::WndProc(TMessage &Message) 
{ 
    if (Message.Msg == WM_KEYDOWN) 
    { 
     if (Message.WParam == VK_DELETE) 
     { 
      F_Image->DeleteSelectedOb(); 
     } 
    } 
    //code that manages window resize 
    TForm::WndProc(Message); 
} 

doent出现击键

+0

您的问题标题是“删除键不会触发KeyPress事件”,正如您已经注意到并现在编辑的那样。这就是我基于我的答案,但如果这不是你正在使用的事件,那么是的,我的答案不会帮助你。除非其他组件在您自己的事件处理程序获得该机会之前正在处理它们,否则Delete键应该会引发键向下和向上事件,假设该控件是具有键盘焦点的事件。如果您在没有其他组件的情况下尝试使用干净的表单,它会工作吗? – hvd

+0

在我的应用程序中没有其他任何形式的KeyUp或KeyDown事件处理程序,我试图检查的第一件事是它对第一个加载执行的表单的响应,再次事件没有触发,我怀疑它是一个系统处理事件之前我的表单被大声朗读,所以是否有一种方法来覆盖行为 –

+0

在XE3中使用TMemo时,我遇到了类似的问题,除了OnKeyUp是删除键触发的唯一事件。 –

回答

1

因此,在一些其他模块清理一些代码,消除不必要的菜单中的后,我决定回去看看在本节再次找到类似的代码实现类似的功能之后,我看不到它们之间有太大的区别,所以我重新编译并试图从KeyDown事件运行我的Delete函数,并且由于某种原因它刚刚工作,我怀疑它归结为应用程序中关注焦点的另一个元素的问题。作为一项预防措施,我还将SetFocus()称为我要求此代码运行的框架。对我来说,它仍然是一个谜,但为什么这并不起作用。

0

回应WndProc方法这里是我的TRichEdit控制(Script_Edit)片段。

TWndMethod *PrevWndProc = Script_Edit->WindowProc; 
Script_Edit->WindowProc = MyWndProc; 

void __fastcall My_Form::MyWndProc(TMessage &Message) { 

    switch (Message.Msg) { 

    case WM_KEYDOWN: { 
     // Check for DELETE and BACKSPACE keys 
     if(Message.WParam == VK_BACK || 
      Message.WParam == VK_DELETE 
     ) { 
      // Do whatever you need 
      } 
     break; 

    default: 
     // call default handler if not processed 
     PrevWndProc(Message); 

    } 
} 

你不能得到更接近比这与VCL的消息核心...

+0

所以我尝试了一些你所建议的东西,我的WndProc方法还处理与调整窗口大小相关的鼠标拖动 –