基础构架主窗体为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;