Как закрыть одну форму и открыть другую в c
При нажатии на кнопку Button, открываем из одной формы Form1, другую форму Form2.
Для Form1:
Unit1.cpp
#include #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) < >//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) < // Form2->ShowModal(); Form2->Show(); >
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include //--------------------------------------------------------------------------- class TForm1 : public TForm < __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); >; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
Для Form2:
Unit2.cpp
#include #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) < >//--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) < Form2->Close(); >
Unit2.h
#ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include #include #include #include //--------------------------------------------------------------------------- class TForm2 : public TForm < __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm2(TComponent* Owner); >; //--------------------------------------------------------------------------- extern PACKAGE TForm2 *Form2; //--------------------------------------------------------------------------- #endif
- C++ Builder
- Button
- Form
- VCL Forms Application
- Windows Application
- Show
- Назад
- Вперёд
- Вы здесь:
- Главная

- Уроки и примеры по программированию С++

- Уроки и примеры программирование на C++ в Builder 6

- Из первой формы Form 1 открыть вторую форму Form2 | Программирование С++
Меню
- Главная
- Уроки и примеры по программированию С++
- Уроки и примеры программирование на C++ в Builder 6
- Уроки и примеры программирования на C++ в Embarcadero RAD Studio 10 | C++ Builder 10
- Примеры FireMonkey
- Примеры с аудио
- Примеры с видео
- Примеры Microsoft Excel
- Примеры Microsoft Word
- Примеры часов и таймеров
- Примеры с архивами
- Настройка C++ Builder 6
- Настройка Embarcadero RAD Studio 10 | C++ Builder 10
- Настройка Qt
© 2024 C++ Репeтитор | Уроки по программированию на С++ | C++ Уроки | Примеры программ С++
Закрыть Form1, открыть Form2
Да-да-да, понимаю, тема «заезжая», но сколько я не рыл, ни где толком не объясняется почему все скрывают/показывают форму так:
Form2 frm = new Form2(); this.Hide(); frm.Show();Таким способом, активная форма не закрывается, а скрывается, правильно? Как правильно закрыть Form1 и открыть Form2 ?
Отслеживать
22.4k 10 10 золотых знаков 56 56 серебряных знаков 120 120 бронзовых знаков
задан 5 окт 2016 в 13:47
509 3 3 золотых знака 8 8 серебряных знаков 20 20 бронзовых знакова зачем вам полностью закрывать форму? опишите задачу подробнее. По умолчанию, первая форма в проекте запускается как приложение и при закрытии формы — закрывается приложение.
5 окт 2016 в 13:51
@rdorn, например, ту форму которую хочу закрыть — она мне больше не понадобится, зачем её держать?
5 окт 2016 в 13:53
а вариант использования UserControl в размер формы вместо форм не рассматривали?
5 окт 2016 в 13:54
@rdorn, приведите, пожалуйста, пример, если не затруднит. Вы сами, вообще, как скрываете форму? 🙂
5 окт 2016 в 13:583 ответа 3
Сортировка: Сброс на вариант по умолчанию
В проекте WinForms есть два вида форм — главная и дочерние. Разница между ними в том, что главная форма по сути и является приложением, поэтому при ее закрытии происходит выход из приложения.
Одним из решений является скрытие главной формы, вместо закрытия. Этот вариант уже написан в вопросе. Он обычно применяется, когда главная форма так или иначе используется в дальнейшем.
Если первая форма в дальнейшем не используется, то можно использовать 2 варианта:
1. Правим Program.cs
По умолчанию содержимое файла Program.cs выглядит так:
using System; using System.Windows.Forms; namespace WindowsFormsApplication4 < static class Program < ////// The main entry point for the application. /// [STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); >> >Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения.
Чтобы этого не произошло, можно прописать последовательность запуска форм:
Application.Run(new Form1()); Application.Run(new Form2()); Application.Run(new Form3());Тогда при закрытии первой формы, будет вызвана вторая и так до последней.
Недостаток — сложно передавать данные между формами. Да можно определить поля в классе Program , конструкторы с параметрами в формах и передавать данные через эти поля и параметры конструкторов, но что делать если нужно вернуться в одну из предыдущих форм? Пилить сложную логику переходов в Main — не сама лучшая идея, мягко говоря.
2. Переходим от форм к контролам
В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму.
После того, как набор таких контролов подготовлен, вам остается только разместить их на форме с параметром Dock = DockStyle.Fill и управляя значением свойства Conrol.Visible , показывать тот контрол, который вам нужен в данный момент. Если не хотите держать контрол в памяти, ни кто не мешает просто создавать его в нужный момент и отображать, а после использования и переключения на новый контрол, отписаться от событий, вызвать Dispose() , удалить все ссылки и отдать его на растерзание сборщику мусора. Только выигрыш от этого невелик, особенно если вдруг надумаете снова его показать.
Забыл написать про еще один недостаток переключения между формами через Main . Каждая новая форма будет открываться немного в другом месте, может для защиты от программ-автокликеров это и хорошо, но меня, как пользователя, такое поведение раздражает, и думаю что не только меня.
Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper
Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.
Как закрыть одну форму и открыть другую в c
Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выберем Add(Добавить)->Windows Form.

Дадим новой форме какое-нибудь имя, например, Form2.cs:

Итак, у нас в проект была добавлена вторая форма. Теперь попробуем осуществить взаимодействие между двумя формами. Допустим, первая форма по нажатию на кнопку будет вызывать вторую форму. Во-первых, добавим на первую форму Form1 кнопку и двойным щелчком по кнопке перейдем в файл кода. Итак, мы попадем в обработчик события нажатия кнопки, который создается по умолчанию после двойного щелчка по кнопке:
private void button1_Click(object sender, EventArgs e)
Теперь добавим в него код вызова второй формы. У нас вторая форма называется Form2, поэтому сначала мы создаем объект данного класса, а потом для его отображения на экране вызываем метод Show:
private void button1_Click(object sender, EventArgs e)
Теперь сделаем наоборот — чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.
Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и содержит только конструктор. Поскольку C# поддерживает перегрузку методов, то мы можем создать несколько методов и конструкторов с разными параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp < public partial class Form2 : Form < public Form2() < InitializeComponent(); >public Form2(Form1 f) < InitializeComponent(); f.BackColor = Color.Yellow; >> >
Фактически мы только добавили здесь новый конструктор public Form2(Form1 f) , в котором мы получаем первую форму и устанавливаем ее фон в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:
private void button1_Click(object sender, EventArgs e)
Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект — объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.
Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.
Мы можем также создавать объекты и текущей формы:
private void button1_Click(object sender, EventArgs e)
При работе с несколькими формами надо учитывать, что одна из них является главной — которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Как закрыть одну форму и открыть другую в c
Сообщений: 1,762
можно в модуле проекта такие формы создавать динамически, ну вернее форму то заранее можно подготовить, а тут толко использовать примерно так.
program new; uses Forms, sysutils, Unit1 in 'Unit1.pas' , Unit2 in 'Unit2.pas' , PassWord in 'PassWord.pas' ; var frmpswrd:TPasswordDlg; error_:string; begin Application.Initialize; Application.CreateForm(Tdm, dm); frmpswrd:=TPasswordDlg.Create(nil); try frmpswrd.Server_Name.Text:= dm.Database_Main.DBName; frmpswrd.UName.Text:= dm.Database_Main.ConnectParams.UserName; repeat frmpswrd.ShowModal; if frmpswrd.ModalResult = 1 then begin dm.Database_Main.DBName := '192.168.1.100:baza'; end; dm.Database_Main.ConnectParams.Password:=frmpswrd.Password.Text; dm.Database_Main.ConnectParams.UserName:=frmpswrd.UName.Text; try dm.Database_Main.Connected:=true; except begin dm.Database_Main.Connected:=False; end; end; end; until (dm.Database_Main.Connected) or (frmpswrd.ModalResult <> 1); finally frmpswrd.Free; end; if dm.Database_Main.Connected then begin Application.CreateForm(TForm1, Form1); Application.Run; end else Begin dm.Free; Application.Terminate; End; end.