Code:

private

  Procedure WMSize( Var msg: TWMSize ); Message WM_SIZE;

...

Procedure TChildForm.WMSize( Var msg: TWMSize );

Begin

inherited;

If msg.SizeType = SIZE_MINIMIZED Then

   ...

End;

 

Так как MDI-приложения всегда объединяют меню дочерних окон с главным меню родительского окна, вы можете установить определенное значение для указания позиции элементов меню в новой, объединенной строке меню. Это называется индексом группы. Но работает оно только для видимых пунктов меню.

 

Так, например, если ваше MDI-меню имеет:

[Файл] [Вид] [О программе] (со значениями индексов групп 1 5 10) (Значения не имеют никакого значения (извините за невольный каламбур), они используются только лишь для сортировки),

 

 

Code:

constructor TMainForm.Create(AOwner: TComponent);

begin

Inherited Create(AOwner);

SetWindowLong(ClientHandle, GWL_EXSTYLE,

GetWindowLong(ClientHandle,

GWL_EXSTYLE) or WS_EX_CLIENTEDGE);

SetWindowPos(ClientHandle, 0, 0, 0, 0, 0,

   swp_DrawFrame or swp_NoMove or swp_NoSize

   or swp_NoZOrder);

end;

 

 

Когда во время разработки вы устанавливаете "DataSource"-свойство в БД-компонентах для указания на модуль данных, VCL во время выполнения приложения будет пытаться создать связь с существующим TDataModule, основываясь на его свойтсве Name. Так, если вы добавите модуль данных к вашему проекту и переместите его в свойстве проекта из колонки автоматически создаваемых форм в колонку доступных, вы сможете разработать форму, содержащую элементы управления для работы с базами данных, после чего несколькими строчками кода можете создать экземпляр формы, имеющий экземпляр собственного модуля данных.

 

С помощью Репозитория создайте "standard MDI application" (стандартное MDI-приложение), в котором модуль TMDICHild будет похож на приведенный ниже. Добавленные строки имеют комментарий {!}. Хитрости спрятаны в конструкторе create и задании другого порядка следования операторов.

 

Если вам просто нужно отобразить всплывающие подсказки от элементов управления вашей дочерней формы, то сделайте это в вашей главной форме.

 

Объявите следующую процедуру в классе вашей главной формы:

Code:

private

{============================================================}

{ Процедура, вызываемая приложением всякий раз, когда        }

{ приложение хотело бы показать всплывающую подсказку.       }

{ Добавляет хинт на панель статуса.                          }

{============================================================}

procedure ShowHint(Sender : TObject);

 

 

Code:

var

ProjectWindow: TWndProject;

begin

If ProjectActive=false then

begin

   LockWindowUpdate(ClientHandle);

   ProjectWindow:=TWndProject.Create(self);

   ProjectWindow.Left:=10;

   ProjectWindow.Top:=10;

   ProjectWindow.Width:=373;

   ProjecTwindow.Height:=222;

   ProjectWindow.Show;

   LockWindowUpdate(0);

end;

end;

 

 

Используйте LockWindowUpdate перед созданием окна и после того, как создание будет завершено.

 

перевод одноимённой статьи с delphi.about.com)

   Что такое MDI?

MDI расшифровывается как multiple document interface (многодокументный интерфейс). В приложениях с MDI, в основном (родительском) окне можно окрыть более одного дочернего окна. Данная возможность обычно используется в электронных таблицах или текстовых редакторах.

 

Каждое MDI приложение имеет три основные составляющие:

Одну (и только одну) родительскую форму MDI, Одну и более (обычно больше) дочерних форм MDI, и основное меню MDI.

Автор: Richard Cox

 

Проблема, с котороя я столкнулся, заключается в том, что нижняя часть дочерней формы загораживает панель состояния родительской формы...

 

У меня была аналогичная проблема -- она проявлялась при условии, когда свойство главной формы WindowState устанавливалось на wsMinimized.

 

Вот мое решение: добавьте этот небольшой метод к вашей главной форме:

 

Code:

Form1.MDIChildCount

 

Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию

для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть

 

 

Code:

procedure TFormX.FormCreate(Sender: TObject);

Var

  r: TRect;

  client: HWND;

Begin

  client := application.mainform.clienthandle;

  Windows.GetClientRect( client, r );

  MapWindowPoints( client, HWND_DESKTOP, r, 2 );

  BoundsRect := r;

End;