wohin gehört die Declaration von struct ?



  • Hallo,

    danke Dir sehr für die echt erschöpfende Antwort !
    Ich les mir das nachher nochmal GANZ genau durch ... muss erst mal Abendbrot machen 🙂

    Was ich beim "überfliegen" gerade nicht gesehen habe sind die sogenannten prototypen von eigenen funktionen.
    Ich hab das nur mal in anderen Projekten gesehen, gehört und auch was davon im Tutorial gelesen.
    Jedoch kann man ja mit .NET keine funktionen mehr außerhalb von Classen definieren oder hab ich da was falsch verstanden ?
    Dann geht das ja mit den Prototypen gar nicht mehr so oder bin ich jetzt völlig auf dem falschen Dampfer mit den Prototypen ?

    Dank Dir nochmal für die Antwort...habs mir glatt ausgedruckt !

    Matthias



  • Ich sehe keinen Grund warum man in .Net keine freie Mehtoden erstellen können sollte, zumal diese durchaus als Funktoren dienen könnten.

    So lässt sich folgendes verwenden:

    System::Void helper(System::String^ t)
    {
    	t = "Hallo Welt";
    }
    
    System::String ^t  = gcnew System::String("");
    helper(t);
    

    IMHO ging es darum .Net Objekte global anzulegen. Warum ? Ka. Ich nehme an, es würde probleme mit dem Aufräumen der Objekte geben da vermutlich nach C++ Regeln die Objekte zu spät bzw. undefiniert zerstört werden würden.

    Hier kann uns eventuell Jochen helfen.



  • Ich muss zugeben: Ich hab den Thread jetzt nicht ganz verfolgt...
    Was ist genau die Frage? Warum man ref-Obejekte nicht global instanziieren kann?
    Das liegt daran, dass das initialiseren nicht so wie bei der CRT funktioniert (wo es "globale" initializer gibt) sondern jetzt "deterministisch" an der jeweiligen Klasse gebunden ist (was IMHO viel schöner ist, da die Reihenfolge ersichtlich ist; im gegensatz zu C/C++).

    ref class A
    {
    };
    
    A ^a;  // erzeugt  error C3145: 'a' : global or static variable may not have managed type 'A ^'
    
    ref class B
    {
    public:
      static A ^a;  // ist ok, und hat den gleichen effekt wie das obige...
    };
    


  • Jup,

    genau darum ging es, damit da nicht einfach eine "vermutung" stehen bleibt 🤡

    Danke schön!



  • Hallo,

    sorry für die verspätete Antwort, bin grad rein.

    Naja, es ging eigentlich um vieles:

    1. Warum geht nach diesem Code der Designer nicht mehr ?
    (Komplett neue Windows Forms-Anwendung )

    Form1.h:

    #pragma once
    
    ref struct test2
    	{};
    
    namespace test {
    .
    .
    .
    

    Danach geht der Designer nicht mehr ???
    Warum das war die Frage...die vorläufige Antwort von Knuddelbär den code
    ref struct test ... in eine extrah *.h datei zu schreiben und diese zu includen. Das geht auch, beantwortet aber die Frage noch nicht ausschöpfend.
    Komischerweise geht value struct test ... an genau der gleichen stelle. Da geht der Designer wieder ( Form1.h schliessen und neu öffnen sonst gehts nicht ! )

    Dann gings um die Hilfe, ich lande manchmal an merkwürdigen Seiten wenn ich F1 drücke, die gar nichts mit dem Thema zu tun haben.
    Da denke ich aber hilft eine neue installation bei mir.

    Dann gings als letztes um die Prototypen von eigenen functionen. Da hab ich viele Beispiele ( unmanaged wohlgemerkt ! ) bei denen die in den Header Dateien stehen. Das ist ja jetzt wohl irgendwie nicht mehr so. Was ich ein bischen komisch finde ist das Functionene anscheinend nur noch in Classen stehen dürfen ??

    Naja und zu guter letzt ging es noch um die ganzen Dateien die automatisch angelegt werden wenn man ein neues Windows Forms-Anwendung erstellt.
    Da steige ich noch nicht ganz durch.
    Da hat aber Knuddel... schon nen sehr guten Anfang vermitteln können .. Danke nochmals !

    So, das als kleine Zusammenfassung 🙂

    Matthias



  • 1. Warum geht nach diesem Code der Designer nicht mehr ?

    Wie bereits gesagt: Microsoft fragen, das wird Dir hier erst mal keiner erklären können , die Fehlermeldung meldet, das VCCodeModel noch nicht fertig ist. Leb mit ;o)

    Die Prototypenfrage ist beantwortet, gerade mal 2 Posts über Deinem.

    Was die Datieen betrifft weiß ich noch nicht genau was Du willst ?! In der Hilfe gibt es irgendwo eine Liste mit beschreibung welche Datei für was gut ist und irgendwo stehen dann auch die Dinge wie .ncb ist die Intellisense Datenbank.

    Ich persönlich lebe damit, das ich nicht genau weiß was der Compiler alles an FIles anlegt zumal sich das von Version zu Version ändern kann.



  • Hallo,

    zu 1 ja, damit hab ich mich erst mal abgefunden. Jochen hatte nur danach gefragt und so habe ich es nochmal mit reingeschrieben, auch in der Hoffnung das er vielleicht eine andere Erklärung haben könnte da er MS Dev ist.

    Die Prototypenfrage ist beantwortet, gerade mal 2 Posts über Deinem.

    Da bin ich noch am grübeln ... das hab ich noch nicht nachvollziehen können weil ich wieder nicht genau weiss woo ich den Code von Jochen hinschreiben muss ?
    Ich denke aber das der in die Classe muss oder ?
    Habt Ihr ja geschrieben das die ref nur in classen geht. Den Vorteil davon verstehe ich jetzt noch nicht worum ich mir aber auch keine Sorgen weiter mache da das sicher noch kommt wenn ich ein bischen mehr Erfahrung gesammelt habe.

    Das mit den Dateien ... so bin ich eben und jeder Mensch ist eben auch eine Eigene Classe 🙂 ... ich will sehr oft alles bis ins kleinste verstehen ... dazu gehören eben auch diese blöden dateien.

    Ich probier damit gerade rum 🙂

    Matthias



  • Warum der Designer nicht mehr geht? Steht das nicht in der Fehlermeldung?

    The class Form1 can be designed, but is not the first class in the file. Visual Studio requires that designers use the first class in the file. Move the class code so that it is the first class in the file and try loading the designer again.



  • Jochen Kalmbach schrieb:

    Warum der Designer nicht mehr geht? Steht das nicht in der Fehlermeldung?

    The class Form1 can be designed, but is not the first class in the file. Visual Studio requires that designers use the first class in the file. Move the class code so that it is the first class in the file and try loading the designer again.

    Hallo,

    ich versteh jetzt aber wirklich langsam die Weelt nicht mehr !
    Woher hast Du denn DIESE Warnung ??

    Bei mir sieht das folgendermaßen aus:

    Ich für die folgenden Zeilen direct nach #pragma once in die Form1.h ein

    #pragma once
    
    ref struct test3
    	{
    
    	};
    

    MEHR NICHT !!!

    Dann erhalte ich , wenn ich auf die Registrierkarte Form1.h[Entwurf] gehe, folgende Warnung :

    Warnung 1 Either VCProject or VCCodeModel is not ready yet. Please close designer and try again. 0 0

    So, und die sieht ja wohl doch etwas anders aus als deine oder ?
    Ich hab auch das deutsche MS Visual Studio 2005 ! ( nur weil deine Fehlermeldung ja sogar in deutsch ist ! )

    SO, wenn ich nun die Warnung aktiviere, also markiere so das er blau ist, und dann auf F1 drücke komme ich auch in keiner Weise auf eine Seite auf der ich deinen Text den Du da irgendwo her hast !

    Ich hab davon jetzt extra bildchen gemacht damit ihr das mal seht. Irgendwas stimmt doch da mit meiner IDE nicht oder was soll denn das sonst sein das ich hier laufend ganz andere Medlungen als Ihr bekomme ?

    http://www.starflight-virtual.de/c++/image_1.jpg
    http://www.starflight-virtual.de/c++/image_2.jpg
    http://www.starflight-virtual.de/c++/image_3.jpg

    So, sicher bekomm ich jetzt gleich wieder zunder von Euch weil ich so forsch geschrieben hab.

    Matthias



  • Fazit: Du DARFST keine Klassen/Structs oder sonstwas *oberhalb* der "Form"-Klasse einfügen!
    Die Form-Klasse muss die *erste* in der h-Datei sein, sonst findet der Designer die Klasse nicht, die er Designen soll.
    Verlagere Deine sonstigen Klassen/Structs usw. in eine separate h-Datei und binde diese ganz oben mit

    #include "meineh-datei-h"
    

    ein



  • Hallo,

    ja das hatten wir doch schon.
    Mir ging es aber in dem Post AUCH darum was mit meiner IDE los ist ?
    Also ob da was falsch installiert sein könnte weil ich nen VÖLLIG anderen Fehler bekomme als Du und auch Knuddelbär !

    Das hast Du in meinem Post sicherlich überlesen, denn das war/ist ja das eigentliche Problem.

    Matthias



  • ...Nachtrag nochmal zu den Dateien...

    Ich hab mal ein Projekt gemacht und hochgeladen.
    Darin sind einige Kommentare mit Frage die ich mir nicht wirklich beantworten kann.
    Vielleicht kann man besser nachvollziehen wo meine Probleme liegen :

    http://www.starflight-virtual.de/c++/klassen1.rar

    Zu dem Problem bin ich gekommen als ich dies hier nachvollziehen wollte. Ich hatte mir mein erstes ContextMenu gebastelt und war eigentlich recht stolz daruaf. Dann scheiterte es allerdings bei einem einfachen Event abfragen wenn man auf einen MenüEintrtag klickt. Also daran das Menu->OnClick Ereignis zu behandeln.

    http://msdn2.microsoft.com/en-us/library/4b612y2s.aspx

    Vielleicht hat ja jemand von Euch ( Ihr scheint ja hier die einzigen zu sein ) Lust sich das mal anzuschauen ?

    Matthias



  • Sobald im Header für die Form ein ref struct auftaucht (auch unterhalt der Klassendefinition), kommt die Meldung mit dem VCCodeModel.

    Ich schliesse aber nicht aus, das die Englische Version des VC sich anderst vehält.

    Das man sich zur Problemlösung anderer deren Projekte downloaded ist eher ungewöhnlich und ausnahmen.

    Deine Probleme die Du im Projekt ansprichst wirst Du lösen können wenn Du mal anfängst die Grundlagen von C++ zu lernen bevor Du anfängst mit Klickeroberflächen. Das ist nun mal realität an der auch Du nicht vorbeikommst.

    So überleg Dir mal was z.B. button1_Click von zugriff_3 an dieser stelle bereits kennen könnte.

    Ansonsten gewöhne Dir bitte mal an pro Problem einen Thread aufzumachen. Es wird sehr unübersichtlich hier und Du hast mehr chancen hilfe auch anderer zu bekommen bei kleinen Threads. Der hier geht 4 Seiten lang, da gibt es wohl kaum noch jemanden der mitliest.



  • Hallo,

    danke Dir trotzdem das Du es Dir angesehen hast.
    Nach dem Problem hier mache ich auch ( versprochen ) nen neuen Thread auf !

    Also Folgendes, das fehlt in dem Projekt. Ich wollte eigentlich mal wissen wie man textBox1->text = L".."; aus einer anderen Classe ändern kann.

    1. die Ableitung der TextBox public machen, das geht aber auch nicht
    Also public: System::Windows::Forms::TextBox^ textBox1;

    Hmm...ich kann aber wohl aus einer anderen Classe auf eine static public funktion der Classe Form1 zugreifen und in der Funktion dann die Eigenschaft text der textBox1 ändern.

    Das ist auch der einzige Weg der mir einfällt...gibts denn da noch ne andere Lösung ?

    Ich hab das ganze Projekt hochgeladen weil ich immer Probleme habe wenn Ihr mir ( netterweise !! ) ein stück code hier reinschreibt, dann ist das zwar echt nett, aber ich weiss manchmal nicht genau wo das jetzt hingehören soll.

    So, jetzt hab ich das Problem das ich hin wie her nicht auf die classe zugriff_3 komme.

    1. Versuch :

    ...
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    ...
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    						 // Hier hab ich nun gar keine Ahnung wie ich am besten auf die Member der
    						 // Classen zugriff_* zugreifen kann ?
    						 // zugriff_3::changeTextBox_3();
    							/*
    							Fehler	1	error C2653: 'zugriff_3': Keine Klasse oder Namespace	e:\eigene dateien\visual studio 2005\projects\projects c++\klassen1\klassen1\Form1.h	105	
    							// Hmmmmmm ????
    							*/
    						 zugriff_3 zg;//::changeTextBox_3^ zg;
    						 }
    
    }; // Ende Class Form1
    
    	ref class zugriff_3: public Form1
    		{
    		public:
    			void changeTextBox_3()
    				{
    					Form1^ F;  // <-- soweit so gut, das könnte gehen oder ?
    					F->textBox1->Text = L"Hallo TextBox aus Classe Zugriff_3";
    					//Form1::changeTextBox();	
    				};
    		};
    
    // Nur weiter oben kan nich doch nicht auf zugriff_3 zugreifen ?
    // <<<<<<<<< private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) { <<<<<<<<<
    // Die kennt der Compiler doch da noch nicht.
    

    Er kennt ja nicht mal die Classe selber bei button1_click ???
    Matthias



  • Du willst Du von extern die textBox1 ändern, oder?

    Warum leitest Du denn die Form1 nochmals ab???
    Mach doch direkt in Form1 eine public Methode/Property, welches Dir die textBox1->Text setzt...

    Ich verstehe Dein Problem nicht so ganz.... Du machst es Dir viel zu kompliziert!

    public ref class Form1 : public System::Windows::Forms::Form
    {
      // ...
      public:
        property String^ MyText
        {
          String^ get() { return this->textBox1->Text; }
          void set(String ^value) { this->textBox1->Text = value; }
         }
      // ...
    }
    

    Und jetzt kannst Du es von extern zuweisen:

    #include "form1.h"
    // ...
    Form1 ^frm = gcnew Form1();
    frm->MyText = "Hallo welt"; // lass bitte das L weg!
    // ...
    


  • Hallo,

    ja das mit property zu machen weiss ich ja wie das geht.
    Mir gings aber genau darum DAS ZU VERSTEHEN WIE ich das mit einer Klasse machen kann die UNTER der Classe Form1 erst Declariert wird oder in einer anderen Datei steht !!

    Darum ging es !
    Ich danke Dir aber trotzdem nochmals für die schöne Erklärung wie das mit property's geht...habs ausgedruckt !
    Das hilft mir ja alles enorm weiter !!

    Ich möchte aber eben auch verstehen wie man sowas mit einer Klasse machen kann, ja umständlich, aber nur zu Informations und lernzwecken.

    Wie soll ich das denn sonst lernen ?

    Matthias



  • Am einfachsten ist es, wenn Du die Klassen-Deklaration in eine H-Datei packst! und dann diese H-Datei in er form1.h ganz oben includierst.
    Dann kannst Du innerhalb der Form1 die andere Klasse verwenden.



  • Hallo,

    hmm, da hatte ich auch schon dran gedacht, schein aber auch so nicht zu gehen.
    Hab folgendes gemacht:

    eine neue Datei inc_klassen.h erstellt mit Inhalt:

    ref class zugriff_3//: public klassen1::Form1
    		{
    		public:
    			void changeTextBox_3()
    				{
    				klassen1::Form1::tbText = "Neuer Text";
    				};
    		};
    

    und in der Form1.h ganz oben folgendes :

    #pragma once
    
    /// das hier, also :
    #include "inc_klassen.h"
    
    namespace klassen1 {
    .
    .
    

    Da bekomme ich aber auch ( ich glaube Logisch ) eine Fehlermeldung die lautet:

    Fehler 1 error C2653: 'klassen1': Keine Klasse oder Namespace e:\eigene dateien\visual studio 2005\projects\projects c++\klassen1\klassen1\inc_klassen.h 7
    Fehler 2 error C2065: 'tbText': nichtdeklarierter Bezeichner e:\eigene dateien\visual studio 2005\projects\projects c++\klassen1\klassen1\inc_klassen.h 7
    Warnung 3 warning C4244: 'Argument': Konvertierung von 'double' in 'int', möglicher Datenverlust e:\eigene dateien\visual studio 2005\projects\projects c++\klassen1\klassen1\Form1.h 270

    Und genau das ist ja das Problem. Ich glaube da hab ich irgendwas mit den Zugriffen noch nicht verstanden und wäre Euch sehr dankbar weenn ihr mir das an diesem einfachen beispiel erklären könntet.
    Ich könnte dieses Wissen dann auf meine anderen kommenden Probleme anwenden.

    Bitte bitte wenn ihr irgendwelchen Code postet, könntet Ihr dann dazuschrieben wo der hingehört ? Danke Euch !!

    Matthias



  • Kanst Du mir mal sagen, WAS Du überhaupt willst???

    Was soll denn Dein Programm können? Wer soll denn das "changeTextBox_3" aufruefen?
    Du kannst keine Member-Variable verändern oder irgendeinen MemberFunktion/Property aufrufen, bevor Du nicht eine Instanz davon erstellt hast und Du diese Instanz auch kennst!

    Wie schon so oft gesagt: Lerne die Grundlegenden Dinge und fange nicht gleich mit C++/CLI an. Fange mit C# an, da ist alles viel einfacher...



  • Hallo,

    also jetzt nochmal zum Mitschreiben:

    Ich möchte Nichts anderes als Visual C++ mit und ohne .NET lernen.
    Das rührt daher das ich ( früher in Delphi ) einige AddOns für den Microsoft Flugsimulator schreibe. Der Name Hal Bryan sollte Dir als MS Dev partner sicher was sagen.

    So, dazu lese ich ein englisches Tutorial.
    In diesem Tutorial sind halt einige Sachen die ich ncih/noch nicht verstanden habe.

    Dazu habe ich mich hier an das Forum gewendet.
    Mein Problem habe ich erklärt und erkläre es gleich nochmal.
    Und auch wenn es unüblich ist werde ich ein neues Projekt erstellen , packen und auf meinen Server legen damit es für Euch einfacher wird und ihr nicht immer alles nachbauen müsst.

    So, jetzt nochmal ... Es geht noch nicht darum das das was ich machen will irgendwelchen Sinn ergibt. Das sind alles nur Tests um irgendwas zu verstehen !

    So und derzeit geht es um folgendes :

    Eine Classe Form1 mit einer textBox1 und einem button1.
    Eine weitere Classe mit einer Funktion die den Text in der textBox1 ändern soll.
    Dies soll aber geschehen wenn man auf den Button1 clickt !!

    Problem :

    Zugriff unter den Classen.

    hier das Projekt mit Kommentaren drin:
    http://www.starflight-virtual.de/c++/klassen_2.rar

    Das ist doch alles was ich wissen möchte, also wie das geht das ich von der testclasse auf die classe fom1 zugreifen kann und wie ich im onclick des buttons auf die classe zugreife die erst später declariert wird.

    Geht das überhaupt ?
    Es ist hin wie her, schriebe ich die testclasse vor die Form1 classe, dann geht das eine nicht, schrieben ich die testclasse ganz unten rein, dann geht das ander nicht.

    Das ist es was ich erklärt haben möchte. Das ist ja nicht so das ich nicht selber suche oder rumprobier, das mach ich doch schon, sonst würde ich ischer nicht auf solche ideeen kommen oder ?

    MAtthias


Anmelden zum Antworten