要求:主窗体Frmmain有一个Bitbtn按键和一个Panel,要求在这个Panel上显示另一个窗体Form1,(在同一个应用程序下).
     想用Setparent函数,定义:hwndfrm,hwndoldparent:HWND;
procedure TForm1.FormActivate(Sender: TObject);
begin
   hwndfrm:=form1.Handle;
   hwndoldparent:=getparent(hwndfrm);
   windows.SetParent(hwndfrm,frmmain.panel12.Handle);
end; 
procedure TForm1.FormDestroy(Sender: TObject);
begin
windows.SetParent(hwndfrm,hwndoldparent);
end;    然后
   procedure Tfrmmain.BitBtn1Click(Sender: TObject);
begin
   form1.show;
end;
  这样不行,奇怪问题出在哪里?

解决方案 »

  1.   

    Form1.Show;
      windows.SetParent(Form1.Handle,Panel1.Handle);
      //Form1.Parent:=Panel1;
      

  2.   

    问题解决了,我自己的方法没错.
    但是 form1.showmodal就不行.怎么解决有多个Bitbtn,进入不同的窗体,在同一个Panel中.窗体是动态加入的,按另一个Bitbtn时,怎么关闭上一个窗体???
      

  3.   

    我最近也遇到这个问题, 也没有解决.
    我是用下面的代码把新窗口写到主窗口Panel1中
      F_new.DockSite:=True;
      F_new.DragKind:=dkDock;
      F_new.Align:=alClient;
      F_new.HostDockSite:=Panel1;
      F_new.Show;
    现在放了几个按钮,按另一个时应该把前一个按钮找开的窗口关闭.
    如何解决呢.如果解决了请把代码贴出来.zwh202342(little grass) 
    直接 窗体.Close如果活动的创建的,关一次正常,关两次以上就出问题(意思就是连按两次Button)
    有什么方法判断窗口是否已经创建?
      

  4.   

    设置一个窗体的全局变量fvarform,记录panel中放入的窗体,再往panel中加入窗体时,把前一个窗体(fvarform所记录的)释放可以用assigned()来判断窗体是否已经创建,不过记得释放已创建的窗体的时候用FreeAndNil来释放
      

  5.   

    universe(孤帆) ,你的方法有道理,能给段程序,示意吗
      

  6.   

    帮你顶~! 我以前也遇到过这样的问题,后来我改用frame给解决了. 
    可能universe(孤帆)  的方法行吧,当时我直接用close()就出错,也许用FreeAndnil可以吧,我试下给LZ答案
      

  7.   

    //参考如下代码
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vForm: TForm;
    begin
      TComponent(vForm) := Application.FindComponent('Form2');
      if Assigned(vForm) then
      begin
        ShowMessage('Form2已经创建,将被释放');
        vForm.Free;
      end else
      begin
        vForm := TForm.Create(Application);
        vForm.Name := 'Form2';
        vForm.Show;
      end;
    end;
      

  8.   

    zswang(伴水清清): VFORM就是FORM2的一个实例对吗?vForm := TForm.Create(Application)是否改为:vForm := TForm2.Create(Application)更好?但是点击另一个键时,怎么释放原有的窗体呀?当我要显示form3时,怎么释放form2?
      

  9.   

    //很多问题不用问,动手做测试就知道了
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vForm: TForm;
    begin
      TComponent(vForm) := Application.FindComponent('Form3');
      if Assigned(vForm) then vForm.Free;  TComponent(vForm) := Application.FindComponent('Form2');
      if Assigned(vForm) then
      begin
        ShowMessage('Form2已经创建,将被释放');
        vForm.Free;
      end else
      begin
        vForm := TForm2.Create(Application);
        vForm.Name := 'Form2';
        vForm.Show;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      vForm: TForm;
    begin
      TComponent(vForm) := Application.FindComponent('Form2');
      if Assigned(vForm) then vForm.Free;  TComponent(vForm) := Application.FindComponent('Form3');
      if Assigned(vForm) then
      begin
        ShowMessage('Form3已经创建,将被释放');
        vForm.Free;
      end else
      begin
        vForm := TForm3.Create(Application);
        vForm.Name := 'Form3';
        vForm.Show;
      end;
    end;
      

  10.   

    OK,终于调试成功了,感谢你们!!只是procedure Tform1.FormShow(Sender: TObject)不能用,把FormShow执行的程序放在FormActivate中就可以了!!!