I'm a newbie in Delphi.
比如主窗体已经有工具栏、菜单栏、在左侧还有一个outlook样式的组件。
我想点左侧的按钮,在右侧的client区显示另一个窗体,请问这如何做到?

解决方案 »

  1.   

    var
      form :TForm;
    begin
      form := TForm.Create(Self);
      form.parent := Form1;
      form.Left := 你要显示的位置;
      form.Top := 同上;
      form.Right := 同上;
      form.bottom := 同上;
    end;
      

  2.   

    可以的。
    比如你在client放一个panel,然后使你想创建的窗口的parent=这个panel就可以了--------------------------------------------------------------------
    看尽悲伤,庸人自扰不平事。叹尽荒凉,海阔天空谁人知。狂风劲兮,百花飘
    扬乱舞香。捏花一笑,海不扬波断肠心!
      

  3.   

    可以。。
    这是我写的原码,,不仅能完成你说的功能,还可以再不同分辨率自动居中。
    unit ChildFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, ExtCtrls, Menus,math;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);
      private
        FAsChild: Boolean;
        FTempParent: TWinControl;
        procedure  CentalPanel;
      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;implementation{$R *.DFM}
    procedure  TChildForm.CentalPanel;
    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;
    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);
    end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
    begin
      FAsChild := True;
      FTempParent := aParent;
      inherited Create(AOwner);
    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;end.给分吧!!!
      

  4.   

    我重载了窗体的创建方法
    当创建时,要指定一个panel容器上。如:
     ChildForm:=tChildForm.Create(self,frmmain.panel1);
     ChildForm.show;
      

  5.   

    我引用了子窗体单元。子窗体中有一个适应整个窗体的groupbox1,但是使用以下代码之后这个groupbox不能再根据子窗体的client的大小而变了。
    uses 
      unitChild;然后
      frmChild.Parent:=frmMain.Panel1;
      frmChild.Show;