Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как в дочернем окне достучаться до родительского?


Автор: unLIMIT1984 17.5.2009, 23:24
Ребят, привет.

С++ Windows Forms (VS2005)
Есть многооконное приложение.
Form1 - главное окно (IsMdiContainer=true).
Form2 - дочернее окно.
Необходимо при создании Form2 передать ссылку на Form1, чтобы в дочернем окне иметь доступ к членам родительского окна.

То, до чего дошел:
Код

//Form1.h
#include "Form2.h"
...
public ref class Form1 : public System::Windows::Forms::Form
{
public:
    Form1(void)
    {
         InitializeComponent();
         Form2^ form2=gcnew Form2(this);
         form2->MdiParent=this;
         form2->Show();
    }
public: System::Windows::Forms::Label^  label1;
...

Код

//Form2.h
...
ref class Form1;
public ref class Form2 : public System::Windows::Forms::Form
{
public:
    Form2(Form1^ prev)
    {
        InitializeComponent();
        mainWindow=prev;
        this->Text=mainWindow->label1->Text; //Заголовок дочернего окна = текст label1 родительского окна - ЗДЕСЬ ОШИБКА (30 строчка)
    }
public:    Form1^ mainWindow;
...

Ошибки возникают следующие:
                                                                                                                                                       Line
Error    1    error C2027: use of undefined type 'mdiApp::Form1'                                      Form2.h   30
Error    2    error C2227: left of '->label1' must point to class/struct/union/generic type  Form2.h   30
Error    3    error C2227: left of '->Text' must point to class/struct/union/generic type     Form2.h   30
Error    4    error C2027: use of undefined type 'mdiApp::Form1'                                      Form2.h   30
Error    5    error C2227: left of '->label1' must point to class/struct/union/generic type  Form2.h    30
Error    6    error C2227: left of '->Text' must point to class/struct/union/generic type     Form2.h    30

Помогите пожалуйста исправить ошибки.

PS: на всякий случай прикрепляю файлы проекта

Автор: Partizan 18.5.2009, 12:09
unLIMIT1984, файлы не прикрепились...

по сабжу - надо инклуд добавить в Form2.h:

#include "Form1.h"


Из сообщения компилятора же ясно видно, что он не может найти тип Form1

Автор: unLIMIT1984 18.5.2009, 21:37
Добавлял include - не помогает.
Прикрепил файл.

Автор: Partizan 18.5.2009, 22:35
Код

//Form2.h
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

namespace mdiApp {

    /// <summary>
    /// Summary for Form2
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    ref class Form1;


    public ref class Form2 : public System::Windows::Forms::Form
    {
    public:
        Form2(Form1^ prev);

    protected:
        ~Form2()
        {
            if (components)
            {
                delete components;
            }
        }

    public:  Form1^ mainWindow;
    private: System::Windows::Forms::Label^  label1;

             System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->SuspendLayout();
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(142, 96);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(35, 13);
            this->label1->TabIndex = 0;
            this->label1->Text = L"label1";
            // 
            // Form2
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(343, 303);
            this->Controls->Add(this->label1);
            this->Name = L"Form2";
            this->Text = L"Form2";
            this->ResumeLayout(false);
            this->PerformLayout();

        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 //this->Text=mainWindow->Text;
             }
    };
}



Код

//Form2.cpp
#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

mdiApp::Form2::Form2(Form1^ prev)
{
    InitializeComponent();
    mainWindow=prev;
    this->Text=mainWindow->label1->Text;
}

Автор: unLIMIT1984 20.5.2009, 17:29
Partizan, здорово. Спасибо большое тебе. Подскажи пожалуйста, а почему реализацию этих функций нужно выносить в файл cpp? Например, все обработчики  вписываются в h-файл автоматически, а также обычные пользовательские функции нормально там живут.

Автор: Partizan 21.5.2009, 05:31
unLIMIT1984, MSDN говорит, что класс должен быть полностью определён в момент его использования.

Вообще, если говорить о C++, то хороший тон - в хедерах определять прототипы, а в cpp - реализацию.

Добавлено через 1 минуту и 12 секунд
unLIMIT1984, я к тому, что если бы не было перекрёстной зависимости, то всё бы было ок и в текущем варианте...

Автор: MaksSh 22.5.2009, 19:29
Всем привет
я использую С++ Windows Forms (VS2008)
у меня тоже многооконное приложение
разница в том что на второй форме есть button, при нажатии на которую я обращаюсь к объекту с первой формы

Код

//Form2.cpp
#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

My_VeshicleEditor::FormCreateRevJount::FormCreateRevJount(Form1^ prev)
{
    InitializeComponent();
    mainWindow=prev;
}
System::Void My_VeshicleEditor::FormCreateRevJount::buttonCreatRevJount_Click(System::Object^  sender, System::EventArgs^  e) 
{
    mainWindow->render->createNewRevJount();
}

на что мне компилятор резонно отвечает
error C2039: buttonCreatRevJount_Click: не является членом "My_VeshicleEditor::FormCreateRevJount"
1>        e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(25): см. объявление 'My_VeshicleEditor::FormCreateRevJount'
1>e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(84) : error C2065: buttonCreatRevJount_Click: необъявленный идентификатор
1>e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(84) : error C3350: System::EventHandler: конструктор делегата ожидает 2 аргументов

а если функцию buttonCreatRevJount_Click реализовывать в нидере то 

error C2027: использование неопределенного типа "My_VeshicleEditor::Form1"
1>        e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(23): см. объявление 'My_VeshicleEditor::Form1'
1>e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(109) : error C2227: выражение слева от "->render" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>e:\visual studio 9\my_editor\my_veshicleeditor\FormCreateRevJount.h(109) : error C2227: выражение слева от "->createNewRevJount" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>FormCreateRevJount.cpp

прямо замкнутый круг какой то smile

Автор: Partizan 22.5.2009, 19:44
MaksSh, проект в студию

Автор: MaksSh 22.5.2009, 20:05
Partizan
исходники, или просто в коде?
а то у меня проект большой smile

Добавлено через 3 минуты
я все сделал как описывалось выше
проблема только с функцией 
 
Код

buttonCreatRevJount_Click(System::Object^  sender, System::EventArgs^  e)


Добавлено через 4 минуты и 17 секунд
ой извиняюсь не тот код поставил надо С++ smile

Автор: MaksSh 22.5.2009, 21:11
Вот пример создающий подобную ситуацию

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)