Шаг 88 - Как управлять формами?

Здравствуйте Господин Самвел! Прошу Вас поместите еще один необходимый шаг в раздел C++ Builder. Даже в форуме на Sources.ru мне отвечают не то что надо или меня понять не могут или ... В общем меня интересует такая вещь как управление окнами в рамках одного приложения. Т.е. у меня есть MDI main form и две MDI child. Так вот, первая child при своем открытии создает вторую child. Вторая child не может существовать без первой и при закрытии первой нужно из первой, например, закрыть эту вторую форму. На форуме мне советовали и Release и т.п. но все выходит в ошибку. Итак вопрос как управлять из какой-то формы, в рамках одного приложения, свойствами другой формы. Т.е. двигать форму, закрывать, сворачивать и т.д. У меня получилось только создать.

С уважением Дмитрий.

В принципе, по логике VCL формы (диалоговые окна) делятся на три типа: обычные, MDI формы, MDI субформы. Или дочерние окна. Если интересно, могу сказать, что с точки зрения Windows особой разницы между ними нет - разница только в родителе формы. Собственно форма (окно) является базовым элментом управления Windows, по сути пустым, то есть не несущим на себе никакой другой роли, кроме роли контейнера. Ну, на самом деле мы можем взять тот же ComboBox, добавить к его стилю при создании (как это сделать - в следующм шаге) стили WS_OVERLAPPED|WS_BORDER|WS_MINIMIZE и получим диалоговое окно с единственным элементом - этим COMBOBOX.

Стиль формы определяется свойством FormStyle, может быть fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop. Первые три прямо о себе говорят, ну а последнее - что оно постоянно на виду. Вообще-то странно, почему это не отдельное свойство, поскольку на уровне API можно любое окно сделать StayOnTop. Ну у ребят из Borland какие-то там свои задумки, это они наверное специально сделали, чтобы сбить с толку конкурентов.

Поясняю на примере. Допустим. у нас есть основное окно, у которого свойство FormStyle установлено в fsMDIForm. Нужно, чтобы по нажатию File->New создавалось дочернее окно. Самый простой, отчасти кликовый вариант этого - делаем основную форму TMainForm, устанавливаем свойство FormStyle куда надо, делаем дочернюю TChildForm, также устанавливаем ее свойство (а как же иначе), и... Теперь, как это ни странно, нужно немного поработать клавиатурой.

#include "childform.hpp"

void __fastcall TMainForm::New1Click(TObject* Sender)
{
	TChildForm* newform = new TChildForm(this);
	newform->Show();
}

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

Меняем позицию формы на экране абсолютно по-детски - изменяя свойства Left, Top, Width и т.д. и т.п.

Что же еще сказать-то можно. В общем интересное наблюдение - при создании формы необходимо указывать Owner'а, потому что для освобождения памяти под форму используется именно он. То есть, допустим, вы закрываете форму Release'ом, если Owner не указан, освобождения области памяти не происходит. Поправьте меня, если я не прав.

В следующем шаге рассмотрим возможность изменения Window Style и Class Style.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 7.02.2004