Создание дочерней формы на C++.NET
От: winPerec  
Дата: 10.04.07 17:54
Оценка:
Проблема заключается в том что класс дочерней формы никак не хочет видеть класс родительской,
и к родительской форме из дочерней доступа нет.
На С# без всяких проблем, но очень нужно на С++.net

На форме Form1 есть кнопка showDaughter, событие кнопки Click обрабатывается в showDaughterFormButton_Click.
Если тоже самое переводить на С++.NET то
при обращении к свойству:
Form1^ owner = (Form1^)this->Owner;

компиляятор ругается что нет такого типа как Form1^.

Переведите этот код ,пожалуйста, на C++.net

//////////////Файл Form1.cs - родительский класс///////////////
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace test_form
{
public partial class Form1 : Form
{
private int someVariable;
public int SomeVariable
{
get{return someVariable;}
}

public Form1()
{InitializeComponent();}
private void showDaughterFormButton_Click(object sender, EventArgs e)
{
Daughter form = new Daughter();form.Show(this);
}
}
}
 



///////////////////////////////////////Файл Daughter.cs////////////////////////////
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace test_form
{
public partial class Daughter : Form
{
public Daughter()
{InitializeComponent();}
private void Daughter_Load(object sender, EventArgs e)
{
 
Form1 owner = (Form1)this.Owner;
int a = owner.SomeVariable;
}
}
}

Оба файла находятся в одном проекте test_form
(на всякий прекрепил проект http://www.rsdn.ru:80/File/65124/test_form.rar на C# )
Re: Создание дочерней формы на C++.NET
От: _Morpheus_  
Дата: 10.04.07 18:13
Оценка:
Здравствуйте, winPerec, Вы писали:

P>Переведите этот код ,пожалуйста, на C++.net


P>Оба файла находятся в одном проекте test_form


public __gc class Form1 : public Form
{
    // Methods
    public: Form1()
    {
        this->InitializeComponent();
    }

    private: void __gc* showDaughterFormButton_Click(Object __gc* sender, EventArgs __gc* e)
    {
        __gc new Daughter()->Show(this);
    }


    // Properties
    public: __property Int32 __gc* get_SomeVariable()
    {
        return this->someVariable;
    }


    // Fields
    private: Int32 __gc* someVariable;
}


public __gc class Daughter : public Form
{
    // Methods
    public: Daughter()
    {
        this->InitializeComponent();
    }

    private: void __gc* Daughter_Load(Object __gc* sender, EventArgs __gc* e)
    {
        Form1 __gc* owner = *static_cast<__box Form1*>(base->Owner);
        Int32 __gc* someVariable = owner->SomeVariable;
    }
};


Сконверчено Reflector'ом

Судя по __gc это oldSyntax, насколько я помню в новом синтаксисе, вместо __gc нужно использовать ref, при этом для указателей вместо Form1 __gc* нужно заменить на просто Form1 . может по памяти напутал, но вроде так, если что, то в MSDN по поводу перехода oldSyntax->newSyntax раздел соответствующий есть
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Создание дочерней формы на C++.NET
От: _Morpheus_  
Дата: 10.04.07 18:16
Оценка:
вроде вспомнил — для указателей на менеджед объекты нужно не Form1 __gc* заменять написать на Form1 ^, вобщем думаю разбересся
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Создание дочерней формы на C++.NET
От: winPerec  
Дата: 10.04.07 21:38
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

Вы писали:

P>>Переведите этот код ,пожалуйста, на C++.net


P>>Оба файла находятся в одном проекте test_form


_M_>
_M_>public __gc class Form1 : public Form
_M_>{
_M_>    // Methods
_M_>    public: Form1()
_M_>    {
        this->>InitializeComponent();
_M_>    }

_M_>    private: void __gc* showDaughterFormButton_Click(Object __gc* sender, EventArgs __gc* e)
_M_>    {
_M_>        __gc new Daughter()->Show(this);
_M_>    }


_M_>    // Properties
_M_>    public: __property Int32 __gc* get_SomeVariable()
_M_>    {
_M_>        return this->someVariable;
_M_>    }


_M_>    // Fields
_M_>    private: Int32 __gc* someVariable;
_M_>}
_M_>


_M_>
_M_>public __gc class Daughter : public Form
_M_>{
_M_>    // Methods
_M_>    public: Daughter()
_M_>    {
        this->>InitializeComponent();
_M_>    }

_M_>    private: void __gc* Daughter_Load(Object __gc* sender, EventArgs __gc* e)
_M_>    {
_M_>        Form1 __gc* owner = *static_cast<__box Form1*>(base->Owner);
_M_>        Int32 __gc* someVariable = owner->SomeVariable;
_M_>    }
_M_>};
_M_>


_M_>Сконверчено Reflector'ом


Но тут дело не в синтаксисе. Эти два файла находятся в одном нейспесе, причем в файле родительской формы Form1
подключается файл дочерней, далее создается ее обЪект и она показывается:
 __gc new Daughter()->Show(this);

В файле дочерней формы Daughter возвращается обЪект родительской формы:
private: void __gc* Daughter_Load(Object __gc* sender, EventArgs __gc* e)
_M_>    {
_M_>        Form1 __gc* owner = *static_cast<__box Form1*>(base->Owner);
_M_>        Int32 __gc* someVariable = owner->SomeVariable;
_M_>    }

Вот здесь и возникает проблема: тип Form1^ не известен в классе Daughter.
Если попробывать подключить его:
#include"Form1.h" 
public __gc class Daughter : public Form
{
//......
//......
//......
}

то возникают ошибки в классе родительской формы.


Если сделать так:
ref class Form1;
 public __gc class Daughter : public Form
 {
     // Methods
     public: Daughter()
     {
        this->>InitializeComponent();
    }

    private: void __gc* Daughter_Load(Object __gc* sender, EventArgs __gc* e)
     {
          
         Form1 __gc* owner = *static_cast<__box Form1*>(base->Owner);
         //То здесь  error C2027: use of undefined type 'TESTFORM2::Form1'    
         Int32 __gc* someVariable = owner->SomeVariable;
    }
 };

Прекреплю проект на С++.net в котором возникают такие ошибки,
чтобы было понятней о чем идет речь.
http://www.rsdn.ru:80/File/65124/TESTFORM2.rar
а вот как от них избавиться я не знаю
Если знаешь как решить эту проблему, please send answer...Thanks
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.