Создание приложения наподобие MS Outlook.
Автор: Aldevinas Katkus
Совместимость: Delphi 2.x
У Вас возникла необходимость создать
многооконное приложение, но не хочется
захламлять экран большим количеством окошек ?
Создайте формы как обычно, но в каждой форме, за
исключением основной, установите BorderStyle=bsNone.
Затем на основную форму перетащите панель
которая будет управлять заполнением Ваших форм
данными и полями ввода. В Основной форме нужно
добавить примерно такой код:
acXxxxx - это действие, которое будет выполняться при
нажатии на элемент (пункт меню, кнопка,
акселератор и т.д.) ассоциированный с этим
действием через свойство Action.
=================
TfrmIMMain
......................
private
(*
используется для заполнения всего экрана
*)
procedure WMSettingChange( var Msg: TMessage);message
WM_SETTINGCHANGE;
public
ActiveDetailForm: TForm;//Форма, которая
активна в данный момент
procedure SetActiveDetailForm(F: TForm; ParentControl:
TWinControl);
end;
var
frmIMMain: TfrmIMMain;
implementation
uses imdata, imSoftL, imSuppl, imEqDet, imDesk, imSpareP, imCateg,
imLocL, imUserL, imEqList, imEqByUsr, imImpBlb, imSftLic, imSupL,
imEqDetR, imRptPrm, imdmRep, imSftLicRepPrm, imSparePR, imSparePPrm,
imSftDetR, imSoftDetRPrmDlg;
{$R *.DFM}
//
function GetWindowsWorkArea: TRect;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
procedure TfrmIMMain.WMSettingChange( var Msg: TMessage);
var
R: TRect;
begin
if (Msg.WParam=SPI_SETWORKAREA) then
begin
R:=GetWindowsWorkArea;
SetBounds(R.Left, R.Top,
R.Right-R.Left, R.Bottom-R.Top);
end;
Msg.Result:=0;
end;
procedure TfrmIMMain.FormCreate(Sender: TObject);
var
R: TRect;
begin
// заполняем весь экран...
R:=GetWindowsWorkArea;
SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top);
end;
// показываем форму списка Software
procedure TfrmIMMain.acSoftwareListExecute(Sender: TObject);
begin
if (Sender is TAction) then
begin
(Sender as TAction).Checked:=True;
fcbSoftList.Down:=True;
end;
//paWorkArea это панель, которая использется, как
управляющая для форм
SetActiveDetailForm(frmIMSoftList, paWorkArea);
end;
// показываем форму "Оборудование"...
procedure TfrmIMMain.acEquipmentDetailsExecute(Sender: TObject);
begin
if (Sender is TAction) then
begin
(Sender as TAction).Checked:=True;
fcbEqDet.Down:=True;
end;
SetActiveDetailForm(frmIMEqDet, paWorkArea);
end;
// устанавливаем активную форму, чтобы выглядело
как в MS outlook.......
// ParentControl это TPanel, но это может быть любой оконный
элемент управления (который
имеет оконное свойство Handle)
procedure TfrmIMMain.SetActiveDetailForm(F: TForm; ParentControl:
TWinControl);
begin
if ActiveDetailForm<>F then
begin
if Assigned(ActiveDetailForm) then
ActiveDetailForm.Hide;
//следующие две линии делают то, что нам нужно...
F.Parent:=ParentControl;
F.Align:=alClient;
ActiveDetailForm:=F;
F.Show;
end;
end;
procedure TfrmIMMain.FormActivate(Sender: TObject);
begin
//устанавливаем форму по умолчанию при запуске.
if not Assigned(ActiveDetailForm) then
acEquipmentDetailsExecute(acEquipmentDetails);
end;
|