Шаг 2.3 - Создание базовых процедур MDIChild окна.
.....В первую очередь создадим процедуру закрытия формы. Встаньте на форму и в окне инспектора свойств перейдите на закладку Events. Дважды щелкните левой кнопкой мыши на событии OnClose. В созданной процедуре FormClose введите строку, как показано ниже.
procedure TfmMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
.....Action:=caFree;
end;
.....Далее реализуем механизм отключения полноэкранного режима для дочерней формы (описнаие механизма см. Урок 1 Шаг 1.4). В структуре описания формы fmMDIChild в секции private зарегистрируем новые переменные (своеобразный буфер для хранения текущей позиции и размера формы), создадим секцию protected и переопределим процедуру WndProc, как указано ниже.
TfmMDIChild = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
BufWidth: integer;
BufHeight: integer;
BufTop: integer;
BufLeft: integer;
protected
{ Protected declarations }
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;
.....В разделе implementation введем следующую строку:
uses VLDefinition;
.....Установите курсор на описание процедуры WndProc и нажмите клавишы <Ctrl>+<Shift>+<C>. Будет создана процедура WndProc, в теле процедуры введите строки, как указано ниже.
procedure TfmMDIChild.WndProc(var Message: TMessage);
begin
case Message.Msg of
// если системная команда
WM_SYSCOMMAND:
begin
if Message.WParam=SC_MAXIMIZE then
// если сделать размер формы максимальным
begin
if Self.BufWidth=0 then
// если буфер обнулен
begin
// заполнить буфер текущими размерами формы и текущей позицией
Self.BufTop:=Self.Top;
Self.BufLeft:=Self.Left;
Self.BufWidth:=Self.Width;
Self.BufHeight:=Self.Height;
// обнулить позицию и увеличить размер на все свободное клиентское пространство главной формы
Self.Top:=0;
Self.Left:=0;
Self.Width:=CurClientWidth;
Self.Height:=CurClientHeight;
end
else
// если буфер заполнен
begin
// восстановить текущую позицию и размер формы
Self.Top:=Self.BufTop;
Self.Left:=Self.BufLeft;
Self.Width:=Self.BufWidth;
Self.Height:=Self.BufHeight;
// обнулить буфер
Self.BufTop:=0;
Self.BufLeft:=0;
Self.BufWidth:=0;
Self.BufHeight:=0;
end;
end
else inherited;
end;
WM_NCLBUTTONDBLCLK:
// если двойной клик
begin
if Message.WParam=HTCAPTION then
// на заголовке формы
begin
// послать системную команду развернуть форму на весь экран
SendMessage(Handle,WM_SYSCOMMAND,SC_MAXIMIZE,Message.LParam);
end
else inherited;
end;
else inherited;
end;
end;
Эта переопределенная процедура перехватывает системное сообщение с командой о развертывании формы на весь экран. После этого проверяет заполнен ли буфер размеров и позиции формы. В зависимости от этого либо увеличивает форму на все клиентское пространство головной формы, либо восстанавливает текущую позицию и размеры формы. Кроме этого перехватывается двойной клик мышкой на заголовке формы. После этого форме отправляется системное сообщение о развертывании формы на весь экран. В остальных же случаях выполняется процедура WndProc родительского компонента - собственно формы (TForm).
Для проверки работы вновь созданной формы перейдите в модуль PCMain описания главной формы приложения, в секции implementation в разделе uses добавьте имя модуля PCMDIChild, как показано ниже:
uses VLDefinition, PCMDIChild;
Далее загрузите редактор компонента am - менеджера действий (TActionManager см. рис. 2.2), дважды щелкните левой кнопкой мыши на действии LibOKP (Классификатор ОКП). Delphi создаст процедуру для этого действия. Введите в тело процедуры строку, как указано ниже:
procedure TPLMCom.LibOKPExecute(Sender: TObject);
begin
// создать форму
TfmMDIChild.Create(Application);
end;
Скомпилируйте проект, загрузите приложение и проверьте как реагирует форма на развертывание на весь экран и двойной клик на заголовке.
На этом данный урок закончим.
.....Продолжение...