How to avoid issues when embedding a TForm in another TForm?
Asked Answered
D

2

9

I often embed a TForm descendant into another TForm descendant like this:

var
  Form1: TForm1;
  Form2: TForm2;
begin
  Form2.Parent      := Form1;
  Form2.BorderStyle := bsNone;
  Form2.Align       := alClient;
  Form2.Show;
end;

Usually this works just fine, but sometimes the controls in Form2 are not aligned properly. Is there a general workaround for this sort of problem?

Does anybody know what is causing this "misalignment"?

I know that I could use TFrame for this kind of job, but I have a lot of library code that I would have to rewrite and I do not see any reason why the TForm in TForm approach should not work?

Edit: I have identified the component TcxListView as the culprit here, I have submitted a bug report to the component vendor (DevExpress):

http://www.devexpress.com/issue=B194161

Edit 2: The developers at DevExpress have analyzed the problem and said that it is actually a defect in the TGridPanel component by Embarcadero:

http://qc.embarcadero.com/wc/qcmain.aspx?d=90324

Daylong answered 8/12, 2010 at 9:32 Comment(0)
V
8

I do this as well and I use the following routine to make it happen:

procedure TMyForm.PlaceInsideContainer(Container: TWinControl);
begin
  Parent := Container;
  Align := alClient;
  BorderIcons := [];
  BorderStyle := bsNone;
  ParentBackground := True;
  Show;
end;

I have no problems with this. The only difference that I could possibly imagine could be relevant is the assignment of BorderIcons, but I would doubt that causes a problem.

Venezuela answered 8/12, 2010 at 9:53 Comment(4)
Is there any reason to set the BorderIcons to [] even when the BorderStyle is bsNone?Bourgeoisie
@Jens Well, this code is so old I can't remember why it is the way it is. I wonder if setting BorderIcons to [] means that the ALT+SPACE, ALT+F4 shortcuts become disabled.Venezuela
I have no Delphi VCL/RTL source code or Delphi compiler available here, but I think that BorderIcons has no effect if BorderStyle is bsNone. In that case, Alt+Space doesn't work but All+F4 does.Laticialaticiferous
Yeah, I just did some testing and I think that setting BorderIcons is pointless. Maybe it stems from some old version of Delphi or more likely I was just having a bad day!Venezuela
S
1

I read a similar question (you'll have to google it) and the answer from TeamB was not to do this as the behaviour was unpredictable and that you should use TFrame instead (which is what I have always done).

Strychninism answered 8/12, 2010 at 11:1 Comment(3)
I have FAR MORE problems using TFrame than with docking one form on another.Simpatico
Hosting a form inside another form is essential to all of my apps.Smail
Consider placing a TPanel on the container TForm and use it as a DockSite for docking embedded TForm objects. TForm really is not well-designed to be set as a direct child of another TForm.Junna

© 2022 - 2024 — McMap. All rights reserved.