相信经常上网的兄弟都习惯了多个标签页的浏览方式。
一个系统中原先所有的窗口都是作为mdi子窗体显示的,现要实现多标签页浏览,谁有解决思路?

解决方案 »

  1.   

    不大现实,动态创建、销毁tab页面我以前做过,这个我可以解决,关键是如何把窗体上的内容移进去。这个难度比较大。
    我想的是是不是可以在mdi的显示上动脑筋,这样是改动最小的
      

  2.   

    利用mdi,在主窗体上,除了菜单,工具栏,另外增加标签。
    这个标签怎么搞,就看你自己的了。
      

  3.   

    就是PageControl这个组件来做啰。。把MDI窗体的风格改成普通的,之后再把Form移到tabSheet上就可以了..
      

  4.   

    把MDI窗体的FormStyle属性改为fsNormal
    Form2.Parent := TabSheet1;
      

  5.   

    设计时,在每个mdi窗体的onActivate事件里添加以下代码。
    注意:PageControl1的Align需要是alClient,用于遮挡出现在mdi窗体。
    procedure TEditForm.FormActivate(Sender: TObject);
    var
            i: integer;
    begin
            //在MainForm里动态创建标签页,此处省略
            //将mdi窗口的全部控件移交到当前的活动标签页上
            for i:=0 to self.ControlCount -1 do
            begin
                    self.Controls[0].Parent := MainForm.PageControl1.ActivePage;
            end;
    end;另外,在mdi窗体的onDestory事件里添加删除相应标签页的代码,或在标签页删除的代码里添加相应mdi窗体的close的代码。
      

  6.   

    GARNETT2183(KingWolves (http://kevin-lu.blogspot.com)) 
    就是PageControl这个组件来做啰。。把MDI窗体的风格改成普通的,之后再把Form移到tabSheet上就可以了..
    -------------------------
    delphi72() 
    把MDI窗体的FormStyle属性改为fsNormal
    Form2.Parent := TabSheet1;
    -------------------------
    会导致mdi窗体中的部分组件无法接受响应,比如TMemo
      

  7.   

    delphi72()的想法完全可以用frame实现,这么考虑实现起来是简单,但是工作量巨大,需要把原来所有的form转为frame。
    我的想法是在绘制子窗体的地方动手,方便所有的旧系统转换,另外要考虑到有的用户喜欢多窗口浏览,有的则喜欢多标签页。比如说当两条记录进行比对差异的时候,水平拆分成两个窗口要方便得多
      

  8.   

    erhan(二憨) 的方法对于form里面有容器性控件的情况需要改进
      

  9.   

    容器型的没问题啊,panel1下带panel2再带button1,都可以移过去的,因为程序改变了panel1的属性,panel2和button1的隶属关系不用变的。
      

  10.   

    今天看到一个系统,也是用mdi子窗体,不过工具栏上多了一排标签,每个子窗体最大化以后,用标签来调整窗体的活动,想法不错,估计就照着写了
      

  11.   

    哦,就象UltraEdit一样的吧,呵呵
      

  12.   

    用标签页加载form可以
    或者用第三方skin
    vc中用BCGSoft/XTheme实现这种效果倒是很轻松
      

  13.   

    可以用Dock方式,把窗体嵌到Page Tab中
      

  14.   

    UltraEdit是有一个带PageControl的工具栏
      

  15.   

    千万别用MDI,累死人。就普通的Form就行。放个PageControl,只不过几行代码。
      

  16.   

    代码如下://**************************************************************************
    //主窗体代码:
    //**************************************************************************
    unit UMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ComCtrls, ToolWin, ExtCtrls;type
      TfrmMain = class(TForm)
        mnMain: TMainMenu;
        mniBase: TMenuItem;
        mniModules: TMenuItem;
        nmiSysConfig: TMenuItem;
        Panel1: TPanel;
        cbTop: TCoolBar;
        tbMenu: TToolBar;
        gfgfhgf1: TMenuItem;
        gfhghgf1: TMenuItem;
        tabChildren: TTabControl;
        mnTab: TPopupMenu;
        mniTabClose: TMenuItem;
        C1: TMenuItem;
        mniRolls: TMenuItem;
        mniCard: TMenuItem;
        procedure mniModulesClick(Sender: TObject);
        procedure tabChildrenChange(Sender: TObject);
        procedure mniCardClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure AdjustTabControl(Sender:TForm; Delete:Boolean);
      end;var
      frmMain: TfrmMain;implementationuses uModules, uDm, uCard;{$R *.dfm}//增加/删除/激活与子窗体相关的Tab页
    procedure TfrmMain.AdjustTabControl(Sender:TForm; Delete:Boolean);
    var
      I:Integer;
      Found:Boolean;
    begin
      //查找
      Found := False;
      for I := 0 to tabChildren.Tabs.Count - 1 do
      begin
        if Sender.Caption = tabChildren.Tabs[I] then
        begin
          Found := True; //找到
          if Delete then //删除
            tabChildren.Tabs.Delete(I)
          else  //激活
            if tabChildren.TabIndex <> I then
              tabChildren.TabIndex := I;
          break;
        end;
      end;  if not Found then //增加并激活
      begin
        tabChildren.Tabs.Add(Sender.Caption);
        tabChildren.TabIndex := tabChildren.Tabs.Count - 1;
      end;
    end;
    //选择Tab页时激活相应子窗体
    procedure TfrmMain.tabChildrenChange(Sender: TObject);
    var
      TabCap:String;
      I: Integer;
      Child: TForm;
    begin
      TabCap:=tabChildren.Tabs[tabChildren.TabIndex];
      for I := MDIChildCount - 1 downto 0 do
      begin
        Child := MDIChildren[I];
        if Child.Caption =  TabCap then
          Child.Show;
      end;
    end;
    //模块配置
    procedure TfrmMain.mniModulesClick(Sender: TObject);
    begin
      if nil = FindComponent('frmModules') then
        frmModules := TfrmModules.Create(Self);
      frmModules.Show;
    end;
    //卡片维护
    procedure TfrmMain.mniCardClick(Sender: TObject);
    begin
      if nil = FindComponent('frmCard') then
        frmCard := TfrmCard.Create(Self);
      frmCard.Show;
    end;end.
    //**************************************************************************
    //子窗体代码:
    //**************************************************************************
    unit uCard;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TfrmCard = class(TForm)
        pnlTop: TPanel;
        btnClose: TButton;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure btnCloseClick(Sender: TObject);
        procedure pnlTopResize(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmCard: TfrmCard;implementationuses uDm, uMain;{$R *.dfm}
    //关闭窗体,释放
    procedure TfrmCard.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:= caFree;
    end;
    //关闭按钮
    procedure TfrmCard.btnCloseClick(Sender: TObject);
    begin
      frmMain.AdjustTabControl(Self as TForm, True); //删除Tab页
      Close;
    end;
    //窗体调整
    procedure TfrmCard.pnlTopResize(Sender: TObject);
    begin
      btnClose.Left := pnlTop.Width - 10 - btnClose.Width;
    end;
    //激活窗体时最大化
    procedure TfrmCard.FormActivate(Sender: TObject);
    begin
      WindowState := wsMaximized;  //
      frmMain.AdjustTabControl(Self as TForm, False); //增加或激活Tab页
    end;end.
      

  17.   

    http://community.csdn.net/Expert/topic/5116/5116758.xml?temp=.7571833
      

  18.   

    把MDI窗体的FormStyle属性不能改为fsNormal
      

  19.   

    千万别用MDI,累死人。就普通的Form就行。放个PageControl,只不过几行代码。
    --------------------------------------
    乱说!
      

  20.   

    我寫的一個在主窗體內放一PageControl,將其algin=alBottom或alTop(置於上部或下部),取pagecontrol適當高度,然後在打開子from的時候調用下面的activetab.在子窗體的公共模塊的Formclose內調用CloseTab.
    procedure ActiveTab(AForm: TForm);
    var i: integer;
      hasform: boolean; //判斷子窗體是否存在
    begin
      hasform := False;
      for i := 0 to cxtab.Tabs.Count - 1 do
      begin
        if cxtab.Tabs[i].Caption = AForm.Caption then
        begin
          hasform := True;
          cxtab.TabIndex := i;
          break;
        end;
      end;
      if not hasform then
      begin
        cxtab.Tabs.Add(AForm.Caption);
        cxtab.TabIndex := cxtab.Tabs.Count - 1;
      end;
    end;
    procedure CloseTab(AForm: TForm);
    var i: integer;
    begin
      for i := 0 to cxtab.Tabs.Count - 1 do
      begin
        if cxtab.Tabs[i].Caption = AForm.Caption then
        begin
          cxtab.Tabs[i].Free;
          break;
        end;
      end;
    end;cxtab就是主窗體的PageControlPageControl的onchange事件如下,用於點擊時激活子窗體
    procedure cxtabChange(Sender: TObject);
    var FormCaption: string;
      i: integer;
    begin
      FormCaption := cxtab.Tabs[cxtab.TabIndex].Caption;
      for i := 0 to self.MDIChildCount - 1 do
      begin
        if self.MDIChildren[i].Caption = FormCaption then
        begin
          self.MDIChildren[i].Show;
          break;
        end;
      end;
    end;