相信经常上网的兄弟都习惯了多个标签页的浏览方式。
一个系统中原先所有的窗口都是作为mdi子窗体显示的,现要实现多标签页浏览,谁有解决思路?
一个系统中原先所有的窗口都是作为mdi子窗体显示的,现要实现多标签页浏览,谁有解决思路?
解决方案 »
- 兼通VB与DELPHI的高人:delphi做不出vb这样的效果?!
- 如何得到指定数据库中所有的表名?高分送
- WordApplication1的简单操作问题 200410
- mediaplay播放dat的问题
- 在线等待,怎样的D中嵌入Flash
- Enabled 的问题?
- 懂三层结构、DELPHI和SQL的大虾来帮忙啊!!!
- ================一个后台数据工具==================
- 如何实现类似分帧的功能?
- 为什么在多次循环后,无法写入数据表中?
- 程序写好以后编译通过并且可以过行,可是有时不稳定,所以进行单步调试,可是按F8提示错误,根本就无法进行下去,请看提示:
- 手头有一项目,求北京项目合作者
我想的是是不是可以在mdi的显示上动脑筋,这样是改动最小的
这个标签怎么搞,就看你自己的了。
Form2.Parent := TabSheet1;
注意: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的代码。
就是PageControl这个组件来做啰。。把MDI窗体的风格改成普通的,之后再把Form移到tabSheet上就可以了..
-------------------------
delphi72()
把MDI窗体的FormStyle属性改为fsNormal
Form2.Parent := TabSheet1;
-------------------------
会导致mdi窗体中的部分组件无法接受响应,比如TMemo
我的想法是在绘制子窗体的地方动手,方便所有的旧系统转换,另外要考虑到有的用户喜欢多窗口浏览,有的则喜欢多标签页。比如说当两条记录进行比对差异的时候,水平拆分成两个窗口要方便得多
或者用第三方skin
vc中用BCGSoft/XTheme实现这种效果倒是很轻松
//主窗体代码:
//**************************************************************************
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.
--------------------------------------
乱说!
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;