CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [C++/CLI]Include i praca między formami...

[C++/CLI]Include i praca między formami...

dział ogólny

[C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » piątek, 17 grudnia 2010, 22:14

Witam,
nie wiem który to już temat na którym to już forum, ale rozwiązani jakoś muszę znaleźć :/

Najpierw zacznę ogólniej, bo jak pisałem precyzyjnie to mówili, że zbyt zagmatwane :/

Są łącznie 3 klasy:
klasa główna (np. Form1)
klasa danych (np. data)
klasa dodatkowa (np. Form1a)

W klasie "data" jest typ danych "Name" (konstruktor, itp. wszystko poprawnie).
W klasie "Form1" jest zmienna XX tego typu danych (data XX)
Klasa "Form1a" jest klasą jedynie z czystą formą + button.

Teraz kwestia tego co wywoływało błędy.
W klasie głównej oczywiście jest include klasy danych (#include "data.h")
W klasie dodatkowej "Form1a" jest include klasy głównej (#include "Form1")

Problem pojawia się gdy w klasie głównej dodam include klasy dodatkowej (#include "Form1a")

Wtedy wyskakuje lista błędów tak jakby w klasie głównej nie było (#include "data.h")
Nie wiem co źle robię. Tu musi być dostęp między tymi klasami, a nie wiem jak to zrobić.
Jakby coś jeszcze było niejasne.

Aha, żeby nie było. Wszystko można elegancko zrobić stosując wskaźnik do klasy (nie wiem jak to się profesjonalnie nazywa ;p) przez operator gcnew. Jednak działa, tak jak wspomniałem, tylko gdy w klasie głównej nie będzie tego includa do klasy dodatkowej. Nie wiem jak to zrobić :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Darek_C++ » piątek, 17 grudnia 2010, 22:38

gcnew masz w Visual C++. Poza tym z Twojego opisu nic nie wynika zamieść kody, lub źródła w załączniku.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » piątek, 17 grudnia 2010, 22:43

W klasie dodatkowej "Form1a" jest include klasy głównej (#include "Form1")

Problem pojawia się gdy w klasie głównej dodam include klasy dodatkowej (#include "Form1a")


Człowieku! Nie włączasz formularza lecz plik nagłówkowy formularza. Jeżeli masz formularz Form1 i jest on definiowany np. w jednostkach Unit1.cpp i Unit1.h to w sekcji include włączasz #inlcude "Unit1.h", potem zmienne adresujesz poprzez nazwę formularza.

Przeczytaj sobie w serwisie Cyfrowy Baron dział: teoria, porada: Przekazywanie obiektów i funkcji pomiędzy formularzami, oraz teoria -> Tworzenie modułów. Proponuję również zapoznać się z teoria -> tworzenie klas.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » piątek, 17 grudnia 2010, 23:13

Sorq, wiem, mój błąd, ale... zapomniałem dopisać ".h", widocznie się zamyśliłem ;p

Chyba nie myślisz, że napisałbym projekt na ponad 5k linijek kodu nie wiedząc jak się włącza plik nagłówkowy ;p
To była tylko literówka, sorry za niepotrzebny stres :/

Chcecie kod źródłowy... no cóż, oryginału wam nie dam, bo kod jest spory, a wycinanie i wskazywanie fragmentów mijałoby się z celem. Na inne forum stworzyłem kod, który obrazował problem.

Aha, pomińcie standardowy kod formy, bo nic w nim nie było zmieniane, ważne elementy są tylko w include i eventy kontrolek (buttona). Dodałem całość dla zachowania poprawności kodu.

Więc tak, program główny:

KOD cpp:     UKRYJ  
#pragma once
#include "class.h"
#include "aaa.h" // <-- Tu tkwi problem, gdy chcę dodać podrzędną klasę do głównej i gdy główna musi być użyta w podrzędnej. (obydwie korzystają z siebie nawzajem ;p)

namespace aa {

        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(197, 12);
                        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(284, 262);
                        this->Controls->Add(this->button1);
                        this->Name = L"Form1";
                        this->Text = L"Form1";
                        this->ResumeLayout(false);

                }
#pragma endregion

        public:
                data KKK;
        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
                         {
                                 KKK.NAME[1] = "sss";
                                 this->Close();

                         }
        };
}


To jest klasa, w której jest zdefiniowany typ danych data:

KOD cpp:     UKRYJ  
#pragma once

namespace aa
{
        using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;
        public ref class data
        {
        public:
                array<String ^> ^ NAME;
                data()
                {
                        NAME = gcnew array<String ^>(100);
                }
        };
}


A to jest ostatnia klasa:

KOD cpp:     UKRYJ  
#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 aa {

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

        protected:
                /// <summary>
                /// Clean up any resources being used.
                /// </summary>
                ~aaa()
                {
                        if (components)
                        {
                                delete components;
                        }
                }
        private: System::Windows::Forms::Button^  button1;
        private: System::Windows::Forms::TextBox^  textBox1;
        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->textBox1 = (gcnew System::Windows::Forms::TextBox());
                        this->SuspendLayout();
                        //
                        // button1
                        //
                        this->button1->Location = System::Drawing::Point(198, 47);
                        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, &aaa::button1_Click);
                        //
                        // textBox1
                        //
                        this->textBox1->Location = System::Drawing::Point(177, 114);
                        this->textBox1->Name = L"textBox1";
                        this->textBox1->Size = System::Drawing::Size(100, 20);
                        this->textBox1->TabIndex = 1;
                        //
                        // aaa
                        //
                        this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                        this->ClientSize = System::Drawing::Size(284, 262);
                        this->Controls->Add(this->textBox1);
                        this->Controls->Add(this->button1);
                        this->Name = L"aaa";
                        this->Text = L"aaa";
                        this->ResumeLayout(false);
                        this->PerformLayout();

                }
#pragma endregion
        private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
                         {
                                Form1^ dlg = gcnew Form1();
                                dlg->KKK.NAME[1] = "as";
                         }
        };
}


I lista błędów wynikająca z użycia czegoś czego (teoretycznie) nie ma:


1>------ Rebuild All started: Project: aa, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'aa', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>aaa.cpp
1>AssemblyInfo.cpp
1>aa.cpp
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'Form1' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'dlg' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2061: syntax error : identifier 'Form1'
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2065: 'dlg' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2227: left of '->KKK' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2228: left of '.NAME' must have class/struct/union
1>Generating Code...
1>Build log was saved at "file://c:\Users\Slynx\Documents\Visual Studio 2008\Projects\aa\aa\Debug\BuildLog.htm"
1>aa - 6 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========



Całość tak jak wspomniałem polega na tym by z klasy głównej można było się dostać do podrzędnej i z podrzędnej do głównej. Aha, oczywiście w klasie podrzędnej nie może być include klasy danych i stworzenie nowej zmiennej tego typu danych. Trzeba uzyskać dostęp do zmiennej z klasy głównej. Niepotrzebnie komplikuje "widać" o co chodzi.

Aha, zapomniałbym o najważniejszym. Nie wiem kto projektował tą stronę (forum), ale jest na prawdę świetna. Rzadko można spotkać coś tak dopracowanego, a zwłaszcza na większych forach (pominę nazwy)... a no tak, stopka;p (Powered by phpBB) ;p Ale i tak, ukłon w stronę autora.
Ostatnio edytowano piątek, 17 grudnia 2010, 23:38 przez Cyfrowy Baron, łącznie edytowano 2 razy
Powód: tag CPP nie może być używany w połączeniu z tagiem UKRYTY
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » piątek, 17 grudnia 2010, 23:42

Niestety nie znam wogóle Visual C++ i wiele elementów jest tu dla mnie niezrozumiałych, np:

KOD cpp:     UKRYJ  
Form1^ dlg = gcnew Form1();


nigdy nie zatknąłem się z podobną konstrukcją. Poza tym nadajesz obiektom i zmiennym niezrozumiałe nazwy, np. czy Form1 jest obiektem czy klasą? Jeżeli jest obiektem, to nie można w oparciu o obiekt tworzyć nowego obiektu, ale pewnie się mylę i jest to klasa.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » piątek, 17 grudnia 2010, 23:53

Form1 to klasa (w tym wypadku główna).
Kod tworzy wskaźnik dlg do klasy Form1, tak by można było się do niej odwołać.
Obiekty, czy tam klasy mają niezrozumiałe nazwy, bo to tylko przykład, na szybko wklepałem w Visuala, żeby jak najkrócej i jak najszybciej przedstawić problem. Naturalnie, że w projekcie mają normalne nazewnictwo.
Poza tym, nie w tym miejscu szukasz błędu. To jest coś z tymi include. Może są do tego jakieś dyrektywy czy coś, ale aż tak dokładnie się na tym nie znam. Te dwie formy (klasy) muszą się wzajemnie "widzieć", by jedna miała dostęp do drugiej i odwrotnie. A problem polega na tym, że jak w ten sposób poustawiam include jak są w kodach, które wpisałem, to nie widzi klasy danych (class.h), z której korzysta klasa główna (Form1.h).
Jeśli się nie mylę to wszystko by działało poprawnie gdyby nie było tej dodatkowej klasy danych, a jedynie proste typy (int, bool). Wtedy najprawdopodobniej wszystko by działało. Ale chwileczkę, muszę jeszcze coś sprawdzić...
---
Ni ****, nie wiem. Nie mam nawet pomysłów.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 00:29

To jest coś z tymi include. Może są do tego jakieś dyrektywy czy coś,


Nie ma żadnych dodatkowych dyrektyw, po prostu włączasz bibliotekę. Skup się na komunikatach błędów, gdyż one wskazują na konkretne obiekty.


1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'Form1' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'dlg' : undeclared identifier



te błędy wskazują na to, że te obiekty nie zostały zadeklarowane, ale nie jestem w stanie nic więcej powiedzieć, gdyż nie rozumiem tych konstrukcji.
Być może polymorphism będzie potrafił powiedzieć coś więcej, gdyż on programuje w VC++.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » sobota, 18 grudnia 2010, 01:24

No cóż, oby się szybko wypowiedział.
Błędy jak błędy, nic nadzwyczajnego. Wszystko jest jasne.
Pamiętaj tylko, żeby patrzeć na błędy od początku, czyli jak nie widzi klasy Form1 to oczywistym będzie, że dlg też będzie niezdeklarowane, ale mniejsza o to.
Troszkę tutaj się poduczam i upraszczam sobie ten problem. Ale poczekamy od eksperta od VC++.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 10:59

Sam jestem ciekaw, co na ten temat powie polymorphism, gdyż nie rozumiem skąd te rozbieżności. Język programowani nie może się aż tak różnić, niezależnie od kompilatora, a tutaj widzę coś z czym się nie spotkałem w C++:

KOD cpp:     UKRYJ  
Form1^ dlg = gcnew Form1();
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » sobota, 18 grudnia 2010, 11:49

tzn, akurat ten zapis też mi jest troszkę obcy. Normalnie bym to zapisał jako:
KOD cpp:     UKRYJ  
Form1^ dlg = gcnew System::Windows::Forms::Form();


ale tamto konkretnie wyczytałem z jakiegoś forum. I albo to była rozbieżność w sposobie pisania, albo oznaczało to tyle, że ten pierwszy dłuższy zapis tworzy nową instancję obiektu form z na podstawi struktury Form1, a ten o którym mówisz jakby jedynie tworzył wskaźnik do istniejącej instancji, nie zerując wszystkich wartości.
Sam nie jestem co do tego pewien, bo miałem to w kodzie wpisane może raz czy dwa. To była taka ciekawostka z forum. I czy to w ogóle działa.... też nie wiem.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 11:51

Shynx napisał(a):tzn, akurat ten zapis też mi jest troszkę obcy. Normalnie bym to zapisał jako:


Funkcja gcnew nie występuje w bibliotekach C++Builder, więc nie znam jej przeznaczenia, ale mnie dziwi ta konstrukcja:

KOD cpp:     UKRYJ  
Form1^ dlg
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez polymorphism » sobota, 18 grudnia 2010, 11:51

Być może polymorphism będzie potrafił powiedzieć coś więcej, gdyż on programuje w VC++.

To, że korzystam z VC, nie oznacza, że znam C++/CLI. Mimo wszystko to jest inny język, taka hybryda C++ i C#.

Nie wczytywałem się za bardzo w wątek, ale jak rozumiem problemem jest to, że obie klasy, Form1 i aaa, korzystają z siebie nawzajem, i jest problem z nagłówkami, tak?


W C++ wyglądałoby to tak:

  • w Form1.h załączasz aaa.h
  • w aaa.h dajesz deklarację zapowiadającą klasy Form1, czyli:
    KOD cpp:     UKRYJ  
    class Form1; //<---

    class aaa
    { ... }


    Z pliku tego usuwasz wszystkie odwołania do składników Form1 - czyli wszelkie implementacje metod przenosisz do pliku aaa.cpp
  • w pliku aaa.cpp załączasz Form1.h

To powinno rozwiązać problem (chyba niczego nie pominąłem), choć nie wiem, czy da się to przełożyć na C++/CLI.

Funkcja gcnew nie występuje w bibliotekach C++Builder, więc nie znam jej przeznaczenia,

gcnew przydziela pamięć, która jest pod kontrolą garbage collectora.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Cyfrowy Baron » sobota, 18 grudnia 2010, 11:56

polymorphism napisał(a):To, że korzystam z VC, nie oznacza, że znam C++/CLI. Mimo wszystko to jest inny język, taka hybryda C++ i C#.


W końcu rozumiem skąd te rozbieżności w jakby się zdawało identycznym języku c++. Czy to oznacza, że Visual C++ 2008 używa tylko języka C++/CLI?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez polymorphism » sobota, 18 grudnia 2010, 12:06

Nie. Tego języka musisz używać, jeśli chcesz pisać w C++ i korzystać z WinForms czy też innych elementów platformy .NET. Podobnie jak z VCL-em - musisz korzystać z C++ Buildera i jego rozszerzeń, żeby móc używać tej biblioteki, która była pisana pod (i w) Delphi.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [C++/CLI]Include i praca między formami...

Nowy postprzez Slynx » sobota, 18 grudnia 2010, 13:26

Powiem, że nie do końca rozumiem, zwłaszcza, że w Visualu pliki cpp teoretycznie w ogóle nie są dostępne dla użytkownika. Wszystko wrzuca się do plików h, czyli np. kod w aa.h całego pliku, a w aa.cpp jest tylko include tego nagłówka i nic więcej. Boję się, żeby się to wszystko nie posypało jak zacznę przekładać mu kod tam gdzie on się go nie spodziewa w przypadku pracy na formach. No, ale zrobię backup zobaczymy. I właśnie jeszcze co do gcnew.

Tak jak wspomniałeś, jest to new z automatycznym niszczeniem obiektu po stwierdzeniu bezużyteczności. Jednak mam pytanie, bo zauważyłem coś niepokojącego. Ten program w sumie nie jest duży, wczytuje kilka obrazków, a w pamięci zajmuje ponad 30 MB (oczywiście mówię o RAM-ie). Może bym to zrozumiał, bo wszystko jest jak zawsze uruchamiane pod kontrolą debuggera (on chyba też dorzuca swoje dane), ale z każdą pracą na tym programie on stanowczo nabiera coraz więcej pamięci. Jak to jest z tymi formami ? Czy to na pewno wszystko jest czyszczone po użyciu ? Mam na myśli konkretnie Forma która wykorzystywała np. zmienne x i y, jakieś kontrolki dodane na forme (lub kontrolka na kontrolkę)... czy to wszystko jest wyrzucane po wywołaniu Close() na tej formie ? Bo zaczynam mieć coraz więcej wątpliwości, czy niektórych elementów nie trzeba ręcznie niszczyć. Może to tylko kwestia debuggera, po każdej operacji, czy niszczenie czy tworzenie i tak zbiera informację o działaniu. Jednak tak dokładnie na nim się nie znam, więc pewien być nie mogę.

A teraz jeszcze do tego dojdzie DirectX, bo muszę dodać do formy film (opcja wycięcia klatek), tak więc nowe biblioteki do dorzucenia, nowe zmienne, itp.

No cóż, najpierw spróbuje użyć tego co mi pokazałeś, a potem się zobaczy co dalej...
Jak będzie działać to Ci podziękuje ;p


Ok, zszedłem z ponad 120 błędów do... 1, ale to jeszcze nic nie oznacza, bo ten jeden może tylko je ograniczać (tj. po jego naprawie wyskoczy reszta). Może coś źle zrozumiałem. W tym pliku cpp o którym wspomniałeś mam coś takiego:

KOD cpp:     UKRYJ  
        //ref class add_new_to_database;
        ref class add_new_to_database : public System::Windows::Forms::Form
        {
    /// tu jest ta cała reszta
        }
 

Problem tkwi w tym, że jak jest taki zapis to da mi błąd, że redefinicja klasy, natomiast jak "odkomentuje" pierwszy fragment i "zakomentuje" (nie wiem jak to powiedzieć ;p Po prostu wyłącze te linijki z kodu) to "error C2447: '{' : missing function header (old-style formal list?)", ale to wynika z klamr, które zostają. Usunięcie ich oczywiście da pokaźna listę błędów.
W pliku .h jest wszsytko to co w cpp bez zdarzeń dla buttonów, itp, bo one wykorzystywały błędne dane, oraz definicja samej klasy czyli z nagłówkiem " public ref class add_new_to_database : public System::Windows::Forms::Form".

Aha, w cpp jest include pliku .h. Jednak podejrzewam, że całość jest w ogóle źle, bo wychodzi na to, że nigdzie nie ma tego "class add_new_to_database", tzn. można dodać i akceptuje, bo dorzucone przed błędem, ale nic z tego nie wynika.

Poza tym... chociaż może najpierw poczekam na odpowiedź ;p

Jeszcze coś.

*


Z pliku tego usuwasz wszystkie odwołania do składników Form1 - czyli wszelkie implementacje metod przenosisz do pliku aaa.cpp
* w pliku aaa.cpp załączasz Form1.h


Jak tak zrobię to mi wyświetla błąd "was previously declared or defined with a different managed modifier", to wrzuciłem to jako referencję do tych klas (ref przed słowem class), to jest "ok".
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 28 gości

cron