Приложение, содержащее несколько форм в Delphi и C++Builder
Запустите на выполнение Delphi или C++Builder. Создайте новый проект, выбрав в меню File | New | VCL Forms Application – Delphi (File | New | VCL Forms Application – C++Builder). Появится форма нового проекта. Щелкните мышью по новой пустой форме.Задание характеристик главной формы
Установите для главной формы следующие значения свойств:
·
Свойству
Position задайте значение (выберите из выпадающего списка) poScreenCenter, чтобы
форма при запуске располагалась в центре экрана,
·
Для
свойства BorderStyle выберите из выпадающего списка значение bsSizeable (это
значение по умолчанию и должно быть уже установлено для формы).
Положите на форму из списка Standard набора инструментов Tool Palette две кнопки Button. Кнопкам задайте надписи (свойство Caption) Форма 2 и Форма 3. Форма примет следующий вид (рис. 1).
Рис. 1. Главная форма
Создание дочерних форм
Создайте новую форму, выбрав в меню File | New | Form – Delphi (File | New | VCL Form C++ Builder). В проект будет добавлена новая форма Form2.Для свойства формы BorderStyle выберите из выпадающего списка значение bsToolWindow.
Положите на эту форму кнопку Button, задав надпись (свойство Caption) Закрыть. Дважды щелкните мышью по кнопке и в появившейся заготовке для обработчика события щелчка по кнопке введите оператор закрытия формы, одинаковый для Delphi и для C++Builder:
Close();
Для свойства кнопки Cancel щелкните мышью в правой части по значению False. У значения появится галочка, и текст будет заменен на True. В результате такой установки будет вызываться событие щелчка по кнопке, когда пользователь нажмет клавишу Esc.
Форма примет следующий вид:
Рис. 2. Вид второй формы
Перейдите к первой форме Form1. Вначале нужно связать главную форму с дочерней. Для этого выберите в меню File | Use Unit или нажмите клавиши Alt+F11. Появится окно Use Unit (рис. 3 Delphi, рис. 4 C++Builder).
Рис. 3. Окно Use Unit (Delphi)
Рис. 4. Окно Use Unit (C++Builder)
Для связывания дочерней формы щелкните мышью по строке Unit2.pas (Unit2.cpp), а затем по кнопке OK. Главная форма Form1 станет связанной с дочерней формой Form2.
Теперь нужно написать обработчик события щелчка по кнопке Форма 2, где должна вызываться вторая форма Form2. Дважды щелкните мышью по кнопке Форма 2 и в появившейся заготовке обработчика события щелчка по кнопке напишите следующее.
procedure TForm1.Button1Click(Sender:
TObject);
begin
Form2.ShowModal();
end;
C++Builder
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
Form2->ShowModal();
}
Запустите программу на выполнение. Щелкните мышью по кнопке Форма 2. На экране появится вторая форма. Изменить размеры этой формы нельзя. Невозможно также вернуться к первой форме, не закрыв вторую, поскольку вторая форма вызывается в модальном режиме при помощи метода формы ShowModal(). Для закрытия второй формы можно щелкнуть по кнопке Закрыть или нажать клавишу Esc.
Аналогичным образом создайте третью форму Form3. Для свойства BorderStyle выберите из выпадающего списка значение bsSizeToolWin.
Положите на форму кнопку Button, задав надпись (свойство Caption) Закрыть. Дважды щелкните мышью по кнопке и в появившейся заготовке для обработчика события щелчка по кнопке введите оператор закрытия формы, одинаковый для Delphi и для C++Builder:
Close();
У свойства кнопки Default щелкните мышью в правой части по значению False. У значения появится галочка, и текст будет заменен на True. В результате такой установки будет вызываться событие щелчка по кнопке, когда пользователь нажмет клавишу Enter.
Перейдите к первой форме Form1. Соедините эту форму с формой Form3. Напишите обработчик события щелчка по кнопке Форма 3. Дважды щелкните мышью по кнопке Форма 3 и в появившейся заготовке обработчика события щелчка по кнопке напишите:
procedure TForm1.Button2Click(Sender:
TObject);
begin
Form3.Show();
end;
C++Builder
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
Form3->Show();
}
Форма вызывается при обращении к методу формы Show() (в отличие от вызова формы Form2, где использовался метод ShowModal()). Метод Show() позволяет вызвать форму не в модальном варианте. После создания такой формы без ее закрытия можно перейти к главной форме. Можно также создать произвольное количество других немодальных форм и перемещаться между ними любым допустимым для операционной системы способом. При закрытии главной формы подчиненные формы закрываются автоматически.
Для создания и вызова произвольного количества экземпляров одной и той же формы измените обработчик события щелчка по кнопке Форма 3.
procedure TForm1.Button2Click(Sender:
TObject);
var aForm:
TForm3;
begin
Application.CreateForm(TForm3, aForm);
aForm.Show();
end;
Здесь описывается переменная aForm, которая будет использована для создания нового экземпляра формы Form3. Метод CreateForm класса Application создает экземпляр указанного класса (в нашем случае Form3) и помещает дескриптор созданного объекта в переменную aForm. Затем форма вызывается при помощи метода Show().
C++Builder
void
__fastcall
TForm1::Button2Click(TObject
*Sender)
{
Application->CreateForm(
__classid(TForm3),
&Form3);
Form3->Show();
}
Здесь метод CreateForm класса Application создает экземпляр указанного класса (в нашем случае TForm3). Затем форма вызывается при помощи метода Show().
В этом варианте можно создавать произвольное количество форм Form3 и переключаться между ними, используя обычные средства Windows.
Задание стартовой формы
Если в программе существует несколько форм, то можно изменить стартовую форму — форму, которая первой будет появляться на экране при запуске приложения. Выберите в меню Project | Options или нажмите клавиши Shift+Ctrl+F11. Появится окно режимов текущего проекта. В левой части окна щелкните мышью по строке Forms, в выпадающем списке Main form: выберите форму Form2 и щелкните по кнопке OK.Рис. 5. Выбор стартовой формы (Delphi)
Рис. 6. Выбор стартовой формы (C++Builder)
Запустите программу на выполнение. Появится вторая форма этого приложения. Другие формы увидеть в данном случае будет нельзя.
>> Application.CreateForm(TForm3, aForm);
ОтветитьУдалитьЗачем так сложно? Почему же не "aForm := TForm3.Create(Self);"?
И в немодальную форму стоит добавить подобный обработчик, иначе память течет:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Ну и если уж совсем буквоедствовать, то Form2 и Form3 можно перенести в список "Available forms" и создавать их не всегда при запуске приложения, а самостоятельно по требованию.