如题
我由form1,其上有很多控件,而另外一个窗体又需要调用这个窗体上的相同控件,时间,数据等,所以
我想把form1装载到另外一个窗体的某个TPanel上,
请问如何实现
小弟做了个试验,但是会报错

解决方案 »

  1.   

    没用过,frame怎么用,能给个例子吗?谢谢
      

  2.   

    file-new-frame,其他的和form一样用选择frame-右键-add to...就可以在vcl面板里找到你定义的frame,进行可视化操作
      

  3.   

    补充一下,我原先的窗体不是用frame做的了啊
    能行吗
      

  4.   

    如果不用frame,只要在创建窗口实例前指定一下Form1.Parent := Panel1;就ok了。
      

  5.   

    File->New->Frame
    在Frame里放你的组件,编写你的代码.
    然后组件面板上的Standard页面上找Frames组件放到容器窗口上,列表里选择刚才创建的窗口.
      

  6.   

    我给的可以解决你的问题,建议你这种情况用frame合适。
      

  7.   

    我写了个窗体基类,对你有用
    代码如下  unit ChildFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, ExtCtrls, Menus,math,typinfo,DBCtrls
      ,dbGrids,DBGridEh,ComCtrls;
    const
          ScreenHeight=768; //根据你设计时的屏幕分辩率设定
          Screenwidth =1024;
    type  TChildForm = class(TForm)
        Panel1: TPanel;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure WMWindowPosChanging(var msg:TWMWindowPosChanging);
        message WM_WINDOWPOSCHANGING;
        procedure FormResize(Sender: TObject);
        procedure FormKeyPress(Sender: TObject; var Key: Char);
      private
        FAsChild: Boolean;
        FTempParent: TWinControl;
        procedure  CentalPanel;
        procedure  SetScaleBy; //自适应分辨率
        Procedure SetColor; 
      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;    // The method below must be overriden to return either the main menu
        // of the form, or nil.
        function GetFormMenu: TMainMenu; virtual; abstract;
        function CanChange: Boolean; virtual;
      end;var
      ChildForm: TChildForm;implementationuses Main;{$R *.DFM}
    procedure  TChildForm.CentalPanel;
    var
      i:Integer;
    begin
      if (panel1.Visible) or (panel1.Tag<>0) then
      begin
        if panel1.Width < ClientWidth then
        panel1.Left := (ClientWidth - panel1.Width ) div 2
        else
        panel1.Left := 0;
        if panel1.Height <ClientHeight then
          panel1.Top :=(ClientHeight - panel1.Height ) div 2
        else
        panel1.Top := 0;
     end else
     begin
        for i:=0 to self.ComponentCount-1 do
        begin
          if (self.Components[i] is Tpanel ) then
          begin
            if (((self.Components[i] As Tpanel ).Parent) is TTabSheet) And  ((self.Components[i] As Tpanel ).Tag=1)then
            begin
              if (self.Components[i] As Tpanel ).Width < (((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth then
                (self.Components[i] As Tpanel ).Left := ((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth - (self.Components[i] As Tpanel ).Width ) div 2
              else
                (self.Components[i] As Tpanel ).Left := 0;
              if (self.Components[i] As Tpanel ).Height <(((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight then
                  (self.Components[i] As Tpanel ).Top :=((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight - (self.Components[i] As Tpanel ).Height ) div 2
              else
                (self.Components[i] As Tpanel ).Top := 0;
            end;
          end;
        end;
      end;
      //SetScaleBy;
    end;
    procedure TChildForm.SetScaleBy; //自适应分辨率
    var
      i :integer;
    begin 
      if (screen.width <> ScreenWidth) then
      begin
        height := longint(height) * longint(screen.height) DIV ScreenHeight;
        width := longint(width) * longint(screen.width) DIV ScreenWidth;
        scaleBy(screen.width, ScreenWidth);
      End ;
      for i := componentCount - 1 downto 0 do 
        with components[i] do
        begin
        if GetPropInfo(ClassInfo, 'font') <> nil then
        font.size := (screen.width DIV screenwidth) * font.size;
      end;
    end;
    procedure TChildForm.WMWindowPosChanging(var msg:TWMWindowPosChanging);
    var
      CaptionHeight:integer;
    begin
       CaptionHeight := GetSystemMetrics(SM_CYCAPTION);
       msg.WindowPos ^.cx :=Max(msg.WindowPos ^.cx,panel1.Width+20);
       msg.WindowPos ^.cy :=Max(msg.WindowPos ^.cy,panel1.Height+20+CaptionHeight);
       inherited;
    end;constructor TChildForm.Create(AOwner: TComponent);
    begin
      FAsChild := False;
      inherited Create(AOwner);
      SetScaleBy;
    end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
    begin
      FAsChild := True;
      FTempParent := aParent;
      inherited Create(AOwner);
      SetScaleBy;
      SetColor;
    end;procedure TChildForm.Loaded;
    begin
      inherited;
      if FAsChild then
      begin
        align := alClient;
        BorderStyle := bsNone;
        BorderIcons := [];
        Parent := FTempParent;
        Position := poDefault;
      end;
    end;procedure TChildForm.CreateParams(var Params: TCreateParams);
    Begin
      Inherited CreateParams(Params);
      if FAsChild then
        Params.Style := Params.Style or WS_CHILD;
    end;function TChildForm.CanChange: Boolean;
    begin
      Result := True;
    end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action :=cafree;
    end;procedure TChildForm.FormDestroy(Sender: TObject);
    begin
      ChildForm :=nil;
    end;procedure TChildForm.FormResize(Sender: TObject);
    begin
      CentalPanel;
    end;procedure TChildForm.FormKeyPress(Sender: TObject; var Key: Char);
    begin
      {if Key = #13 Then
      Begin
        SelectNext(ActiveControl,True,True);
        Key := #0;
      End;}
    end;procedure TChildForm.SetColor;
    var
     i,j:integer;
    begin
      Panel1.Color:=$00F8E4D8;
      for i:=0 to self.ControlCount-1 do
      begin
        //$00F8E4D8
        
        If (self.Components[i] is TEdit) tHEN
        Begin
          (self.Components[i] As TEdit).ImeName:=screen.DefaultIme;
        End;
        If (self.Components[i] is TDbEdit) tHEN
        Begin
          (self.Components[i] As TdbEdit).ImeName:=screen.DefaultIme;
        End;
        If (self.Components[i] is TDBGrid)  tHEN
        Begin
          For j:=0 to (self.Components[i] As TDBGrid).Columns.Count-1 do
          Begin
            (self.Components[i] As TDBGrid).Columns.Items[j].ImeName:=screen.DefaultIme;
          End;
        End;
        If (self.Components[i] is TDBGridEh)  tHEN
        Begin
          For j:=0 to (self.Components[i] As TDBGridEh).Columns.Count-1 do
          Begin
            (self.Components[i] As TDBGridEh).Columns.Items[j].ImeName:=screen.DefaultIme;
          End;
        End;
      end;end;end.
      

  8.   

    这个基类,具有自动居中,自适应分辨率等动能可以将窗体加载到另一个的TPanel (Create(AOwner: TComponent; AParent: TWinControl))
    ,也可以独立显示 (Create(AOwner: TComponent); overload; override;)!!
      

  9.   

    没楼上楼上这么麻烦吧?uses shellapi;procedure TForm1.Button2Click(Sender: TObject);
    var hSndrec32: HWND;
    begin
      hSndrec32 := WIndows.FindWindow(nil, '声音 - 录音机');
      if hSndrec32<>0 then
      begin
      Windows.SetParent(hSndrec32, Panel1.Handle);
      Windows.MoveWindow(hSndrec32, 0, 0,panel1.Width,panel1.Height,true);
      end
      else
      showmessage('未发现该程序!');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       shellexecute(handle,'open','sndrec32.exe',nil,nil,sw_shownormal);
    end;
      

  10.   

    WIndows.FindWindow(nil, '声音 - 录音机');
    这里的'声音 - 录音机''是指什么?
    我只是想要把窗体显示在panel1上
      

  11.   

    form1.parent:=panel1;form1继承自你所需要的TForm类
      

  12.   

    我试了,用frmae是可以
    但是不用frmae就没有办法吗?