Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как связать две формы? 
:(
    Опции темы
6oTuHok
Дата 16.12.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Граждане! Ситуация следующая........

Хочу связать две формы так, чтобы, кликая по кнопке на первой форме появлялась вторая (а первая исчезала), и наоборот, кликая по кнопке на второй, появлялась первая (исходная).

Работаю в MS Visual Studio 2005. Создаю новый проект CLR -> Windows Form Application. Далее добавляю новую форму: Project -> Add new item -> UI -> Windows Form. В "Form1.h" подключаю файл "Form2.h"
Код

#pragma once
#include "Form2.h" 





Аналогично поступаю и с "Form1.h":
Код

#pragma once
#include "Form1.h"






В чистом виде компилирует без проблем!!!

Создаю кнопку на Form1. И делаю так:
Код

static Form2 ^myForm = gcnew Form2();

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             myForm->Show();
         }




Появляется такая гадость:
Код

1>------ Build started: Project: 2, Configuration: Debug Win32 ------
1>Compiling...
1>Form2.cpp
1>g:\с\2\Form1.h(87) : error C2143: syntax error : missing ';' before '^'
1>g:\с\2\Form1.h(87) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>g:\с\2\Form1.h(87) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>g:\с\2\Form1.h(87) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>g:\с\2\Form1.h(87) : error C3845: 'My2::Form1::myForm': only static data members can be initialized inside a ref class or value type
1>g:\с\2\Form1.h(90) : error C2065: 'myForm' : undeclared identifier
1>g:\с\2\Form1.h(90) : error C2227: left of '->Show' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>2.cpp
1>Generating Code...
1>Build log was saved at "file://g:\С\2\Debug\BuildLog.htm"
1>2 - 7 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



Подскажите, перелазил все, что нашел. В МСДН'е толком ниче не написано.
PM MAIL   Вверх
ivashkanet
Дата 16.12.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



6oTuHok, код в студию.
Можно конечно проанализировать сообщения об ошибках, но как-то влом smile

Добавлено @ 20:59 
Цитата(6oTuHok @  16.12.2006,  16:19 Найти цитируемый пост)
Form2 ^myForm = gcnew Form2();

Блин, птицу не к тому прилепл  smile 
Перелепливай  smile 
Цитата(6oTuHok @  16.12.2006,  16:19 Найти цитируемый пост)
1>g:\с\2\Form1.h(90) : error C2065: 'myForm' : undeclared identifier1>g:\с\2\Form1.h(90) : error C2227: left of '->Show' must point to class/struct/union/generic type

Именно поэтому myForm получается необъявленной  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 17.12.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



(оффтопик)
долой С++/CLI !!! граждане, изучайте шарп !!!!
(/оффтопик)



--------------------
user posted image
PM MAIL WWW   Вверх
6oTuHok
Дата 17.12.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(ivashkanet @  16.12.2006,  20:45 Найти цитируемый пост)
Блин, птицу не к тому прилепл   Перелепливай   

Куда перелепливать не придумал;) поэтому просто убрал!
Код

1>------ Build started: Project: 1, Configuration: Debug Win32 ------
1>Compiling...
1>Form2.cpp
1>g:\с\1\Form1.h(87) : error C2146: syntax error : missing ';' before identifier 'myForm'
1>g:\с\1\Form1.h(87) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>g:\с\1\Form1.h(87) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>g:\с\1\Form1.h(87) : error C3845: 'My1::Form1::myForm': only static data members can be initialized inside a ref class or value type
1>g:\с\1\Form1.h(89) : error C2065: 'myForm' : undeclared identifier
1>g:\с\1\Form1.h(89) : error C2227: left of '->Show' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>1.cpp
1>g:\с\1\Form1.h(87) : error C3845: 'My1::Form1::myForm': only static data members can be initialized inside a ref class or value type
1>g:\с\1\Form1.h(89) : error C2819: type 'My1::Form2' does not have an overloaded member 'operator ->'
1>        g:\с\1\Form2.h(23) : see declaration of 'My1::Form2'
1>        did you intend to use '.' instead?
1>g:\с\1\Form1.h(89) : error C2232: '->System::Windows::Forms::Form::Show' : left operand has 'class' type, use '.'
1>Generating Code...
1>Build log was saved at "file://g:\С\1\Debug\BuildLog.htm"
1>1 - 9 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Как видишь, толку маловато. В МСДН написано, что "^" - используется для создания укащатель на весь объект (следовательно, это и надо для его создания). Поэтому думаю, что не в этом дело((( Я так понял, что С# не любит "перекрестные ссылки" на заголовочные файлы! Можно ли это как-то обойти или переделать?
PM MAIL   Вверх
DarkDragon
Дата 17.12.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 3
Всего: 8



вообщем попробуй так:

Код

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             myForm.Show();
         }

если не получится, то

обьяви myForm вот так:
Код

    static Form2 * myForm = gcnew Form2();

    // и вызывай так:
             myForm->Show();



сам толком не знаю, упераюсь на C++.NET 2003, ну и на ошибку котораю блестит.
PM MAIL   Вверх
ivashkanet
Дата 17.12.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Не имею понятия что есть птица, но она должна быть рядом с типом/классом, а не переменной.
Так что меняем так:
Код

Form2^ myForm = gcnew Form2();


Цитата(DarkDragon @  17.12.2006,  09:34 Найти цитируемый пост)
 static Form2 * myForm = gcnew Form2();

DarkDragon, а что у тебя звезда висит сама по себе?

Цитата(mr.DUDA @  16.12.2006,  23:49 Найти цитируемый пост)
долой С++/CLI !!! граждане, изучайте шарп !!!!

Хоть CLI здесь и не пахнет, но в общем ты прав  smile 
PM MAIL WWW ICQ   Вверх
6oTuHok
Дата 17.12.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(ivashkanet @  17.12.2006,  11:48 Найти цитируемый пост)
Не имею понятия что есть птица, но она должна быть рядом с типом/классом, а не переменной.

Поменял, ошибки те же. Ваще я где-та читал, что при создании указателей не важно где стоит * или ^. Практика это пока, что подтверждает
PM MAIL   Вверх
DarkDragon
Дата 17.12.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 3
Всего: 8



Цитата(ivashkanet @  17.12.2006,  11:48 Найти цитируемый пост)
Не имею понятия что есть птица, но она должна быть рядом с типом/классом, а не переменной.

Не а!
Звезда или птица может быть где угодно, главное в промежутке от типа до имени переменной,
т. е.

type * var;
type* var;
type  *var;
type            *                        var;
все эти обьявления показывают что var это указатель (т. е. Pointer)

Ну а вообщем помнится мне что обьявления в C++.NET, делалось так:

static System::Windows::Forms::Form __gc* frm = new System::Windows::Forms::Form();

Попробуй так:

Цитата(DarkDragon @  17.12.2006,  10:34 Найти цитируемый пост)
обьяви myForm вот так:
    static Form2 * myForm = gcnew Form2();
    // и вызывай так:
             myForm->Show();

Из ошибки видно, что он ругается из за того что переменная обьявленна не как указатель!
PM MAIL   Вверх
6oTuHok
Дата 18.12.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(DarkDragon @  17.12.2006,  14:20 Найти цитируемый пост)
Ну а вообщем помнится мне что обьявления в C++.NET, делалось так:static System::Windows::Forms::Form __gc* frm = new System::Windows::Forms::Form();

Это ясно, что если создать указатель типа <что там>::Form будет работать, но мне нужна уже созданная форма, с кнопками и т.п. (в общем разными контролами), а вручную (т.е. программно) прописывать их на чистой форме мне не хочеЦЦа (много писанины и не факт, что получиЦЦа так как надо). Меня еще смущает вот что....... Когда я добавлял форму к уже созданному проекту, в новом заголовочном файле Form2.h было написано так:
Код

#pragma once
#include "Form1.h"

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 My1 {

    /// <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>
    public ref class Form2 : public System::Windows::Forms::Form
    {
    public:
        Form2(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form2()
        {
            if (components)
            {
                delete components;
            }
        }

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        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->components = gcnew System::ComponentModel::Container();
            this->Size = System::Drawing::Size(300,300);
            this->Text = L"Form2";
            this->Padding = System::Windows::Forms::Padding(0);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        }
#pragma endregion
    };
}


хотя в Form1.h написано так:
Код

#pragma once
#include "Form2.h"


namespace My1 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// Summary for Form1
    ///
    /// 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>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    protected: 

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        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->button1 = (gcnew System::Windows::Forms::Button());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(60, 76);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(292, 266);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);

        }
#pragma endregion

        static System::Windows::Forms::Form ^frm = gcnew System::Windows::Forms::Form();
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 frm->Show();
             }
    };
}

В РАЗНЫХ МЕСТАХ ПРОПИСАНО ПОДКЛЮЧЕНИЕ ПРОСТРАНСТВА ИМЕН!
PM MAIL   Вверх
DarkDragon
Дата 18.12.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 3
Всего: 8



6oTuHok, я имел ввиду, что бы ты попробовал заместо ^, поставить *.

Вот еще одну вещь которую я понять не могу:
в Form2.h:
Код

#pragma once
#include "Form1.h"


в Form1.h:
Код

#pragma once
#include "Form2.h"


тоесть получается: если первым компилится Form1.h, то он вытаскивает Form2.h, он же в свою очередь вытаскивает Form1.h, и тот в свою очередь... Вообщем покругу ходит (бесконечный цикл, или лучше сказать рекурсия выдергивания текста).
Попробуй в Form2.h, убрать #include "Form1.h".

PM MAIL   Вверх
6oTuHok
Дата 18.12.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(DarkDragon @  18.12.2006,  20:39 Найти цитируемый пост)
Попробуй в Form2.h, убрать #include "Form1.h".

Эту фишку я пробовал! Тогда никак не вызвать первую форму!!! (связи же с ней нету)
PM MAIL   Вверх
ivashkanet
Дата 18.12.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



 smile 6oTuHok, забей на С++, переходи на C# -- всем же (и тебе в первую очередь) легче будет  smile 
PM MAIL WWW ICQ   Вверх
6oTuHok
Дата 18.12.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(ivashkanet @  18.12.2006,  21:45 Найти цитируемый пост)
забей на С++, переходи на C# -- всем же (и тебе в первую очередь) легче будет

Погоди, а я не на C# пишу разве??? Чета я ваще запутался!!! Разъясните мне хто-нить в чем разница и на чем я пишу!!!
PM MAIL   Вверх
ivashkanet
Дата 19.12.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(6oTuHok @  18.12.2006,  22:38 Найти цитируемый пост)
Погоди, а я не на C# пишу разве???

 smile  smile  smile  smile 
Нет. У C# нет никаких птиц и звездей  smile Нет никаких #pragma once #include "Form2.h" 

Там все намного проще smile

Какой у тебя проект? C# WinForm? или с++ CLI и тд. и т.п.  smile 
PM MAIL WWW ICQ   Вверх
6oTuHok
Дата 19.12.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Цитата(ivashkanet @  19.12.2006,  10:06 Найти цитируемый пост)
Какой у тебя проект? C# WinForm? или с++ CLI

Windows Form Application..... Точно!!!!! Надо пересаживаться на C#!!!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.