Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++ передача данных из одной формы в другую

9.4K
24 августа 2008 года
1_Aposym_1
68 / / 01.11.2007
Собственна из темы вытекает такой вопрос, как это сделать? Для примера можно взять переменную типа int.
12K
24 августа 2008 года
lifs
163 / / 06.09.2007
А в чем проблема? Формы - это классы. Создается свойство или функция, возвращающая нужные данные, и вызывается из дргой формы.
9.4K
24 августа 2008 года
1_Aposym_1
68 / / 01.11.2007
Согласен не чего сложного нет, в сибилдере у меня это получается, а вот WinForms возникли проблемы. Можно например, элементарном.
241
24 августа 2008 года
Sanila_san
1.6K / / 07.06.2005
1_Aposym_1, вы себе не представляете, как нелегко ответить на ваш вопрос, если не знать, что именно у вас не работает. Приведите пример вашего кода, покажите, в каком месте и какая ошибка возникает - и тогда вы сразу выставите себя в лучшем свете, ибо "не решил и не брался решать" хуже, чем "взялся решать, но не разобрался". Недаром на письменных экзаменах по математике просят показать ещё и черновик. Разобраться в неработающем коде всегда легче (и гораздо), чем в абстрактной проблеме передачи даных. Код в студию. :)
12K
24 августа 2008 года
lifs
163 / / 06.09.2007
вот простой пример использования свойства (на Form1 кнопка, на Form2 TextBox, ... - код дизайнера):
Код:
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);
        }
};

Но, как верно заметил Sanila_san, лучше приведите код, который не работает.
9.4K
25 августа 2008 года
1_Aposym_1
68 / / 01.11.2007
К примеру, если брать такую же ситуацию в сибилдере там нужна одна две строчки, чтобы передать данные на другую форму. В данном случае меня интересовало как это делается в VS. Так такового кода у меня нет. Lifs неплохой вариант.
К примеру такая ситуация находимся на 2 форме формируем какие-то данные и их сразу же передаем напряму в переменные которые находятс я на форме 1
12K
26 августа 2008 года
lifs
163 / / 06.09.2007
Аналогично, в Form1 надо создать функцию, принимающую соответствующий параметр, или свойство. Когда создается и показывается форма2 и ей передается:
 
Код:
f->ShowDialog(this);

то f->Owner - указатель на form1. Ей можно передавать то, что необходимо.

Если owner не передается, то form1 можно передать в конструкторе.
341
26 августа 2008 года
Der Meister
874 / / 21.12.2007
Цитата: lifs
Аналогично, в Form1 надо создать функцию, принимающую соответствующий параметр, или свойство. Когда создается и показывается форма2 и ей передается:
 
Код:
f->ShowDialog(this);

то f->Owner - указатель на form1. Ей можно передавать то, что необходимо.

Если owner не передается, то form1 можно передать в конструкторе.


Есть более элегантный способ: события.
В общем, следует спланировать/перепланировать логику так, чтобы можно было с уверенностью сказать, что Form1 - основной объект, а Form2 - ему подчинённый. Подчинённый объект поставляет данные, а основной из обрабатывает - только так. Предоставлять данные можно с помощью свойств, а уведомлять о неактуальности предыдущих - с помощью событий.

12K
26 августа 2008 года
lifs
163 / / 06.09.2007
Добавлю, что и поставлять данные можно с помощью событий.
9.4K
26 августа 2008 года
1_Aposym_1
68 / / 01.11.2007
Der Meister правильно я понял? Есть переменная(свойство класса) в Form2 к примеру int a присвоили какое то значение, закрыли окно.
Потом в Form1
Form2 ^f = gcnew Form2();
f->ShowDialog(this);
После закрытия окна
int b=f->a;
«а уведомлять о неактуальности предыдущих - с помощью событий.» тут мне не понятно.
Как я себе представляю, допустим, есть простейшее форма две кнопки да и нет. При нажатии кнопки «да» окно закрывается и что-то передает, при «нет» данные не передаются и окно закрывается. Как я могу отловить события вот эти на Form1? Надеюсь я правильно понял).
341
27 августа 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=1_Aposym_1]Как я себе представляю, допустим, есть простейшее форма две кнопки да и нет. При нажатии кнопки «да» окно закрывается и что-то передает, при «нет» данные не передаются и окно закрывается.[/QUOTE]С этого стоило начать.

Тебе предложили два варианта:
- 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;
    // делаем что надо
}
При такой схеме события не нужны, они являются решением для второго варианта задачи
9.4K
27 августа 2008 года
1_Aposym_1
68 / / 01.11.2007
спосибо lifs, Der Meister теперь стало ясно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог