一个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.

解决方案 »

  1.   

    1、激活窗体时最大化不要在activate里面加WindowState := wsMaximized; 在动态创建的时候就让它的类型是最大化的类型
    2、如何才能解决自动还原的问题??什么意思?
       另外切换少一个也没见过
      

  2.   

    1.//激活窗体时最大化
    procedure TfrmCard.FormActivate(Sender: TObject);
    begin
      WindowState := wsMaximized;  //不加这句当激活时自动变为Normal状态,不是最大化状态,
                                   //而窗体属性在设计时已经是wsMaximized的了,
                                   //也就是窗体自动还原了
      frmMain.AdjustTabControl(Self as TForm, False); //增加或激活Tab页
    end;
      

  3.   

    2.关于"切换少一个也没见过"
    Ctrl+Tab确实有一个子窗体不能切换到,Ctrl+Shift+Tab则都能切换到.
    代码就是这么多,没有其它额外代码,我在Delphi6和Delphi7中都试过,运行结果一样
      

  4.   

    2.关于"切换少一个也没见过"更正一下:!!!!!!  Ctrl+Tab只能切换最近打开的两个子窗体 !!!!!Ctrl+Shift+Tab则都能切换到.