Getting started - meine allererste Frage zum VC++ Express Edition



  • Jochen Kalmbach schrieb:

    Nur so als Anmerkung: Das was Du machst ist kein C++, sondern C++/CLI!
    Du verwendest das .NET-Framework um Windows.Forms-Oberflächen zu machen. Ich pers. Rate dann eher zu C#...

    Wenn Du wirklich C++ machen, willst, solltest Du Dir ein Framework wie die MFC, WTL, Qt, usw... anschauen. In der Express-Version ist keine MFC dabei. Die gibt es erst ab der Standard-Version (die dann aber Geld kostet).
    Falls Du native WIn32-Applikationen machen willst, kannst Du auch einfach noch einen externen Resource-Editor verwenden, wie z.B.:
    http://www.wilsonc.demon.co.uk/d10resourceeditor.htm

    Hallo Jochen,

    ich verstehe nur Bahnhof von dem, was Du mir da versuchst zu erklären! Sorry!
    Ich will eigentlich nur ein bisschen Hobbyprogrammieren. Ich bin kein Programmierer! Von Framework und MFC verstehe ich nichts! Ich weiss auch nicht, wass Du mit nativer Win32-Anwendung meinst. Ich denke mal, dass Microsoft keine Programmentwicklungsumgebung herausgibt, mit der man keine Win32 Programme schreiben kann, oder?

    Wenn ich dann mal ein kleines Programm fertig haben sollte mit z.B. einem Formular, dann sollte es doch möglich sein, dieses programm jemanden zu geben, der auch Windows XP hat und dort sollte das programm dann auch laufen, oder etwa nicht?

    Sorry für meine laienhafte Ausdrucksweise!

    Danke für Deine Hilfe!

    Gruß,

    Micha



  • Hier mal mein Code bisher, wobei ich sagen muß, dass 99,9% ja nicht MEIN code ist, soldern durch das System erzeugt wurde.
    Mein Code ist nur die allerletzte Zeile, und die scheint falsch zu sein! * Heul

    #pragma once
    
    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 Test3 {
    
    	/// <summary>
    	/// Zusammenfassung für MeinFormular
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class MeinFormular : public System::Windows::Forms::Form
    	{
    	public:
    		MeinFormular(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~MeinFormular()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    	private: System::Windows::Forms::Label^  label1;
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(30, 46);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(132, 40);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"Drücke Mich";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &MeinFormular::button1_Click);
    			// 
    			// label1
    			// 
    			this->label1->Font = (gcnew System::Drawing::Font(L"Arial", 15.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->label1->Location = System::Drawing::Point(33, 119);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(275, 41);
    			this->label1->TabIndex = 1;
    			this->label1->Text = L"noch nicht gedrückt";
    			this->label1->Click += gcnew System::EventHandler(this, &MeinFormular::label1_Click);
    			// 
    			// MeinFormular
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(461, 358);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->button1);
    			this->Name = L"MeinFormular";
    			this->Text = L"MeinFormular";
    			this->Load += gcnew System::EventHandler(this, &MeinFormular::MeinFormular_Load);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void MeinFormular_Load(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	private: System::Void label1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    			 {Label1.Text = L"gedrückt";
    			 }
    	};
    }
    


  • Es reicht:

    Label1.Text = "gedrückt";
    

    Oder was kommt den für ein Fehler?

    @MOD: => C++/CLI



  • Hallo Jochen,

    im 5. Beitrag dieses Threads steht die Fehlermeldung, die beim Compilieren auftritt und einen Beitrag vor Deinem letzten posting ist der ganze Quellcode von dem vom System erzeugten Programm!

    Danke für Deine Hilfe!

    Gruß

    Micha



  • Ach so... stehe gerade auch auf der Leitung... muss natürlich wie folgt heissen:

    label1->Text = "gedrückt";
    


  • Es ist zum Verzweifeln!

    Nun habe ich ganz langsam - Schritt für Schritt - alles nachgemacht, was die da in der Hilfe zu ihrem Beispielprogramm schreiben. Aber es tut sich nichts!

    Hier mal ein Auszug aus der Hilfeseite
    "Visual C++ Expression Edition/Beispiele/Allgemeine Beispiele/Calculator-Beispiel...":
    -----------------------------------------------------------
    Erstellen und Ausführen des Beispiels
    So können Sie die Calculator-Projektmappe mithilfe von Visual Studio erstellen und ausführen
    Laden Sie in der Visual Studio-IDE die Projektmappendatei calc.sln.

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe Calc.

    Klicken Sie im Kontextmenü auf Erstellen.

    Hinweis
    Da dieses Programm die Symboldatei (calc.ico) nicht in eine XML-basierte Ressourcendatei (*.resx) kompiliert, müssen Sie vor dem Fortfahren die Symboldatei in dasselbe Verzeichnis wie .exe (aus dem Beispiel erstellt) kopieren.

    Führen Sie die resultierende Anwendung aus, und probieren Sie verschiedene Rechenoperationen mit dem Taschenrechner aus.
    ----------------------------------------------------------------------
    Ende Auszug

    Habe ich gemacht, aber ich finde zum einen keine *.exe-Datei und außerdem startet kein Taschenrechnerprogramm!

    Ich zweifel langsam an mir!



  • Jochen Kalmbach schrieb:

    Ach so... stehe gerade auch auf der Leitung... muss natürlich wie folgt heissen:

    label1->Text = "gedrückt";
    

    habe ich auch schon probiert, geht aber auch nicht!

    hier noch mal die Meldungen:

    1>------ Erstellen gestartet: Projekt: Test3, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>MeinFormular.cpp
    1>d:\dokumente\visual_c++\test3\test3\MeinFormular.h(105) : error C2065: 'Label1': nichtdeklarierter Bezeichner
    1>d:\dokumente\visual_c++\test3\test3\MeinFormular.h(105) : error C2227: Links von "->Text" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist ''unknown-type''
    1>Das Buildprotokoll wurde unter "file://d:\Dokumente\Visual_C++\Test3\Test3\Debug\BuildLog.htm" gespeichert.
    1>Test3 - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Nein, hast Du nicht probiert... C++ ist case-sensitive, somit musst Du

    label1
    

    und nicht

    Label1
    

    verwenden!



  • ok, nun ist der Compiler durchgelaufen! Also lag es daran, dass ich die Groß/Kleinschreibweise nicht beachtet habe! Danke!

    Nun aber bin ich ganz verwundert, warum ich nach "Starten ohne Debuggen" und ohne Fehler mein Formular nicht sehe! Ich sehe es nur in der Entwurfsansicht.

    Aber ich wollt sie gern mal testen, meine kleine Ereignisprozedur!

    Wo könnte das Formular hin sein?



  • Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • OK, die Antwort ist jetz ein wenig weitreichender (hab ich irgendwann auch mal schmerzlich lernen müssen...).

    Also, dass, was du irgendwo als Label1 findest, is nehme ich mal stark an ein Zeiger, dass ist sowas ähnliches wie ein Datentyp (in C/C++ u.a. gibts nur 4Typen: int, char (=1Zeichen), double (für Kommazahlen) und void (kein echter datentyp, entspricht in VB der sog. Sub). Alle anderen Typen sind irgendwie aus den drei ersten Grundtypen abgeleiet). Die Zeiger (engl. Pointer) sind jetz nicht eine Variable/Objekt/... sondern sie sagen dem Rechner nur, wo er diese Variable/... im RAM findet, der Zeiger gibt also die Speicheradresse zurück (also nur der Ort, wo das eigtl. Objekt zu finden ist, nicht aber das Objekt selber). Dadurch ist es natürlich sehr viel schneller machbar, auf das eigtl. Objekt zurückzureifen, weil man weiß, wo es überhaupt im RAM rumliegt.

    So, was hat das ganze mit unserem Label zu tun: Label1 ist wie gesagt nur ein Zeiger auf das eigtl. Objekt "Label". Das hat zwei Vorteile: 1. man findet es schnell im Ram, 2. man muss nicht dauernd (wenn man irgendwann man in Verlegenheit kommen sollte, das Objekt "Label" an eine Funktion zu übergeben, z.B. damit es in dieser Funktion weiterverarbeitet werden kann) das komplette Objekt übergeben, was abhängig von Objektgröße ziemlich lange dauern kann - alles wertvolle Rechnerzeit - sondern man sagt dem Prozi nur, wo das Label rumliegt und schwups hat er Zugriff auf sämtliche Eigenschaften desselben. Und da kommt nun der Punkt ins Spiel: bei Zeigern kann man um auf die versch. Eigenschaften (=Properties) und Methoden zurückzugreifen nicht mit dem Punkt-Operator arbeiten, sondern tut das über den Zeiger-Operator -> (darum heußt das Ding auch Zeiger, sieht ja so ähnlich aus). Probier also - und jetz komme ich zum wichtigen Teil - einfach folgendes: Label1->Text = "Die eigenschaft Text muss im Übrigen Groß geschrieben werden, da C++ auf Groß- und Kleinschreibung achtet (anders als das "benutzerfreundliche" VB^^.

    So, das war jetz mal genuch des Ganzes, viel Glück damit...



  • Leider alles nur Halbwissen... Und leider habe ich keine Zeit es richtig zu stellen. Ich hoffe das übernimmt jemand anderes für mich.



  • Dann versuch ich mich mal 😉

    Carschtn schrieb:

    Also, dass, was du irgendwo als Label1 findest, is nehme ich mal stark an ein Zeiger, dass ist sowas ähnliches wie ein Datentyp

    Sowas ähnliches? Zeiger sind Datentypen, und label1 dürfte, da C++/CLI, ein Tracking Handle sein. Das ist das referenzgezählte, müllgesammelte Äquivalent zu einem nackten Zeiger.

    (in C/C++ u.a. gibts nur 4Typen: int, char (=1Zeichen), double (für Kommazahlen) und void (kein echter datentyp, entspricht in VB der sog. Sub). Alle anderen Typen sind irgendwie aus den drei ersten Grundtypen abgeleiet).

    char, short, int, long, float, double, alle Modifikationen davon und Zeiger, sowie void sind alles Grundtypen.

    Die Zeiger (engl. Pointer) sind jetz nicht eine Variable/Objekt/... sondern sie sagen dem Rechner nur, wo er diese Variable/... im RAM findet, der Zeiger gibt also die Speicheradresse zurück (also nur der Ort, wo das eigtl. Objekt zu finden ist, nicht aber das Objekt selber). Dadurch ist es natürlich sehr viel schneller machbar, auf das eigtl. Objekt zurückzureifen, weil man weiß, wo es überhaupt im RAM rumliegt.

    Zum einen sind Zeiger auch Variablen, sie haben eine eigene Speicherstelle, und sie haben einen Inhalt. Der Inhalt ist halt selbst wieder eine Adresse, an der Daten anderen Typs liegen können. Zum anderen frage ich mich, wie man auf "nicht-Zeiger" Variablen überhaupt zugreifen soll, wenn "man" nicht weiß, wo sie im RAM rumliegen 😕

    1. man findet es schnell im Ram,

    Siehe oben. Genaugenommen kann der Zugriff auf Objekte (ggü. Zeigern-auf-Objekte) sogar schneller sein, weil keine Indirektion erforderlich ist.

    2. man muss nicht dauernd (wenn man irgendwann man in Verlegenheit kommen sollte, das Objekt "Label" an eine Funktion zu übergeben, z.B. damit es in dieser Funktion weiterverarbeitet werden kann) das komplette Objekt übergeben, was abhängig von Objektgröße ziemlich lange dauern kann - alles wertvolle Rechnerzeit - sondern man sagt dem Prozi nur, wo das Label rumliegt und schwups hat er Zugriff auf sämtliche Eigenschaften desselben.

    Man kann auch Zeiger und Referenzen auf Objekte bilden und diese übergeben.



  • [quote="LordJaxom"]
    ...
    Das ist das referenzgezählte, müllgesammelte Äquivalent zu einem nackten Zeiger.
    ...
    [quote]
    Na endlich mal einer, der es auf den Punkt bringt. 👍 🙂


Anmelden zum Antworten