Как связать две формы в c

Обновлено: 19.04.2024

БлогNot. Visual C++: из формы в форму

Visual C++: из формы в форму

Несмотря на то, что моё мнение о микрософтовском Visual Studio по-прежнему остаётся невысоким, иногда приходится что-то делать и на нём. Если смириться с тем, что пишем мы при этом, собственно, не на C++, а на так называемом C++/CLI, работа с привычными визуальными компонентами будет не так уж сильно отличаться от тех же Борландовских сред. А вот взаимодействие форм и модулей способно, по сравнению с Builder'ом, создать проблемы. Рассмотрим 3 типовых ситуации работы с приложением, содержащим больше одной формы. Среда примера - бесплатная Visual C++ 2010 Express, предполагается, что главная форма имеет имя по умолчанию Form1 .

Пример конструирования и программного вызова формы

Этот код можно выполнить, например, по нажатию кнопки в главной форме Form1.

Для добавления обработчика нажатия программно сгенерированной кнопки button2 достаточно перед последней строкой кода написать:

- до того, как будет вызван метод form2->ShowDialog() или form2->Show();

При этом код обработчика размещён в текущем модуле Form1.h :

Вызвать другую форму из главной формы

В меню выберем Проект - Добавить новый элемент - Форма - имя Form2

перед первым namespace в Form1.h (то есть, в самое начало файла).

Включим указатель на экземпляр класса в секцию public класса Form1 :

Добавим код там, где нужно создать и вызвать вторую форму:

Для программного удаления второй формы подойдёт код

Следует учесть, что указатель хранит адрес только одной формы, той, что создана последней. Если мы последовательно создали таким кодом несколько форм, удалена будет только последняя из них. Как вариант попробуйте массив форм, описанный ниже.

Опишем нужные данные в классе формы Form1 (здесь имя и namespace проекта Tabulator , если нужно, замените на своё):

Потом инициализируем данные по событию Load главной формы:

Затем реализуем код для создания очередной формы

Если мы хотим создавать дочерние формы не отдельно, а внутри родительской формы, то в свойствах Form1 нужно указать, что она "предок" (установить свойство IsMdiParent = true ), а перед показом дочерней формы оператором F2[FormCount-1]->Show() пометить её как потомка Form1:

Вызвать из дочерней формы метод родительской формы

Нам едва ли обойтись без привлечения файлов .cpp, что неплохо - писать код в файлах .h правильного Си'шника вообще ломает :)

Распишем процесс по шагам.

1) Имеются 2 формы - Form1 и Form2 , на Form1 располагаются Button ( button1 , будет открывать вторую форму) и Label ( label1 , здесь будем менять текст). На Form2 - button1 , по нажатию на которую будет происходить смена текста в label1 .

2) Так как нам из первой формы нужно иметь доступ ко второй, а из второй к первой, то будет возникать проблема перекрестных ссылок (когда Form1.h ссылается на Form2.h , который, в свою очередь, опять ссылается на Form1.h ). Для того, чтобы этого избежать, код первой формы ( Form1 ), который будет иметь доступ ко второй форме ( Form2 ), мы вынесем из .h-файла в .cpp файл. Таким образом нужно создать файл Form1.cpp .

4) В файле Form2.h подключаем Form1.h (в начале):

и создаем конструктор, который будет принимать и сохранять ссылку на первую форму для дальнейшего использования: //ниже сразу ниже можно прописать ссылку: private: Form1^ parentForm;

5) По клику кнопки в Form2 будем вызывать метод Set родительской формы:

6) Осталось в первой форме сделать открытие второй формы. Для этого из Form1.h обработчик нажатия кнопки переносим в Form1.cpp , а в .h-файле оставляем только его объявление.

Код в файле Form1.cpp :

В Form1.h вставляем только строку:

На этом все. Можно скомпилировать и проверить проект, архив во вложении:

Наладить взаимодействие двух форм

На самом деле, просто развитие идеи. Здесь первая форма умеет передавать данные в текстовое поле второй и наоборот. Теперь они друг друга не "прячут", так что можно создать и много экземпляров второй формы.

из Form1:
Form2 frm = new Form2(); frm.label1.Text = "hello"; frm.Show();

Так как после закрытия формы Form2 она уничтожается, то я переопределяю метод для закрытия - OnClosing. Нужно зайти в конструктор формы Form2. В свойствах формы найти значок с молнией. В списке найти FormClosing и кликнуть дважды на пустое поле справаот него. В редакторе кода появится новый метод, в котором я пишу следующее:

Далее другой пример, который касается взаимодействия дочерней формы и родительской. Form1.cs:

Спасибо. А как закрыть первую форму, при нажатии на кнопку? Я делаю this.Close и закрывается вся программа.

@Святослав Правильно, ведь Form1 это родительская форма. Если нужно убрать с экрана, то используйте Hide().

Потому что Первая форма открыта. Если ты сделал команду this.Hile(); То она просто спрятана(свернута), чтобы её закрыть используй this.Close(); Или я что-то неправильно понял в вопросе?

Первая форма скрыта, ее просто не видно, т.к. мы ее скрыли, но программа продолжает выполняться. Есть 2 пути: 1. В событии OnClosing второй формы вызвать Show() для первой формы. 2. В событии OnClosing второй формы вызвать Application.Exit(), тогда отладка остановится, но это будет не логично, так как обычно выход из программы делают из родительской формы.

На самом деле довольно просто. Экземпляр формы - это экземпляр класса, поэтому если нужен доступ снаружи к чему-то внутри формы, просто сделайте соответствующее public свойство (или поле, или метод - как вам больше нравится).

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

ну а как обращаться, я думаю, понятно и без объяснений, правда?

Мне нет. Вот давайте разберем на примере. у меня есть 2 формы Form1 и Form2, на Form1 есть Label, а на Form2 есть кнопка, и как сделать так чтобы при нажатии на кнопку Label на Form1, получил значение "УРА ЗАРАБОТАЛО"?

@Angus123 В конструкторе формы у элемента к которому хотите обратиться выставите свойство Modifiers - Public

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

Когда форма принадлежит другой форме, она закрывается или скрывается с формой владелицей. Например, рассмотрим форму Form2, которая принадлежит форме Form1. Если Form1 закрывается или сворачивается, Form2 также закрывается или сворачивается. Дочерние формы также никогда не отображаются сзади формы-владельца.

*Операции выполняются внутри тела класса родительской формы к котрой присоединяется дочерняя. Производный класс userForm унаследованный от класса Form, должен быть предварительно объявлен(здесь это опущено).

Теперь, в зависимости от потребностей вы можете

    Доверить процесс удаления дочернего окна сборщику мусора. В данном случае оно будет удалено после закрытия главного окна (если программистом не предусмотрено другого)

Выполнить контролируемое удаление дочернего окна, после наступления необходимого вам события, для этого в теле необходимого вам метода, обрабатывающего наступление какого либо нужного вам события, нужно указать:

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

Даны 2 формы в 1 нужно создать компоненты допустим выбор цветов одна кнопка выпадающий список вторая прокручиваемый список с колером этих же цветов.
При выборе цвета должна открыться форма 2 в ней два окна первое название цвета а второй колер.
С помощью каких компонентов это можно осуществить? И как связать 2 формы?
Формы созданы на Визуал 2010

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


Как связать элементы формы и конструктор класса?
Доброго времени суток. Подскажите пожалуйста, вот у меня есть форма, на ней есть TextBox. как.

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

Связать размер элента с размером формы
Здраствуйте. Мне нужно, что бы при раскрытии формы на весь экран элемент webBrowse так, же.

Учу формы по одному ресурсу, незнаю можно ли сюда кинуть ссылку, поэтому просто напишу. Есть форма с кнопкой и текстовым полем. Надо ввести число, и нажать на кнопку. После чего, число вводиться в квадрат, появляется новая форма с одним текстовым полем, в котором будет отображаться квадрат того числа, что я вводил.
Для этого надо создать на первой форме кнопку и текстовое поле. Потом создать форму2 и перенести на неё текстовое поле и сделать ето поле public.
Проблема вот в чем, в коде реакции на нажатие кнопки я не могу создать новую форму(98 стока). Хотя сделал все как в том уроке.
Form1

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


Как связать 2 формы?
Даны 2 формы в 1 нужно создать компоненты допустим выбор цветов одна кнопка выпадающий список.


Как связать элементы формы и конструктор класса?
Доброго времени суток. Подскажите пожалуйста, вот у меня есть форма, на ней есть TextBox. как.

Как объединить две формы?
Здравствуйте! У меня есть два разных проекта. Первое меню, второе одна из окон там. Помогите на.

Странно, вроде все правильно. А какие ошибки показывает?
P.S. Киньте ссылку на ресурс в личку, тоже учусь=)

Добавлено через 16 минут
Что-то сразу не додумался спросить, а вы саму форму в проект добавили? Project->Add New Item->Windows Forms.
Если нет, добавьте как я описал и назовите ее, например как в учебнике Form2, после этого должно все работать.

Добавлено через 47 секунд
А пишет просто что индефикатор Form2 не определен.

К сожалению у меня проект не открывается, видимо у вас более новая версия Visual? У меня VS 2010.
Посмотрел исходные коды, что я заметил, у вас Form2 определен в пространстве имен PhoneBase,
а Form1 в WindowsFormsApplication. Поэтому наверно и пишет, что индентификатор Form2 не определен. Видимо как-то неправильно добавили форму в проект или сами так задали.
Поэтому либо попробуйте:
1) в главном файле WindowsFormsApplication.cpp написать using namespace PhoneBase;.
Тогда у вас должны будут быть видны все переменные, классы из этого пространства.

3) либо заново добавить форму, только чтоб она была определена в том же пространстве имен WindowsFormsApplication

Вложил проект консольной программы, там пример по работе с пространствами имен.
Либо в интернете почитайте еще.

По умолчанию все формы в Windows Forms являются прямоугольными. Однако мы можем создавать и непрямоугольные произвольные формы. Для этого используется свойство Region . В качестве значения оно принимает объект одноименного класса Region.

При создании непрямоугольных форм, как правило, не используются границы формы, так как границы задаются этим объектом Region. Чтобы убрать границы формы, надо присвоить у формы свойству FormBorderStyle значение None .

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

Итак, перейдем к коду формы и изменим его следующим образом:

Непрямоугольные формы в Windows Forms

Создание области формы происходит в обработчике события Form1_Load. Для создания области используется графический путь - объект класса System.Drawing.Drawing2D.GraphicsPath , в который добавляется эллипс. Графический путь позволяет создать фигуру любой формы, поэтому, если мы захотим форму в виде морской звезды, то нам просто надо должным образом настроить используемый графический путь.

Для закрытия формы в обработчике события нажатия кнопки button1_Click форма закрывается программным образом: this.Close()

Для перемещения формы обрабатываются два события формы - событие нажатия кнопки мыши и событие перемещения указателя мыши.

Читайте также: