- Объединения c windows forms
- WinForms две формы
- 14 ответов
- Практическое руководство. Группировка элементов управления с помощью элемента управления GroupBox в формах Windows Forms How to: Group Controls with the Windows Forms GroupBox Control
- Создание группы элементов управления To create a group of controls
- Как связать две формы?
- 5 ответов 5
- Объединения c windows forms
- Visual C++: из формы в форму
Объединения c windows forms
Уроки Windows Forms C++/C#
Объединение двух форм в MVS C++
В данном уроке будет рассмотрен очень актуальный и популярный вопрос – «Как связать две формы?». Написано огромнейшее количество программ, в которых после нажатия кнопки появляется новая форма с новыми элементами. Рассмотрением этого вопроса мы и займёмся. В этом уроке будет показан простой пример, того как связать две форма, а в «следующем уроке» уже будет рассмотрено создание простой базы данных. И так, первым делом создайте проект в приложение «Windows Forms», после этого появиться, уже наверно, привычная вам форма. Теперь нужно создать вторую форму в этом жу проекте – это делается следующим образом: выбираете в верхнем меню раздел «Проект», после чего откроется новою меню, в котором нужно будет выбрать «Добавить новый элемент», после этого появиться новое окно, в котором уже будет выделен элемент «Форма Windows Forms», вам нужно будет назвать его –«form2». Ниже представлена иллюстрация действий:
После этого на панели появиться вторая форма конструктора. Суть учебного примера следующая – на «Form1» находится текстовое поле и кнопка, в текстовое поле вводится число, нажимается кнопка, введенное число возводится в квадрат, после чего появляется «form2» на котором тоже есть текстовое поле, где будет показан результат возведения числа в квадрат. Важно понять следующее – поскольку элемент «textBox1» будет находится на обоих формах, то его нужно объявить как public в верху кода формы «form2», а в коде формы «Form1» в самом верху кода подключить библиотеку второй формы #include «form2», так же в одном из событий нужно писать: form2^ gform2 = gcnew form2;              gform2->Show();              gform2->какой-то элемент;
Перенесите на первую форму «textBox» и «button», а на вторую просто «textBox». Теперь в форму один запишите этот код:
#pragma once #include «form2.h» namespace Two_Forms < using namespace System; . . . #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) < Single a, b = 0; Single A = Single::TryParse(textBox1->Text, System::Globalization::NumberStyles::Number, System::Globalization::NumberFormatInfo::CurrentInfo, a); b = a*a; textBox1->Text = String::Format(«Равно: <0:f5>«, b); form2^ gform2 = gcnew form2; gform2->Show(); gform2->textBox1->Text = this->textBox1->Text; > >; >
А в «form2» просто поменяйте private на public у элемента textBox ^
#pragma once namespace Two_Forms < using namespace System; . . . public: System::Windows::Forms::TextBox^ textBox1; // protected: private: /// /// Требуется переменная конструктора. /// . . .
Результат:
Следующий урок >>
WinForms две формы
Есть две формы.
На первой и на второй есть одна кнопка и текстбокс. Нужно что бы при нажатии кнопки на 1й форме появлялась 2я форма, а при нажатии кнопки на второй форме, она записывала какой-то текст в текстбокс 1й формы.
По-идее реализуется след. кодом:
На 1й форме:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
form2 ^myobj1=gcnew form2;
myobj1->Show();
>
На 2й форме:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
Form1 ^frm1;
frm1=this->Owner;
frm1->textBox1->Text =»321″;
>
Но возникают ошибки, т.к. первая форма незнает что такое form2, а вторая форма незнает что такое form1.
По-идее в каждой форме нужно подключить файл другой, т.е.
в первой:
#include «form2.h»
во второй
#include «form1.h»
Но в таком случае возникает окуча ошибок, по всей видимости из-за двойного определения.
#ifndef
#pragma once
не помогают
Подскажите, пожалуйста, как реализовать данную задачу. Задача по своей сути элементарна, но как сделать — хз
14 ответов
Касаемо того, что по-умолчанию у объектом облсть видимости private — я знаю. Ее переделал в public.
Значит создано 2 формы, соответственно первая Form1 и вторая Form2
На первой создаем текстбокс и кнопку, которой задаем код, который бы показывал нам 2ю форму. Вот собственно код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
Form2 ^frm2 = gcnew Form2();
frm2->Show();
>
Пытаемся запустить. Бац — ошибка
1>d:\programs\2forms\Form1.h(98) : error C2065: ‘Form2’ : undeclared identifier
1>d:\programs\2forms\Form1.h(98) : error C2065: ‘frm2’ : undeclared identifier
1>d:\programs\2forms\Form1.h(98) : error C2061: syntax error : identifier ‘Form2’
1>d:\programs\2forms\Form1.h(99) : error C2227: left of ‘->Show’ must point to class/struct/union/generic type
Естественно мы понимаем, что компилятор, читая код в файле Form1.h понятия не имеет, что есть еще класс Form2.h Ну мы исправляем это досадное недоразумение, путем записи в файл Form1.h следующей строчки:
#include «Form2.h»
Запускаем. Вуаля!! У нас на экране появляется форма. При нажатии на кнопку у нас появляется наша 2я форма. Казалось бы, с половиной задачи мы справились. Теперь нам нужно, что бы при нажатии кнопки во второй форме у нас появлялся какой-то текст в окне первой.
Идем на 2ю форму, создаем на ней кнопку, задаем кнопке код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
Form1 ^frm1=this->Owner;
frm1->textBox1->Text =»123″;
>
Попутно не забываем в файле Form1.h сделать доступ public для нашего текстбокса, т.е. public: System::Windows::Forms::TextBox^ textBox1;
Пробуем запустить.
Опа. получаем целую кучу ошибок:
1>Compiling.
1>Form2.cpp
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘Form1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘frm1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->textBox1’ must point to class/struct/union/generic type
1> type is »unknown-type»
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->Text’ must point to class/struct/union/generic type
1>2forms.cpp
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘Form1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘frm1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->textBox1’ must point to class/struct/union/generic type
1> type is »unknown-type»
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->Text’ must point to class/struct/union/generic type
Опять же логично. Компилятор просматривая файл Form2.h понятия не имеет что такое Form1, а тем более, что такое Form1->textBox1->Text. Т.к. с такой проблемой мы уже сталкивались немного выше, пробуем решить ее аналогично. Добавляем в код файла Form2.h
#ifndef Form1
#include «Form1.h»
#endif
Запускаем. И что мы видим. Мы видим те 4 ошибки, которые появились еще когда мы не сделали #include в файле Form1.h, а так же все ошибки, которые мы получили до #include в файл Form2.h. Да плюс еще притесалась ошибка:
1>d:\programs\2forms\Form2.h(102) : error C2440: ‘initializing’ : cannot convert from ‘System::Windows::Forms::Form ^’ to ‘My2forms::Form1 ^’
1> No user-defined-conversion operator available, or
1> Cast from base to derived requires safe_cast or static_cast
В общем вот такие пироги. Как все-таки сделать возможным доступ из Form2 в Form1 я — хз.
Практическое руководство. Группировка элементов управления с помощью элемента управления GroupBox в формах Windows Forms How to: Group Controls with the Windows Forms GroupBox Control
GroupBoxЭлементы управления Windows Forms используются для группирования других элементов управления. Windows Forms GroupBox controls are used to group other controls. Существуют три причины группировки элементов управления. There are three reasons to group controls:
Для создания визуального группирования связанных элементов формы для простого пользовательского интерфейса. To create a visual grouping of related form elements for a clear user interface.
Для создания программного группирования (например, для переключателей). To create programmatic grouping (of radio buttons, for example).
Для перемещения элементов управления как единицы во время разработки. For moving the controls as a unit at design time.
Создание группы элементов управления To create a group of controls
Рисование GroupBox элемента управления в форме. Draw a GroupBox control on a form.
Добавьте в поле группы другие элементы управления, нарисовав их внутри поля группы. Add other controls to the group box, drawing each inside the group box.
При наличии существующих элементов управления, которые необходимо заключать в поле группы, можно выбрать все элементы управления, вырезать их в буфер обмена, выбрать GroupBox элемент управления и вставить их в поле Группа. If you have existing controls that you want to enclose in a group box, you can select all the controls, cut them to the Clipboard, select the GroupBox control, and then paste them into the group box. Их также можно перетащить в поле Группа. You can also drag them into the group box.
Задайте Text для свойства поля Группа соответствующий заголовок. Set the Text property of the group box to an appropriate caption.
Как связать две формы?
Хочу работать с двумя и более формами в C#. Для начала было бы интересно знать как связать две формы, чтобы из одной можно было бы обращаться к элементам другой.
5 ответов 5
из Form1:
Form2 frm = new Form2(); frm.label1.Text = «hello»; frm.Show();
Так как после закрытия формы Form2 она уничтожается, то я переопределяю метод для закрытия — OnClosing. Нужно зайти в конструктор формы Form2. В свойствах формы найти значок с молнией. В списке найти FormClosing и кликнуть дважды на пустое поле справаот него. В редакторе кода появится новый метод, в котором я пишу следующее:
Далее другой пример, который касается взаимодействия дочерней формы и родительской. Form1.cs:
В результате должен появиться мессаджбокс с сообщением «Parent Function Called». Если нужно обратиться к элементу формы, не забываем указывать видимость, так как по умолчанию она Private, то есть элемент не доступен извне. В конструкторе у свойства элемента устанавливаем Modifiers -> Public.
На самом деле довольно просто. Экземпляр формы — это экземпляр класса, поэтому если нужен доступ снаружи к чему-то внутри формы, просто сделайте соответствующее public свойство (или поле, или метод — как вам больше нравится).
ну и самое главное, что бы экземпляры форм были в области видимости друг у друга.
ну а как обращаться, я думаю, понятно и без объяснений, правда?
Для создания дочерней формы, принадлежащей главной форме, необходимо назначить свойству Owner дочернего окна ссылку на главную форму, которая будет владельцем дочернего окна.
Когда форма принадлежит другой форме, она закрывается или скрывается с формой владелицей. Например, рассмотрим форму Form2, которая принадлежит форме Form1. Если Form1 закрывается или сворачивается, Form2 также закрывается или сворачивается. Дочерние формы также никогда не отображаются сзади формы-владельца.
*Операции выполняются внутри тела класса родительской формы к котрой присоединяется дочерняя. Производный класс userForm унаследованный от класса Form, должен быть предварительно объявлен(здесь это опущено).
Теперь, в зависимости от потребностей вы можете
- Доверить процесс удаления дочернего окна сборщику мусора. В данном случае оно будет удалено после закрытия главного окна (если программистом не предусмотрено другого)
Выполнить контролируемое удаление дочернего окна, после наступления необходимого вам события, для этого в теле необходимого вам метода, обрабатывающего наступление какого либо нужного вам события, нужно указать:
Теперь, вам нет необходимости переживать о том, что в оперативной памяти скапливаются не разрушенные вашей программой окна приложения, а также о возможных в связи с этим непредвиденных исключениях.
Объединения c windows forms
Блог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 .
3) Объявить открытый метод Set в Form1.h для того, чтобы можно было изменить текст label1 (код можно написать в конце файла, после #pragma endregion ):
4) В файле Form2.h подключаем Form1.h (в начале):
и создаем конструктор, который будет принимать и сохранять ссылку на первую форму для дальнейшего использования: //ниже сразу ниже можно прописать ссылку: private: Form1^ parentForm;
5) По клику кнопки в Form2 будем вызывать метод Set родительской формы:
6) Осталось в первой форме сделать открытие второй формы. Для этого из Form1.h обработчик нажатия кнопки переносим в Form1.cpp , а в .h-файле оставляем только его объявление.
Код в файле Form1.cpp :
В Form1.h вставляем только строку:
На этом все. Можно скомпилировать и проверить проект, архив во вложении:
Пример ChildToParent, проект Visual Studio 2010 в архиве .zip (40 Кб)
Наладить взаимодействие двух форм
На самом деле, просто развитие идеи. Здесь первая форма умеет передавать данные в текстовое поле второй и наоборот. Теперь они друг друга не «прячут», так что можно создать и много экземпляров второй формы.
Простой пример «многооконного редактора» есть в этой заметке блога.
Пример TwoFormsSample, проект Visual Studio 2010 в архиве .zip (36 Кб)
07.01.2014, 00:05; рейтинг: 44737