Delphi的一个基础构架模式

基础构架主窗体为MDIFORM
窗体显示方式
procedure TFmMain.mmCascadeClick(Sender: TObject); //层叠显示窗体
begin
  Cascade;
end;

procedure TFmMain.mmArrangeIconsClick(Sender: TObject);//排列窗体
begin
  ArrangeIcons;
end;

procedure TFmMain.mmHTitleClick(Sender: TObject);//横向显示所有窗体
begin
  TileMode := tbHorizontal;
  Tile;
end;

procedure TFmMain.mmHTitleClick(Sender: TObject);//垂直显示所有窗体
begin
  TileMode := tbVertical;
  Tile;
end;

主窗体自定义函数及消息处理:
const
  WMCust = WM_USER + $100;
  WMClose = WM_USER + $110;
  WMFmActive = WM_USER + $120;

type
  PAModule = ^TAModule;
  TAModule = record
    AMenuItem: TMenuItem;
    ClassName: string;
    Caption: string;
    Form: TForm;
    bLoadOK: Boolean;
  end;

    procedure DoMenuItem(MenuItem: TMenuItem);
    procedure WMCustDo(var WMMSG: TMessage); message WMCust;
    procedure WMCloseDo(var WMMSG: TMessage); message WMClose;
    procedure WMActive(var WMMSG: TMessage); message WMFmActive;
    procedure WM_Close(var WMMSG: TWMCLOSE); message WM_CLOSE;

procedure TFmMain.WM_Close(var WMMSG: TWMCLOSE);
var
  PModule: PAModule;
  AModule: TAModule;
begin
  if CustTabSet.Tabs.Count = 0 then
  begin
    Close;
    Exit;
  end;
  PModule := PAModule(CustTabSet.Tabs.Objects[CustTabSet.TabIndex]);
  AModule.Form := PModule^.Form;
  (AModule.Form as TForm).Close;
end;

procedure TFmMain.WMActive(var WMMSG: TMessage);
var
  PModule: PAModule;
  AModule: TAModule;
  i: Integer;
begin
  if WMMSG.Msg = WMFmActive then
  begin
    if CustTabSet.Tabs.Count = 0 then Exit;
    CustTabSet.OnClick := nil;
    for i := 0 to CustTabSet.Tabs.Count - 1 do
    begin
      PModule := PAModule(CustTabSet.Tabs.Objects[i]);
      AModule.Form := PModule^.Form;
      if AModule.Form.Name = ActiveMDIChild.Name then
      begin
        CustTabSet.TabIndex := i;
        Break;
      end;
    end;
    CustTabSet.OnClick := CustTabSetClick;
  end;
end;

procedure TFmMain.WMCustDo(var WMMSG: TMessage);
var
  PModule: PAModule;
  AModule: TAModule;
begin
  if WMMSG.Msg = WMCust then
  begin
    if CustTabSet.Tabs.Count = 0 then Exit;
    LockWindowUpdate(GetDesktopWindow);
    PModule := PAModule(CustTabSet.Tabs.Objects[CustTabSet.TabIndex]);
    AModule.Form := PModule^.Form;
    AModule.AMenuItem := PModule^.AMenuItem;
    (AModule.AMenuItem as TMenuItem).Tag := 0;
    CustTabSet.Tabs.Delete(CustTabSet.TabIndex);
    Dispose(PModule);
    LockWindowUpdate(0);
  end;
end;

procedure TFmMain.WMCloseDo(var WMMSG: TMessage);
begin
  if WMMSG.Msg = WMClose then
  begin
    CustTabSetDblClick(nil);
  end;
end;

procedure TFmMain.mmStockAdjustClick(Sender: TObject);
begin
  DoMenuItem(Sender as TMenuItem);
end;


procedure TFmMain.DoMenuItem(MenuItem: TMenuItem);
var
  PModule: PAModule;
  AModule: TAModule;
begin
  if MenuItem.Tag = 0 then
  begin
    New(PModule);

    LockWindowUpdate(GetDesktopWindow);

    if MenuItem.Name = 'mmStockAdjust' then
       AModule := doStock(dmData.DbConn, UserInfo);

   //...各模块调用

    LockWindowUpdate(0);

    if AModule.bLoadOK then
    begin
      MenuItem.Tag := 1;
      PModule^.AMenuItem := MenuItem;
      PModule^.ClassName := AModule.ClassName;
      PModule^.Caption := AModule.Caption;
      PModule^.Form := AModule.Form;
      PModule^.bLoadOK := AModule.bLoadOK;
      CustTabSet.Tabs.AddObject(AModule.Caption, TObject(PModule));
      CustTabSet.TabIndex := CustTabSet.Tabs.Count - 1;
      ((AModule.Form) as TForm).WindowState := wsMaximized;
    end else
    begin
      //Error
    end;
  end;
end;

//自定义的控件CustTabSet加入的有DBClick
procedure TFmMain.CustTabSetDblClick(Sender: TObject);
var
  PModule: PAModule;
  AModule: TAModule;
begin
  if CustTabSet.Tabs.Count = 0 then Exit;
  PModule := PAModule(CustTabSet.Tabs.Objects[CustTabSet.TabIndex]);
  AModule.Form := PModule^.Form;
  (AModule.Form as TForm).Close;
end;

procedure TFmMain.CustTabSetClick(Sender: TObject);
var
  PModule: PAModule;
  AModule: TAModule;
begin
  if CustTabSet.Tabs.Count = 0 then Exit;
  PModule := PAModule(CustTabSet.Tabs.Objects[CustTabSet.TabIndex]);
  AModule.Form := PModule^.Form;
  LockWindowUpdate(GetDesktopWindow);
  ShowWindow((AModule.Form as TForm).Handle, SW_RESTORE);
  ShowWindow((AModule.Form as TForm).Handle, SW_SHOWMAXIMIZED);
  LockWindowUpdate(0);
end;

子窗体FormChild的接口及消息:
function doStock(DBConn: TAdoConnection; UserInfo: TUserInfo): TAModule;
begin
  FmStock:= TFmStock.Create(Application);
  FmStock.DBConn := DBConn;
  FmStock.CurUserInfo := UserInfo;
  FmStock.FormShow(nil);
  FmStock.Show;
  Result.Caption := FmStock.Caption;
  Result.Form := FmStock;
  Result.ClassName := FmStock.Name;
  Result.bLoadOk := True;
end;

procedure TFmStock.FormActivate(Sender: TObject);
begin
  SendMessage(Application.MainForm.Handle, WMFmActive, 0, 0);
end;

procedure TFmStock.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := ShowBox('退出 [' + Caption + '] 吗?') = IDYES;
    if CanClose then
  begin
    SendMessage(Application.MainForm.Handle, WMCust, 0, 0);
  end;
end;

procedure TFmStock.BtnClose(Sender: TObject);
begin
    SendMessage(Application.MainForm.Handle, WMClose, 0, 0);
end;

procedure TFmStock.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值