一个MDI的程序,所有子窗体都是动态创建,
BorderStyle:=bsSizeable
FormStyle:=fsMDIChild
BorderIcons全不要
WindowsState:=wsMaximized每建立一个子窗体时,在主窗体工具栏上建立一个Tab页显示窗体标题,选择Tab页时激活相应窗体.所有窗体都要求不可调整大小,处于最大化状态.问题有二:
一.每当选中一页时,整个窗口总是先闪烁一下,仔细观察后发现是所有子窗体都先变成Normal状态,然后再最大化的原因.
二.用windows的ctrl+Tab切换窗体时不闪烁,但是切换的窗体时可切换窗体的数目总比我创建的窗体数目少一个,建立了3个子窗体用ctrl+Tab只能切换2个,建立4个只能切换其中3个.奇怪的还有:如果用ctrl+shift+Tab反向切换则没有任何问题.如何才能解决自动还原的问题,如何解决ctrl+Tab切换的问题?代码如下://**************************************************************************
//主窗体代码:
//**************************************************************************
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.
BorderStyle:=bsSizeable
FormStyle:=fsMDIChild
BorderIcons全不要
WindowsState:=wsMaximized每建立一个子窗体时,在主窗体工具栏上建立一个Tab页显示窗体标题,选择Tab页时激活相应窗体.所有窗体都要求不可调整大小,处于最大化状态.问题有二:
一.每当选中一页时,整个窗口总是先闪烁一下,仔细观察后发现是所有子窗体都先变成Normal状态,然后再最大化的原因.
二.用windows的ctrl+Tab切换窗体时不闪烁,但是切换的窗体时可切换窗体的数目总比我创建的窗体数目少一个,建立了3个子窗体用ctrl+Tab只能切换2个,建立4个只能切换其中3个.奇怪的还有:如果用ctrl+shift+Tab反向切换则没有任何问题.如何才能解决自动还原的问题,如何解决ctrl+Tab切换的问题?代码如下://**************************************************************************
//主窗体代码:
//**************************************************************************
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.
2、如何才能解决自动还原的问题??什么意思?
另外切换少一个也没见过
procedure TfrmCard.FormActivate(Sender: TObject);
begin
WindowState := wsMaximized; //不加这句当激活时自动变为Normal状态,不是最大化状态,
//而窗体属性在设计时已经是wsMaximized的了,
//也就是窗体自动还原了
frmMain.AdjustTabControl(Self as TForm, False); //增加或激活Tab页
end;
Ctrl+Tab确实有一个子窗体不能切换到,Ctrl+Shift+Tab则都能切换到.
代码就是这么多,没有其它额外代码,我在Delphi6和Delphi7中都试过,运行结果一样