我想实现以下功能:在主窗体上有个按钮,当按下主窗体的按钮是,调用子窗体,把子窗体嵌进父窗体指定的区域,并且主窗体和子窗体都处于高亮状态(即父子窗体都没有变灰)。请问大虾怎么实现?高分求教,谢谢了!

解决方案 »

  1.   

    比如Form1  is MainForm .
    在Form1里面的按钮事件里面写
    Form2.Parent := Form1; //指定区域
    Form2.Show;
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses
    unit2 ;
    var
    fm2:TForm2=nil;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    if not Assigned(fm2) then
      fm2:=TForm2.Create(Self);
      fm2.Parent:=Self.Panel1;
      FM2.Top:=Panel1.Top;
      fm2.Left:=Panel1.Left;
      fm2.Show;
    end;
    end.
    fm2是灰的,但是可以用啊,要不然就FM2.BorderStyle:=bsNone; 然后自己自己模拟一个标题吧
      

  3.   

    主窗体的FormStyle为fsMDIForm
    子窗体的FormStyle为fsMDIChild
      

  4.   

    建议做成MDI
    主窗体的FormStyle为fsMDIForm
    子窗体的FormStyle为fsMDIChild
      

  5.   

    1、用MDI窗体
    2、在“父窗体”上放一个Panel,把“子窗体”贴在上面。参考代码:
    function TForm1.ShowForm(AFormClass: TFormClass): TForm;
    begin
      if frmChild = nil then
      begin
        frmChild:= AFormClass.Create(Panel1);
        frmChild.BorderStyle := Panel1;
        frmChild.Align := Panel1;
        frmChild.Parent := Panel1;
      end;
      frmChild.Show;
    end;
    这里TForm1是“父窗体”,frmChild是全局的“子窗体”
      

  6.   

    try
         if Form2<>nil then
           TForm(Form2).Free;
         if not Assigned(Form2) then
           begin           
              Application.CreateForm(TForm2,Form2);
              Form2.Parent:=Self;
              Form2.Show;
           end;
       finally
        
       end;
      

  7.   

    我照着 sxf_zero(从头再来) 的方法来做,已经基本上能完成我想要实现的功能了(不过好像定位有点问题,就是fm2.Top:=Panel1.Top; fm2.Left:=Panel1.Left;这两句话,子窗体的Top和Left好像并不是Panel1的Top和Left),谢谢 sxf_zero(从头再来) ,谢谢大家!!!
      

  8.   

    呵呵,再加一句fm2.parent := Panel1;这句看如何?
      

  9.   

    function TForm1.ShowForm(AFormClass: TFormClass): TForm;
    begin
      if frmChild = nil then
      begin
        frmChild:= AFormClass.Create(Panel1);
        frmChild.BorderStyle := Panel1;
        frmChild.Align := Panel1;
        frmChild.Parent := Panel1;
      end;
      frmChild.Show;
    end;
    可以的我来晚了
      

  10.   

    子窗口的parent设置成副窗口的一个panel旧可以了,不用设置什么top\left的
      

  11.   

    不好意思,早上太匆忙了,更正一下在“父窗体”上放一个Panel,把“子窗体”贴在上面。参考代码:
    function TForm1.ShowForm(AFormClass: TFormClass): TForm;
    begin
      if frmChild = nil then
      begin
        frmChild:= AFormClass.Create(Panel1);
        frmChild.BorderStyle := bsNone;
        frmChild.Align := alClient;
        frmChild.Parent := Panel1;
      end;
      frmChild.Show;
      Result := frmChild;
    end;
    这里TForm1是“父窗体”,Panel1放在其上,frmChild是全局的“子窗体”。这里用函数返回了子窗体的对象,当然直接改成过程,不返回也行。
      

  12.   

    请问tjianliang(乡关何处),你上面的那段代码该贴到哪里?是在父窗口的单元文件还是子窗口的单元文件?另外,一般的窗体都有一个OnShow事件,它在单元文件里面是这样定义的:procedure FormShow(Sender: TObject);这和你上面的那个函数有什么区别?我在父窗体单元里面加进了上面的代码,并且改成如下:procedure TForm1.FormShow(Sender: TObject);
    begin
      if frmChild = nil then
      begin
        frmchild := AFormClass.Create(Panel1);
        frmChild.BorderStyle := bsNone;
        frmChild.Align := alClient;
        frmChild.Parent := Panel1;
      end;
      frmChild.Show;
    end;其中Form1是fsMDIForm父窗体,frmChild是fsMDIChild子窗体,AFormClass我已经加进Form1的全局变量声明区:var
      Form1: TForm1;
      frmChild: TForm2 = nil;
      AFormClass: TFormClass;但是总是编译不过,在frmchild := AFormClass.Create(Panel1);一行出现如下错误:[Error] Unit1.pas(52): Incompatible types: 'TForm2' and 'TForm'就算我把frmchild := AFormClass.Create(Panel1);改成:
    frmchild := (TForm2)AFormClass.Create(Panel1);也是同样问题。请问这是什么原因?该怎么改?