Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Key Events in an MDI Frame form

Posted on 2000-02-14
7
Medium Priority
?
1,357 Views
Last Modified: 2008-03-17
We have an MDI Application.  We'd like to trap key presses in the application when there are no children forms displayed/created.  In other words, when only the MDI Frame form is displayed, we'd like to track the key press events to start a function.

I've added handlers to the Key* events (KeyPress, KeyDown and KeyUp) on the Frame form (FormStyle fsMDIForm).  However, it never gets the events.  I'm presuming that, by creating the form as a MDI frame, windows sends the key events to the active child form.

Is there a way to, when there is no active child form, to get these events sent to the frame window?  I've tried to watch the HandleMessage procedure, but I wasn't having much luck.

Thanks
0
Comment
Question by:EdHillmann
[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
  • 3
  • 3
7 Comments
 
LVL 2

Accepted Solution

by:
hubdog earned 400 total points
ID: 2521403
you can process the application.onmessage event by yourself like this
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RxHook, AppEvnts;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (Msg.message=wm_keydown) and (mdichildcount=0)  then
  begin
    showmessage('keydown');
    handled:=true;
  end;
end;

end.

good luck
hubdog
0
 
LVL 2

Author Comment

by:EdHillmann
ID: 2521448
Hubdog...

That did the trick.  Here's my successful test.  This is with a form whose style is fsMDIForm....


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure MessageHandler(var Msg: TMsg; var Handled: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.message = wm_keydown) and (mdichildcount = 0)  then begin
    case Msg.wParam of
      VK_F2: begin
        ShowMessage('F2 Pressed!');
        Handled := true;
      end;
      VK_F3: begin
        ShowMessage('F3 Pressed!');
        Handled := true;
      end;
      VK_TAB: begin
        ShowMessage('Tab Pressed!');
        Handled := true;
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MessageHandler;
end;

end.


Thanks!!
0
 

Expert Comment

by:sevenofnine
ID: 5540161
Did either of you ever get any problems using this?  Once I added it to my app, I started getting errors like 'A WIN32 API function failed'?  Any suggestions?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 2

Author Comment

by:EdHillmann
ID: 5540200
Weird.  I didn't get any errors like that.  I'll clarify that I'm using D5, although I don't think there's anything specific to D5 in that.

Maybe first comment out the ShowMessage calls to see if that causes it.  Just comment out the code and run, incrementally adding code back in to find the culprit?

Did you try this example, cause there's not much in it.  Might be easier to find the nasty line.
0
 

Expert Comment

by:sevenofnine
ID: 5540315
Yeah, I tried the code.  The problem is whenever I try to create more than one or two MDI child forms - it's like there's a memory leak?
0
 

Expert Comment

by:sevenofnine
ID: 5540379
Just rebooted my PC and the problem has mysteriously gone away.  Sorry to bother you!
0
 
LVL 2

Author Comment

by:EdHillmann
ID: 5579782
Aahh, Windows.  When all else fails, reboot!  Have fun!
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Question has a verified solution.

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

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This course is ideal for IT System Administrators working with VMware vSphere and its associated products in their company infrastructure. This course teaches you how to install and maintain this virtualization technology to store data, prevent vuln…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
Suggested Courses

715 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