delphidelphi-xe7

How to 'parent' a form? (Controls won't accept focus)


I have a child form 'frmTest' and a main form 'TfrmMain'. I set the main form as parent for frmTest like this:

unit Main;

INTERFACE
USES
  System.SysUtils, System.Classes, Vcl.Forms, Test, Vcl.StdCtrls, Vcl.Controls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

IMPLEMENTATION  {$R *.dfm}
 
procedure TfrmMain.Button1Click(Sender: TObject);
VAR frmTest: TChildForm;
begin
  Application.CreateForm(TChildForm, frmTest);
  //frmTest:= TForm1.Create(Self);
  frmTest.Parent:= Self;
  frmTest.Show;
  frmTest.SetFocus;
end;

unit test;  { THIS IS THE CHILD }

INTERFACE

TYPE
  TChildForm = class(TForm)
    Edit1: TEdit;
    SpinEdit1: TSpinEdit;
  end;

Code as ZIP

But controls (edit box, spin edit, etc) in frmInsertImg will not accept focus from mouse but can be focused with Tab.

What am I doing wrong?


PS: Of course I should have used CanFocus before SetFocus. But even so, CanFocus is BROKEN (or incomplete in Delphi). It needs to be fixed. (Link is to an article on my own website.)


Solution

  • I suggest that you set BorderStyle to bsNone for the child form. I'm not sure of the exact reasons why this works, but it has the desired effect.

    If you need to add a visual frame for your child form then that is best done with explicit UI for the contained of your child form.

    Forms aren't really intended to be used in this way, in my opinion. You can make things mostly work, but it's not terribly robust. Putting the UI into a frame and then hosting that should lead to better behaviour.