我想请问一下如下情况怎么解决:
     有一主窗体form1,另外还有个窗体form2,我想让form1作为主窗体,form2作为子窗体,让form2始终固定在form1的某个区域,随着form1大小的改变而改变,有人建议在form1中添加一个panel,把form2贴在panel上,但是说得不是很详细,我大概试了一下未达到效果,想请教各位高手,这个问题怎么解决,请说得稍微具体些,分不够再加!

解决方案 »

  1.   

    //一个小例子
    uses Unit2;{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      if not Assigned(Form2) then
      begin
        Form2 := TForm2.Create(Self);
        Form2.Parent := Self;
        Form2.Align := alBottom;
        Form2.Show;
      end;
    end;
      

  2.   

    //参考一下,可以做为子窗体的类
    type
      TfrmChildBase = class(TForm)
      private
        FAsChild: Boolean;
        FTempParent: TWinControl;
      protected
        procedure CreateParams(var Params: TCreateParams); override;
        procedure Loaded; override;
      public
        constructor Create(AOwner: TComponent); overload; override;
        constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; overload; virtual;
        function CanChange: Boolean; virtual;
        function GetFormMenu: TMainMenu; virtual;
        property AsChild: Boolean read FAsChild default False;
      end;implementation{$R *.dfm}{ TfrmChildBase }function TfrmChildBase.CanChange: Boolean;
    begin
      Result := True;
    end;constructor TfrmChildBase.Create(AOwner: TComponent);
    begin
      FAsChild := False;
      inherited Create(AOwner);
    end;constructor TfrmChildBase.Create(AOwner: TComponent; AParent: TWinControl);
    begin
      FAsChild := True;
      FTempParent := aParent;
      inherited Create(AOwner);
    end;procedure TfrmChildBase.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      if FAsChild then
        Params.Style := Params.Style or WS_CHILD;
    end;procedure TfrmChildBase.Loaded;
    begin
      inherited;
      if FAsChild then
      begin
        align := alClient;
        BorderStyle := bsNone;
        BorderIcons := [];
        Parent := FTempParent;
        Position := poDefault;
      end;
    end;function TfrmChildBase.GetFormMenu: TMainMenu;
    begin
      Result:=nil;
    end;end.
      

  3.   

    这种问题,delphi里边可以用frame来解决,很省事的
      

  4.   

    我试了一下 duanhai(段海)兄的方法,达到了预期的效果,但是仍然有一个问题,比如说我在form1的左端添加一个groupbar,为其中的一个item的onclick事件添加代码,想要通过击发这个事件的时候使我上述所说的form2出现,如果代码如下的话:
    begin
      if not Assigned(Form2) then  //我想请问这句是不是判断form2窗体已经打开??
      begin
        Form2 := TForm2.Create(Self);
        Form2.Parent := Self;
        Form2.Align := alclient; //使得form2填充form1的其他部分(一部分已被goupbar填充)
        Form2.Show;
      end
    end;
    在上述代码的情况下出现如下情况;
       如果form2已经出现,则击发item的click事件并未出现第二个form2,但是如果我把from2关掉再击发item的click事件,form2再也没出现,而如果把上述代码的if语句去掉的话,只要击发一次item的click事件就会出现一个form2,这些出现的多个form2层叠在一起。
       我现在想达到这样一种效果:就是当form2已经出现的话,击发item的click事件不会出现第二个form2,而当form2关闭的情况下,击发item的click事件能够使form2出现(当然只出现一个),而当form2被其他窗体覆盖的话(比如说被form3窗口覆盖,form3窗口类似于form2,是form1的子窗体),击发item的click的事件使得form2成为当前窗口(显现出来),我这说了一大对可能有点罗嗦,希望各位高手帮忙解决,小弟是一个delphi菜鸟,问题解决一定高分相送,分不够继续加,不胜感激!!
      

  5.   

    我上述说的情况是已经在form1的create添加如下代码的条件下的:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if not Assigned(Form2) then
      begin
        Form2 := TForm2.Create(Self);
        Form2.Parent := Self;
        Form2.Align := alBottom;
        Form2.Show;
      end
    end;