public ref class Form2 : public System::Windows::Forms::Form
{
...
public:
property String^ SampleText
{
String^ get()
{
return textBox1->Text;
}
}
};
public ref class Form1 : public System::Windows::Forms::Form
{
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
WindowsFormsApp::Form2 ^f = gcnew WindowsFormsApp::Form2();
f->ShowDialog(this);
System::Windows::Forms::MessageBox::Show(f->SampleText);
}
};
С++ передача данных из одной формы в другую
Собственна из темы вытекает такой вопрос, как это сделать? Для примера можно взять переменную типа int.
А в чем проблема? Формы - это классы. Создается свойство или функция, возвращающая нужные данные, и вызывается из дргой формы.
Согласен не чего сложного нет, в сибилдере у меня это получается, а вот WinForms возникли проблемы. Можно например, элементарном.
1_Aposym_1, вы себе не представляете, как нелегко ответить на ваш вопрос, если не знать, что именно у вас не работает. Приведите пример вашего кода, покажите, в каком месте и какая ошибка возникает - и тогда вы сразу выставите себя в лучшем свете, ибо "не решил и не брался решать" хуже, чем "взялся решать, но не разобрался". Недаром на письменных экзаменах по математике просят показать ещё и черновик. Разобраться в неработающем коде всегда легче (и гораздо), чем в абстрактной проблеме передачи даных. Код в студию. :)
вот простой пример использования свойства (на Form1 кнопка, на Form2 TextBox, ... - код дизайнера):
К примеру такая ситуация находимся на 2 форме формируем какие-то данные и их сразу же передаем напряму в переменные которые находятс я на форме 1
Код:
f->ShowDialog(this);
то f->Owner - указатель на form1. Ей можно передавать то, что необходимо.
Если owner не передается, то form1 можно передать в конструкторе.
Цитата: lifs
Аналогично, в Form1 надо создать функцию, принимающую соответствующий параметр, или свойство. Когда создается и показывается форма2 и ей передается:
то f->Owner - указатель на form1. Ей можно передавать то, что необходимо.
Если owner не передается, то form1 можно передать в конструкторе.
Код:
f->ShowDialog(this);
то f->Owner - указатель на form1. Ей можно передавать то, что необходимо.
Если owner не передается, то form1 можно передать в конструкторе.
Есть более элегантный способ: события.
В общем, следует спланировать/перепланировать логику так, чтобы можно было с уверенностью сказать, что Form1 - основной объект, а Form2 - ему подчинённый. Подчинённый объект поставляет данные, а основной из обрабатывает - только так. Предоставлять данные можно с помощью свойств, а уведомлять о неактуальности предыдущих - с помощью событий.
Добавлю, что и поставлять данные можно с помощью событий.
Потом в Form1
Form2 ^f = gcnew Form2();
f->ShowDialog(this);
После закрытия окна
int b=f->a;
«а уведомлять о неактуальности предыдущих - с помощью событий.» тут мне не понятно.
Как я себе представляю, допустим, есть простейшее форма две кнопки да и нет. При нажатии кнопки «да» окно закрывается и что-то передает, при «нет» данные не передаются и окно закрывается. Как я могу отловить события вот эти на Form1? Надеюсь я правильно понял).
Тебе предложили два варианта:
- Form2 используется как диалог,
- содержимое Form1 изменяется в зависимости от действий, производимых с From2. Оба окна остаются открытыми.
Твой случай подходит под первый вариант. Делай открытое (public) свойство в Form2, возвращающее необходимые данные (самый первый вариант, любезно предоставленный lifs). У кнопок есть свойство DialogResult, которое можно выставить в дизайнере. Ставим для кнопки "Да" значение Yes. Метод Form.ShowDialog() возвращает значение перечисляемого типа DialogResult. Если нажали "Да", метод ShowDialog() вернёт DialogResult.Yes. Тогда читаем значение свойства и продолжаем работу, в противном случае значение свойства игнорируем.
Собсна, твой код отражает решение проблемы почти правильно.
Код:
Form2 ^f = gcnew Form2();
if (f->ShowDialog(this) == DialogResult.Yes)
{
int b=f->a;
// делаем что надо
}
if (f->ShowDialog(this) == DialogResult.Yes)
{
int b=f->a;
// делаем что надо
}
спосибо lifs, Der Meister теперь стало ясно.