Перейти к содержимому

Как закрыть одну форму и открыть другую в c

  • автор:

Как закрыть одну форму и открыть другую в 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:58

      3 ответа 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *