Lazarus

Programming => LCL => Topic started by: trayres on May 01, 2018, 05:53:45 am

Title: Keypresses in embedded forms
Post by: trayres 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!
Title: Re: Keypresses in embedded forms
Post by: Handoko on May 01, 2018, 06:33:06 am
Can you provide a demo source code, which we can compile and test?
Title: Re: Keypresses in embedded forms
Post by: trayres 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!
Title: Re: Keypresses in embedded forms
Post by: Thaddy 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.
Title: Re: Keypresses in embedded forms
Post by: Handoko 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
Title: Re: Keypresses in embedded forms
Post by: Thaddy on May 01, 2018, 05:42:45 pm
That's an even better solution.
Title: Re: Keypresses in embedded forms
Post by: trayres 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!
Title: Re: Keypresses in embedded forms
Post by: Handoko 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;
TinyPortal © 2005-2018