Solved

Waiting for a RETURN key in a TEdit.

Posted on 1997-04-04
8
384 Views
Last Modified: 2006-11-17
Hi everyone, I have an application which use the TDialog as the main window. I have a TEdit object which the user can type information. I would like to perform an action if the RETURN key is pressed. How can I intercept the RETURN key message?? I have tried WM_CHAR, WM_SYSCHAR but they don't seem to work. I never enter the EvChar function. Can someone provide some help. Thanks.
Regards,
Gerry
0
Comment
Question by:gcapwell
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
8 Comments
 
LVL 3

Accepted Solution

by:
gaohong earned 70 total points
ID: 1162568
Hi, gcapwell:

You have to process WM_KEYDOWN as
DEFINE_RESPONSE_TABLE1(RetEdit, TEdit)
  EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

void RetEdit::EvKeyDown(uint key, uint repeatCount, uint flags)
      {
        if(key == VK_TAB  || key == VK_RETURN ||             //left, right
           key == VK_UP   || key == VK_DOWN   ||             //up, down
           key == VK_HOME || key == VK_END    ||
           key == VK_NEXT || key == VK_PRIOR)
        {
            //do what you want
        }
      else
            TEdit::EvKeyDown(key, repeatCount, flags);
        }

good luck
gaohong xie

0
 

Author Comment

by:gcapwell
ID: 1162569
gaohong,
The TEdit object is in a TDialog. Do I add the WM_KEYDOWN event to the existing response table, or does the TEdit get it's own response table? I have tried to add it to the TDialog response table but it doesn't seem to work. Thanks for your help.
Regards, Gerry
0
 
LVL 3

Expert Comment

by:gaohong
ID: 1162570
look here, it is in TEdit, derive your special editor

DEFINE_RESPONSE_TABLE1(RetEdit, TEdit)
          EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

good luck

gaohong
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:gcapwell
ID: 1162571
I have done what you said and still receive the following errors:

Error:  FUNC.H(140,3):Ambiguous override of virtual base member 'TWindow::GetClassName()': 'TEdit::GetClassName()'
Error:  FUNC.H(140,3):Ambiguous override of virtual base member 'TWindow::GetClassName()': 'TDialog::GetClassName()'

To restate my problem. I have a TDialog with a TEdit control (one line of text allowed) and I would like to perform a function when RETURN is hit. I have two seperate response tables DECLARE_RESPONSE_TABLE1(EditObjs, TEdit) and DECLARE_RESPONSE_TABLE1(FuncDialog,TDialog) I also have two classes called EditObjs with a function EvKeyDown(UINT,UINT,UINT) as a member and another class FuncDialog. My EvKeyDown() function uses a variable 'X' in my FuncDialog:TDialog class.
How can I receive messages from both TEdit and TDialog and use variables shared by both?? Am I missing something? See below.

DEFINE_RESPONSE_TABLE1(FuncDialog,TDialog)
 EV_EN_CHANGE(IDC_FREQUENCY,EditSineWave),
END_RESPONSE_TABLE;
DECLARE_RESPONSE_TABLE(Freq);
DEFINE_RESPONSE_TABLE1(Freq,TEdit)
 EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

class EditObjs:TEdit
{
  protected:
  void EvKeyDown(UINT,UINT,UINT); <-- uses int X
}
class FuncDialog: TDialog
{
 other funcs
 int X;
}
end.
0
 

Author Comment

by:gcapwell
ID: 1162572
I have done what you said and still receive the following errors:

Error:  FUNC.H(140,3):Ambiguous override of virtual base member 'TWindow::GetClassName()': 'TEdit::GetClassName()'
Error:  FUNC.H(140,3):Ambiguous override of virtual base member 'TWindow::GetClassName()': 'TDialog::GetClassName()'

To restate my problem. I have a TDialog with a TEdit control (one line of text allowed) and I would like to perform a function when RETURN is hit. I have two seperate response tables DECLARE_RESPONSE_TABLE1(EditObjs, TEdit) and DECLARE_RESPONSE_TABLE1(FuncDialog,TDialog) I also have two classes called EditObjs with a function EvKeyDown(UINT,UINT,UINT) as a member and another class FuncDialog. My EvKeyDown() function uses a variable 'X' in my FuncDialog:TDialog class.
How can I receive messages from both TEdit and TDialog and use variables shared by both?? Am I missing something? See below.

DEFINE_RESPONSE_TABLE1(FuncDialog,TDialog)
 EV_EN_CHANGE(IDC_FREQUENCY,EditSineWave),
END_RESPONSE_TABLE;
DECLARE_RESPONSE_TABLE(EditObjs);
DEFINE_RESPONSE_TABLE1(EditObjs,TEdit)
 EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

class EditObjs:TEdit
{
  protected:
  void EvKeyDown(UINT,UINT,UINT); <-- uses int X
}
class FuncDialog: TDialog
{
 other funcs
 int X;
}
end.
0
 
LVL 3

Expert Comment

by:gaohong
ID: 1162573
I did see the place you handle WM_KEYDOWN in your editor

copy following to a .h file
#ifndef RETEDIT.H
#define RETEDIT.H

#include <owl\edit.h>

#pragma hdrstop

class RetEdit : virtual public TEdit
{
public:
      RetEdit::RetEdit(TWindow*        parent,
                         int             id,
                         const char far* text,
                         int x, int y, int w, int h,
                      uint            textLen = 0,
                      bool            multiline = false,
                      TModule*        module = 0);
      ~RetEdit() {;}

       void EvKeyDown(uint key, uint repeatCount, uint flags);

private: // hidden to prevent accidental copying or assignment
       RetEdit(const RetEdit&);
       RetEdit& operator =(const RetEdit&);

       DECLARE_RESPONSE_TABLE(RetEdit);
};

#endif


then copy following to .cpp file

#include above .h file

DEFINE_RESPONSE_TABLE1(RetEdit, TEdit)
  EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

RetEdit::RetEdit(TWindow*        parent,
                   int             id,
                   const char far* text,
                   int x, int y, int w, int h,
                   uint            textLen,
                   bool            multiline,
                   TModule*        module)
        :TEdit(parent, id, text, x, y, w, h, textLen, multiline, module)
      {
      }

void RetEdit::EvKeyDown(uint key, uint repeatCount, uint flags)
      {
        if(key == VK_TAB  || key == VK_RETURN ||             //left, right
           key == VK_UP   || key == VK_DOWN   ||             //up, down
           key == VK_HOME || key == VK_END    ||
           key == VK_NEXT || key == VK_PRIOR)
        {
            //do what you want, or post user message to
                //parent (your dialog) if you prefer to
                //handle it in your dialog
        }
      else
            TEdit::EvKeyDown(key, repeatCount, flags);
        }

If editor is from resource, make sure select check want return,
and use appropriate form of TEdit() constrcutor

good luck
gaohong xie
0
 

Author Comment

by:gcapwell
ID: 1162574
Gaohong, I was able to take your answers and incorporate them into my program without errors, but I still cannot intercept the keystrokes from the TEdit control. Do you have any simple example code you can upload? I am using the resource workshop and using the correct version of TEdit, but it doesn't seem to connect to the control properly. See below:

.h file
class RetEdit: virtual public TEdit
{
   public:
   RetEdit::RetEdit(TWindow* parent, int id, uint                  textlen,TModule* module);
   ~RetEdit();
   void EvKeyDown(uint, uint,uint);
   DECLARE_RESPONSE_TABLE(RetEdit);
};
;-----------------------------;
.cpp file

DEFINE_RESPONSE_TABLE1(RetEdit,TEdit)
 EV_WM_KEYDOWN,
END_RESPONSE_TABLE;

RetEdit::RetEdit(TWindow* parent, int id=IDC_FREQUENCY,uint textlen=8,TModule* module=0):TEdit(parent,id,textlen,module)
{
      
}
Thanks for your help.
Regards, Gerry
0
 

Author Comment

by:gcapwell
ID: 1162575
Gaohong, I was finally successful in intercepting keyboard inputs from the TEdit control.  Disregard my last comment. Thanks for all your help.

Best Regards,
Gerald Capwell
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
maze travler 6 66
returning a dereferenced pts in C++ 10 167
Socket Programming (Unix) 8 153
How to print into std::string like sprintf using C++11? 12 118
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question