سؤال

I am currently dealing with a multi-form application and am having issue registering a del key press, the application that requires the del key is a form with a frame on it with objects painted on it that can be selected, upon pressing the del key the selected objects are to be deleted via a deleteObjects method. The code I am currently using is as follows

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

(Note: There are other paramenters in the function call but they aren't used)

TF_Image inherits from TFrame

I have tried mapping other keys other than the del key ie the D key and have found that the method is called with no problem. I have discovered that when pressing (physically) the del key the methods associated with KeyUp & KeyDown are not called.

Edit: So i've attempted to add the DeleteSelectedOb() method to my WndProc method without much luck either.

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);
}

The WndProc method doent appear to respond to keystrokes

هل كانت مفيدة؟

المحلول

So after cleaning up some code in some other modules and removing unneccessary menu's I decided to go back and look at this section again after I found a similar piece of code implementing a similar function, I couldn't see much difference between them and so I recompiled and attempted to run my Delete function from the KeyDown event and for some reason it just worked, I suspect it came down to an issue of another element holding focus in the Application. As a precaution I also called a SetFocus() to the frame in which I required this code to operate in. Its still a mystery to me why this didn't work intially though.

نصائح أخرى

Here is a snippet for my TRichEdit control (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);

  }
}

You can't get much closer to the message core than this with VCL...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top