Recent

Author Topic: Keypresses in embedded forms  (Read 1157 times)

trayres

  • Jr. Member
  • **
  • Posts: 87
Keypresses in embedded forms
« on: May 01, 2018, 05:53:45 am »
I have a TPageControl; in that PageControl, I have TTabSheets that are embedded forms.

They're created dynamically - so far so good!

But if the TTabSheet form is selected, I'd like to access keypresses and handle them within the logic of the embedded form (that's not as sub-optimal as it sounds: Each of the different tabs can be a totally different form, with responding to different keypresses).

However I don't seem to be able to grab the keypresses. I've tried setting the keypreviews and using 'SetFocus' directly, but still no joy.

I must be missing something; any help is greatly appreciated. Thanks all!

Handoko

  • Hero Member
  • *****
  • Posts: 2694
  • My goal: build my own game engine using Lazarus
Re: Keypresses in embedded forms
« Reply #1 on: May 01, 2018, 06:33:06 am »
Can you provide a demo source code, which we can compile and test?

trayres

  • Jr. Member
  • **
  • Posts: 87
Re: Keypresses in embedded forms
« Reply #2 on: May 01, 2018, 05:04:38 pm »
Ok, attached is a very simple example.

If you press 'A', the main form catches it. Cool, as expected.

If you use the menu's only option to add a tabsheet, it embeds a form2 correctly, but I cannot seem to catch keypresses to it!

Thaddy

  • Hero Member
  • *****
  • Posts: 7228
Re: Keypresses in embedded forms
« Reply #3 on: May 01, 2018, 05:39:45 pm »
Because you have to shift focus to it and you do not ....? Note you need to shift focus to a control that actually can receive focus.
On the keypress event also shift focus.
« Last Edit: May 01, 2018, 05:41:40 pm by Thaddy »
inline variables like in D10.3 are a bit like Brexit: if you are given the wrong information it sounds like a good idea. Every kid loves candy, but it makes you fat and your teeth will disappear.

Handoko

  • Hero Member
  • *****
  • Posts: 2694
  • My goal: build my own game engine using Lazarus
Re: Keypresses in embedded forms
« Reply #4 on: May 01, 2018, 05:41:32 pm »
@trayres

I tested your code, I saw you put a TForm inside a TTabsheet. That is not the correct thing to do.

Code: Pascal  [Select]
  1. procedure TForm1.MenuItem2Click(Sender: TObject);
  2. var
  3.   AForm2: TForm2;
  4.   ATabSheet: TTabSheet;
  5. begin
  6.   ATabSheet := TTabSheet.Create(PageControl1);
  7.   AForm2 := TForm2.Create(ATabSheet);
  8.   ATabSheet.PageControl := PageControl1;
  9.   AForm2.Align := alClient;
  10.   AForm2.BorderStyle := bsNone;
  11.   AForm2.Parent := ATabSheet;
  12.   AForm2.Show;
  13.   ATabSheet.SetFocus;
  14.  
  15. end;

You should use a TFrame. If you don't know how to use it, read here:
http://wiki.freepascal.org/Frames

Thaddy

  • Hero Member
  • *****
  • Posts: 7228
Re: Keypresses in embedded forms
« Reply #5 on: May 01, 2018, 05:42:45 pm »
That's an even better solution.
inline variables like in D10.3 are a bit like Brexit: if you are given the wrong information it sounds like a good idea. Every kid loves candy, but it makes you fat and your teeth will disappear.

trayres

  • Jr. Member
  • **
  • Posts: 87
Re: Keypresses in embedded forms
« Reply #6 on: May 01, 2018, 08:16:36 pm »
It looks like this solves the issue totally and does exactly what I'd like!

Attached is a tiny demo; I added the constructors/destructors per the wiki page so I could initialize local variables.
Is there anything else to watch for in using frames?

Thanks for your help!

Handoko

  • Hero Member
  • *****
  • Posts: 2694
  • My goal: build my own game engine using Lazarus
Re: Keypresses in embedded forms
« Reply #7 on: May 01, 2018, 08:54:06 pm »
Tested, yes it works but the frame is not having the focus by default (at least on my Linux computer). You should 'force' the form's component to receive focus. You can use:

Code: Pascal  [Select]
  1.   ActiveControl.SelectNext(ActiveControl, True, True);

or

Code: Pascal  [Select]
  1.   AFrame.Button1.SetFocus;
« Last Edit: May 01, 2018, 09:17:29 pm by Handoko »