Disable Default Tab Behavior

I am using C++ Builder 5.  What I need to be able to do is to disable the default tab behavior for some controls on a form and replace it with my own handler.

The KeyDown and KeyPress events do not catch the Tab key, which is pretty annoying.  The KeyUp event catches the Tab key but only after the default action has already occured.  I need to be able to capture the Tab key before it is processed and replace the default behavior with some code of my own.

I am writing a huge application and will need to implement this on a lot of forms (~150) so a simple answer would be preferred.


Thanks!

-Adrian
LVL 12
AdrianSRUAsked:
Who is Participating?
 
mcantiConnect With a Mentor Commented:
Hi,

I'm using this method for catching all keys before they get processed by the default action handler:

I made myself a base-form class, which inherits directly from TForm. In the OnShortcut event of this base class, I check the Msg.CharCode parameter to see if it is a key I want to special-process. If it is, then I do the action for it and set Handled = true, else Handled = false; return;

That's about it. For any other questions, please reply...
0
 
mcantiCommented:
I think you can check for the tab key in this event by matching Msg.CharCode against VK_TAB constant:

if (Msg.CharCode == VK_TAB)
{
 // Do Action;
  Handled = true;
}
else
{
  Handled = false;
}
return;
0
 
George TokasCommented:
Another way is to use the GetKeyState(VK_TAB) or GetAsyncKeyState(VK_TAB) at an idle function at your Form.
Example:
void __fastcall TForm1::IdleLoop(TObject*, bool &done)
{
        TShiftState Shift;
        done = false;
        if(GetAsyncKeyState(VK_TAB) != 0 ){
         ShowMessage("TAB Press");
         Form1->KeyDown(0,Shift);//Pass control at form's keydown with a dummy key.
         return;}
}

gtokas.
0
 
AdrianSRUAuthor Commented:
mcanti, BRILLIANT!!!!!

I never thought it would be this easy.  I already have all of my forms inherit from a base-class in order to add additional functionality so I won't even have to modify every form.  When OnShortCut captures the tab key, I give the OnKeyDown function of the active control a chance to handle it.  If the control does not handle the tab key, then the default behavior is used.

WORD Key = Msg.CharCode;
if( Key != VK_TAB || ActiveControl == NULL )
    return;

AnsiString className = ActiveControl->ClassName( );
if( className == AnsiString( "TEdit" ) )
{
    if( ( ( TEdit * ) ActiveControl )->OnKeyDown != NULL )
        ( ( TEdit * ) ActiveControl )->OnKeyDown( ActiveControl, Key, TShiftState( ) );
}
//repeat for other control types.

if( Key == 0 )
    Handled = true;


gtokas, thanks for the response.  Your solution sounds like it would work but mcanti's solution is the one for me.


-Adrian
0
 
mcantiCommented:
I'm glad I could help you.
I'm glad we can help each other.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.