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

Ваш аккаунт

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

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

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

Обращение из дочерней формы к родительской

7.8K
19 июня 2007 года
simplemortal
62 / / 09.02.2007
Поясните пожалуйста, как обращаться из дочерней формы к родительской.
В первой форме:
Код:
include "Form2.h"
......................
Form1(void)
{
    InitializeComponent();
    //
    //TODO: Add the constructor code here
    //
    F2 = gcnew Form2;
}
........................
private: Form2^ F2;
.........................
........................
.........................
F2->ShowDialog();

Показали вторую форму.


И теперь мне при выполнении некоторых действий в появившейся второй форме необходимо обратиться к каким-то элементам первой формы. Здесь у меня возникают некоторые трудности, т.к. в Form2 нет объекта класса Form1. А если я его создаю, то я получается создаю ещё одну форму Form1, а мне нужно обратиться к уже имеющейся форме Form1.:confused: :confused: :confused:
713
19 июня 2007 года
Ap0k
360 / / 13.03.2006
Класс [COLOR=teal]Form[/COLOR] наследуется от [COLOR=teal]ContainerControl[/COLOR], который в свою очередь имеет свойство:
[COLOR=teal]ContainerControl[/COLOR].ParentForm
Пример обработки нажатия кнопки в дочерней форме (С#):
 
Код:
[COLOR=green]// The event handler on Form2.[/COLOR]
[COLOR=blue]private[/COLOR] [COLOR=blue]void[/COLOR] button1_Click([COLOR=blue]object[/COLOR] sender, System.[COLOR=teal]EventArgs[/COLOR] e)
{
    [COLOR=green]// Get the Name property of the Parent.[/COLOR]
    [COLOR=blue]string[/COLOR] s = ParentForm.Name;
    [COLOR=green]// Display the name in a message box.[/COLOR]
    [COLOR=teal]MessageBox[/COLOR].Show([COLOR=darkred]"My Parent is "[/COLOR] + s + [COLOR=darkred]"."[/COLOR]);
}

Второе - передавать в конутруктор дочерней формы экземпляр родительской, что по мне более предпочтительно.
7.8K
19 июня 2007 года
simplemortal
62 / / 09.02.2007
Прошу прощения, может быть я чего-то не понимаю...
У меня почему-то не получилось.
 
Код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    String ^s = ParentForm->Name; //[COLOR="Red"]на этой строке у меня вылетает окно с ошибкой.[/COLOR]
    MessageBox::Show("My Parent is " + s + ".");
}


Цитата:
Второе - передавать в конутруктор дочерней формы экземпляр родительской, что по мне более предпочтительно.


И можно чуть подробнее с этого места?
Если можно, то на примере:rolleyes:

713
20 июня 2007 года
Ap0k
360 / / 13.03.2006
Примерно так (на C#):
Код:
[COLOR=green]//подразумевается, что имеется два класса (ParentForm и ChildForm)[/COLOR]
[COLOR=blue]public partial class[/COLOR] [COLOR=teal]ChildForm : Form[/COLOR]
{
    [COLOR=blue]public[/COLOR] ChildForm() [COLOR=green]//конструктор по-умолчанию, как правило мы пользуемся им.[/COLOR]
    {
         InitializeComponent();
    }
    [COLOR=blue]private[/COLOR] [COLOR=teal]ParentForm[/COLOR] m_frmParent;
    [COLOR=blue]public[/COLOR] ChildForm([COLOR=teal]ParentForm[/COLOR] frmParent) [COLOR=green]//добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы[/COLOR]
    {
         m_frmParent = frmParent;
         InitializeComponent();
    }
 
    [COLOR=blue]private void[/COLOR] btnDemoClick([COLOR=blue]object[/COLOR] Sender,[COLOR=teal]EventArgs[/COLOR] e)
    {
         m_frmParent.Text = [COLOR=darkred]"Hello world from child form"[/COLOR];
    }
}
[COLOR=green]//В родительской форме пишем примерно так[/COLOR]
.....
[COLOR=teal]ChildForm[/COLOR] frmChild = [COLOR=blue]new[/COLOR] ChildForm([COLOR=blue]this[/COLOR]);
frmChild.ShowDialog(); [COLOR=green]//or Show();[/COLOR]
.....

По поводу ошибки.. скорее всего выстреливает [COLOR=teal]NullReferenceException[/COLOR][COLOR=black]. Сам не пробовал этим заниматься, но возможно спасет передача ссылки на родительское окно в метод ShowDialog()[/COLOR]
9.0K
20 июня 2007 года
Shit_Happenes
58 / / 05.10.2006
Эта тема обсуждалась.
Вот ссылка :

http://forum.codenet.ru/showthread.php?t=37091
7.8K
20 июня 2007 года
simplemortal
62 / / 09.02.2007
Shit_Happenes, спасибо за ссылку. С этим вариантом разобрался.

Ap0k, можно ещё уточнить один момент?
Цитата:
//подразумевается, что имеется два класса (ParentForm и ChildForm)
public partial class ChildForm : Form
{
public ChildForm() //конструктор по-умолчанию, как правило мы пользуемся им.
{
InitializeComponent();
}
[COLOR="Red"]private ParentForm m_frmParent; //[SIZE="4"]1[/SIZE][/COLOR]
public ChildForm(ParentForm frmParent) //добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы
{
m_frmParent = frmParent;
InitializeComponent();
}

private void btnDemoClick(object Sender,EventArgs e)
{
m_frmParent.Text = "Hello world from child form";
}
}
//В родительской форме пишем примерно так
.....
ChildForm frmChild = new ChildForm(this); [COLOR="#ff0000"][SIZE="4"]//2[/SIZE][/COLOR]
frmChild.ShowDialog(); //or Show();
.....



Для C++
[SIZE="4"][COLOR="Red"]1[/COLOR][/SIZE]: В этой строке для того, чтобы объявить объект m_frmParent класса ParentForm нужно, как я понимаю, подключить ParentForm.h. Но как только я его подключаю, то в строке [COLOR="Red"][SIZE="4"]2[/SIZE][/COLOR] при объявлении объекта компилятор выдаёт ошибку. Но если я из ParentForm убираю строку

 
Код:
include "ChildForm.h"
, то эта ошибка ликвидируется, но я, естесственно, не могу обратиться из ParentForm к ChildForm.
В общем насколько я понял нельзя допускать "перекрёстного" подключения файлов, т.е. когда в файл ParentForm.h подключён файл ChildForm.h и наоборот.
Ведь именно по этой причине я и поднял этот вопрос, т.е. в родительской форме могу создать объект класса дочерней формы, а в дочерней форме экземпляр родительской создать не получается, потому что нужно подключать файл родительской формы, а в этом случае, как я уже говорил, происходит ошибка в строке [COLOR="#ff0000"][SIZE="4"]2[/SIZE][/COLOR].
Или всё-таки как-то это можно обойти?
8.4K
20 июня 2007 года
TZA Group
120 / / 10.04.2007
Код для С++ отличается от C#
8.4K
20 июня 2007 года
TZA Group
120 / / 10.04.2007
А обойти это никак нельзя.
7.8K
20 июня 2007 года
simplemortal
62 / / 09.02.2007
[SIZE="2"]А как в таком случае изменить значение public-переменной родительской формы? [/SIZE]:mad:
Если в дочерней форме создавать ссылку на родительскую так:
 
Код:
Form ^F1 = Application::OpenForms["Form1"];
,
то почему-то public-переменных в полученной F1 не видно.
31K
07 июля 2007 года
J0hnny_
1 / / 07.07.2007
У меня таже проблема, неужели нет нормального способа получить доступ к родительской форме на VC++? Конечно можно воспользоваться какимнибудь компонентом как переменной но если требуется передать обьект то как тогда быть? У меня в родительской форме обьявлен ArrayList с обектами, как мне обратиться к этому ArrayList?
public:static ArrayList^ StateArray=gcnew ArrayList();
обычно я обращаюсь вот так
safe_cast<State^>(StateArray)->поле/метод
а как мне получить прямой доступ из другой формы которая также обявлена в этом классе и создана как обьект? Неужели всё так сложно и нельзя как в Java или как в Borland(OP,C++) обратиться напрямую.

всё я свои проблемы решил вот таким путём
http://www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Form/357.aspx

Но всёравно это несовсем то что хотелось
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог