Dostęp do klasy Form1 (C++\CLI)

Odpowiedz Nowy wątek
2011-06-23 21:15

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Witam wszystkich, uczę się C++\CLI (Windows Form) i trafiłem na dziwny problem.
Przy próbie dostępu do "obiektu Formy" z zewnętrznej funkcji wyskakuje mi error 'Form1' : undeclared identifier ?? .
Oto kod programu:

#pragma once

void Aktualizuj()
{
    Form1^ forma = gcnew Form1;
    forma->progressBar1->Value = 100;
}

namespace Program {

    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
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();

            //
            //TODO: Add the constructor code here
            //
        }

        // koniec

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

    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->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(177, 205);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(217, 30);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // progressBar1
            // 
            this->progressBar1->Location = System::Drawing::Point(52, 81);
            this->progressBar1->Name = L"progressBar1";
            this->progressBar1->Size = System::Drawing::Size(476, 35);
            this->progressBar1->TabIndex = 1;
            this->progressBar1->Value = 1;
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(560, 291);
            this->Controls->Add(this->progressBar1);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);

        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 Aktualizuj(); // powinien zaktualizowac się progressbar
             }
    };

}

error:

1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(5): error C2065: 'Form1' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(5): error C2065: 'forma' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(5): error C2061: syntax error : identifier 'Form1'
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(6): error C2065: 'forma' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(6): error C2227: left of '->progressBar1' must point to class/struct/union/generic type
1>          type is ''unknown-type''
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(6): error C2227: left of '->Value' must point to class/struct/union/generic type

W czym tkwi problem?

Pozostało 580 znaków

2011-06-23 21:20

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Nie jestem pewien czy to to, ale wydaje mi się, że może być problem w tym, że klasa Form1 jest dopiero w przestrzeni nazw, a ty probujesz zadeklarować 'forma' powyżej. Sprobuj zadeklarować poniżej przestrzeni nazw i w funkcji dodać

void Aktualizuj()
{
        Program::Form1^ forma = gcnew Form1;
        forma->progressBar1->Value = 100;
}

Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-06-23 21:22

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Niestety, nic nie pomogło.

Pozostało 580 znaków

2011-06-23 21:25

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

A co teraz pisze kompilator?

Btw zajrzyj do mojego tematu, jak umiesz pomóc bylbym wdzięczny
http://4programmers.net/Forum/C_i_C++/182272-problem_z_kompilacja


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay, 2011-06-23 21:26
te same błędy + kilka innych ;/ - Datex 2011-06-23 21:55
To niestety nie pomogę Ci.. Narazie ;] - MJay 2011-06-23 22:52

Pozostało 580 znaków

2011-06-24 10:15

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

0

C++/CLI pod tym względem działa jak C++ a nie jak C#. żeby typ z innego pliku był widoczny, musi być inkludowany plik nagłówkowy z deklaracją odpowiedniej klasy.

#include "Form1.h"
edytowany 1x, ostatnio: Azarien, 2011-06-24 10:15

Pozostało 580 znaków

2011-06-24 12:16

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Ale tutaj odbywa się wszystko w jednym pliku (Funkcja Aktualizuj() jak i Klasa Form1 znajduje sie w tym samym pliku form1.h)

Znalazłem podobny problem na forum i spróbowałem tak:

#pragma once

void Aktualizuj(Form1^ forma = gcnew Form1)
{
        forma->progressBar1->Value = 100;
}

namespace Program {

    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
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();

            //
            //TODO: Add the constructor code here
            //
        }

        // koniec

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

    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->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(177, 205);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(217, 30);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // progressBar1
            // 
            this->progressBar1->Location = System::Drawing::Point(52, 81);
            this->progressBar1->Name = L"progressBar1";
            this->progressBar1->Size = System::Drawing::Size(476, 35);
            this->progressBar1->TabIndex = 1;
            this->progressBar1->Value = 1;
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(560, 291);
            this->Controls->Add(this->progressBar1);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);

        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 Aktualizuj(this); // powinien zaktualizowac się progressbar
             }
    };

}

ale nadal są errory:

1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(4): error C2065: 'Form1' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(4): error C2065: 'forma' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(4): error C2061: syntax error : identifier 'Form1'
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(5): error C2448: 'Aktualizuj' : function-style initializer appears to be a function definition
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(101): error C3861: 'Aktualizuj': identifier not found

Dlaczego co nie zrobię to zawsze wywala "error C2065: 'Form1' : undeclared identifier" ??

edytowany 1x, ostatnio: Datex, 2011-06-24 12:39

Pozostało 580 znaków

2011-06-24 12:30

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

@UP, ale tutaj to wszystko jest w jednym pliku, więc nie potrzeba dodawać pliku nagłówkowego w którym się aktualnie znajdujemy
Poprawiłem Ci kod

#pragma once

namespace Program {

        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
        /// </summary>

        public ref class Form1 : public System::Windows::Forms::Form
        {
        public:
                Form1(void)
                {
                        InitializeComponent();

                        //
                        //TODO: Add the constructor code here
                        //
                }

                // koniec

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

        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->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
                    this->label1 = (gcnew System::Windows::Forms::Label());
                    this->SuspendLayout();
                    // 
                    // button1
                    // 
                    this->button1->Location = System::Drawing::Point(177, 205);
                    this->button1->Name = L"button1";
                    this->button1->Size = System::Drawing::Size(217, 30);
                    this->button1->TabIndex = 0;
                    this->button1->Text = L"Aktualizuj";
                    this->button1->UseVisualStyleBackColor = true;
                    this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
                    // 
                    // progressBar1
                    // 
                    this->progressBar1->Location = System::Drawing::Point(52, 81);
                    this->progressBar1->Name = L"progressBar1";
                    this->progressBar1->Size = System::Drawing::Size(476, 35);
                    this->progressBar1->TabIndex = 1;
                    this->progressBar1->Value = 1;
                    // 
                    // label1
                    // 
                    this->label1->AutoSize = true;
                    this->label1->Location = System::Drawing::Point(199, 155);
                    this->label1->Name = L"label1";
                    this->label1->Size = System::Drawing::Size(35, 13);
                    this->label1->TabIndex = 2;
                    this->label1->Text = L"Tu jest jakiś napis";
                    this->label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);
                    // 
                    // Form1
                    // 
                    this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                    this->ClientSize = System::Drawing::Size(560, 291);
                    this->Controls->Add(this->label1);
                    this->Controls->Add(this->progressBar1);
                    this->Controls->Add(this->button1);
                    this->Name = L"Form1";
                    this->Text = L"Form1";
                    this->ResumeLayout(false);
                    this->PerformLayout();

                }
#pragma endregion
        void Aktualizuj()
        {
            if(progressBar1->Value + 10 >= 100)
                progressBar1->Value = 100;
            else
                progressBar1->Value += 10;
            label1->Text = L"zmiana napisu";
        }

        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
                         {
                                 Aktualizuj(); // powinien zaktualizowac się progressbar
                         }
        private: System::Void label1_Click(System::Object^  sender, System::EventArgs^  e) {
                 }
        };

}

Jakbyś próbował zadeklarować funkcję Aktualizuj przed przestrzenią nazw, to kompilator mówi, że Form1 nie nalezy do przestrzeni nazw Program, z drugiej strony, jak funkcję definiujesz pod przestrzenią nazw, to pluć będzie o to, że Aktualizuj jest niezainicjalizowane, dlatego wpakuj funkcję jako metodę klasy Form1 i wszystko będzie działało tak jak chcesz. Pozatym, tworzyłeś w funkcji Aktualizuj za każdym razem nowy obiekt a nowy obiekt ma na początku wartość 1 i potem nie zostawała ona wyświetlana


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-06-24 12:42

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Doskonale zdaję sobie sprawę, że jak funkcja Aktualizuj() jest wewnątrz klasy Form1 to wszystko działa.
Problem tkwi w tym co zrobić żeby działało jak funkcja Aktualizuj jest poza klasą Form1
....
Proszę o pomoc :)

Pozostało 580 znaków

2011-06-24 12:48

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Funkcję aktualizuj wyrzucić do odzielnego pliku w deklaracji rzucić parametr który będzie wskaźnikiem do tej klasy Aktualizuj(Program::Form1*), a w wywołaniu po wciśnięciu button1_Click wywołać funkcję przez Aktualizuj(this);
Ale musisz wtedy dodać plik z definicją funkcji tak jak powiedział Azarien.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-06-24 13:14

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Plik Form1.h:

#pragma once
#include "funkcje.h"

namespace Program {

        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
        /// </summary>
        public ref class Form1 : public System::Windows::Forms::Form
        {

        public:
                Form1(void)
                {
                        InitializeComponent();

                        //
                        //TODO: Add the constructor code here
                        //
                }

                // koniec

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

        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->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
                        this->SuspendLayout();
                        // 
                        // button1
                        // 
                        this->button1->Location = System::Drawing::Point(177, 205);
                        this->button1->Name = L"button1";
                        this->button1->Size = System::Drawing::Size(217, 30);
                        this->button1->TabIndex = 0;
                        this->button1->Text = L"button1";
                        this->button1->UseVisualStyleBackColor = true;
                        this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
                        // 
                        // progressBar1
                        // 
                        this->progressBar1->Location = System::Drawing::Point(52, 81);
                        this->progressBar1->Name = L"progressBar1";
                        this->progressBar1->Size = System::Drawing::Size(476, 35);
                        this->progressBar1->TabIndex = 1;
                        this->progressBar1->Value = 1;
                        // 
                        // Form1
                        // 
                        this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                        this->ClientSize = System::Drawing::Size(560, 291);
                        this->Controls->Add(this->progressBar1);
                        this->Controls->Add(this->button1);
                        this->Name = L"Form1";
                        this->Text = L"Form1";
                        this->ResumeLayout(false);

                }
#pragma endregion

        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
                         {
                                 Aktualizuj(this); // powinien zaktualizowac się progressbar
                         }
        };

}

Plik funkcje.h:

#include "Form1.h"

void Aktualizuj(Program::Form1*)
{
//Form1^ forma = gcnew Form1
//forma->progressBar1->Value = 100;
}

error:

1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\funkcje.h(3): error C2653: 'Program' : is not a class or namespace name
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\funkcje.h(3): error C2065: 'Form1' : undeclared identifier
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\funkcje.h(3): error C2059: syntax error : ')'
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\funkcje.h(4): error C2143: syntax error : missing ';' before '{'
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\funkcje.h(4): error C2447: '{' : missing function header (old-style formal list?)
1>c:\users\datex\documents\visual studio 2010\projects\downlodertest\downlodertest\Form1.h(97): error C3861: 'Aktualizuj': identifier not found

Ale musisz wtedy dodać plik z definicją funkcji tak jak powiedział Azarien.
Czyli #include "Form1" tak?

wogóle inaczej, nie przejmuj się tym co napisałem, tylko przeglądnij ten kod co tutaj wkleiłem - MJay 2011-06-24 13:51

Pozostało 580 znaków

2011-06-24 13:41

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Trochę się głubię w środowisku .NET framework dlatego tak długo się zastanawiałem nad rozwiązaniem

#pragma once

namespace Program {
        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
        /// </summary>
        public ref class Form1 : public System::Windows::Forms::Form
        {

        public:
                Form1(void)
                {
                        InitializeComponent();

                        //
                        //TODO: Add the constructor code here
                        //
                }

                // koniec

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

        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->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
                        this->SuspendLayout();
                        // 
                        // button1
                        // 
                        this->button1->Location = System::Drawing::Point(177, 205);
                        this->button1->Name = L"button1";
                        this->button1->Size = System::Drawing::Size(217, 30);
                        this->button1->TabIndex = 0;
                        this->button1->Text = L"button1";
                        this->button1->UseVisualStyleBackColor = true;
                        this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
                        // 
                        // progressBar1
                        // 
                        this->progressBar1->Location = System::Drawing::Point(52, 81);
                        this->progressBar1->Name = L"progressBar1";
                        this->progressBar1->Size = System::Drawing::Size(476, 35);
                        this->progressBar1->TabIndex = 1;
                        this->progressBar1->Value = 1;
                        // 
                        // Form1
                        // 
                        this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                        this->ClientSize = System::Drawing::Size(560, 291);
                        this->Controls->Add(this->progressBar1);
                        this->Controls->Add(this->button1);
                        this->Name = L"Form1";
                        this->Text = L"Form1";
                        this->ResumeLayout(false);

                }
#pragma endregion

        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);

        };
}

void Ak(Program::Form1^ form)
{
    form->progressBar1->Value = 100;
    form->button1->Text = L"Zakoncz";
}

System::Void Program::Form1::button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    if(progressBar1->Value == 100)
    {
        Close();
    }
    Ak(this);
}

Nie potrzeba było oddzielnego pliku, tylko w klasie zostawić deklarację funkcji natomiast definicję dać nieco niżej.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay, 2011-06-24 13:45

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0