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



  • Hallo Leute,

    habe mir heute MS Visual C++ installiert und ich muß sagen, ich bin etwas
    fassungslos!

    Ich dachte, das geht genau so wie mit Delphi oder Visual Basic in so einer
    IDE. Man gibt Code ein und drückt F5 zum Laufenlassen bzw. FX zum debuggen
    im Einzelschritt oder Prozedurenschritt.

    Aber dieses Programm will, dass ich da irgendwas wie in DOS-Zeiten von der
    Kommandozeile eingebe.

    Da habe ich ja schon meine Probleme, den Pfad zu meinem Code einzutippen!
    Das ist ja extrem umständlich!

    Oder mache ich da was falsch?
    Wer kann mir mal einen Tip oder Link zu Einsteigertips geben?

    Ganz konkret kämpfe ich an diesem ersten Schritt:

    Laut Hilfe kann man einfach mal ein Beispielcode in das Editorfenster
    hineinkopieren, dann Erstellen Projektmappe und dann auf "Start ohne
    Debuggen" gehen!

    Dann sollte das Programm laufen.

    Tut es bei mir aber nicht.
    Bei mir geht so ein Fenster auf:

    Ausführbare Datei für Debugsitzung:
    Geben Sie den Namen der ausführbaren Datei an, die für die Debugsitzung
    verwendet werden soll.

    Was will er denn da von mir?

    Wer kann mir mal helfen?

    Danke im Voraus!

    Gruß,

    Micha



  • schätze, der typ des projekts ist falsch eingestellt. vielleicht ne dll oder lib?
    mach's nochmal und achte jetzt drauf, daß du ein Konsole-Projekt machst. vielleicht heißt es auch Konsole32 oder so.



  • Hallo Volkard,

    das war es! Danke! Hatte nicht den richtigen Projekttyp ausgewählt!

    Aber mal 'ne Frage so für mich als Ausblick:

    Kann man mit diesem Programm (VC++ Express Edition) genauso einfach Formulare entwerfen, wie z.B. in Delphi 7 oder Visual Basic? Ich meine die Vorgehensweise der per Baukasten aufgebauten Formulare mit allen Buttons, Ausgabefeldern sowie Ereignisprozeduren und kann man die Eigenschaften der Objekte in Eigenschaftenfenster komfortabel definieren?



  • Ich glaube die kostenlose Express-Edition hat keinen Resourceneditor. Die richtigen Editionen haben allerdings einen ziemlich guten.



  • Hallo dEUs,

    ich habe jetzt schon die Toolbox gefunden! Man kann also per Maus seine Steuerelemente definieren (Es ist sehr komplex, sehr viele Eigenschaftsfelder!!)

    Aber nun habe ich mir mal gewagt, etwas einzutippen! Ging natürlich gleich in die Hose!

    Habe also ein Formular aufgezogen mit einem Button "Drück mich" und einem Label "noch nicht gedrückt"
    Ich wollte nun eine Ereignisprozedur zum Button schreiben:
    Label1.text=L"gedrückt";

    Warum da jetzt ein L hinter dem = steht? Keine Ahnung! Das habe ich einfach abgeguckt von dem Code, welches das Programm selbst erzeugt hat, als ich das Label mit der Toolbox aufgezogen hatte.

    Aber das Zuweisen hat nicht geklappt!

    Wo liegt der Fehler? Es kommt der folgende Text beim Compilieren:

    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 C2228: Links von ".Text" muss sich eine Klasse/Struktur/Union 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 ==========



  • Du benötigst natürlich noch eine Variable mit dem Namen "Label1", damit das funktioniert - der Klassen-Assistent sollte auch die Möglichkeit bieten, ein Dialog-Element (z.B. das Label "noch nicht gedrückt") mit einer Variable (Label1) zu verknüpfen.

    (PS: Das L steht übrigens für ein UNICODE-Literal (Long char = wchar_t))



  • 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



  • Warum benötige ich ein Variable?
    Ich will doch nur in dem Objekt "Label1" der Eigenschaft "Text" den Inhalt "gedrückt" zuweisen.
    Dazu brauch ich doch noch keine Variable. Irgendwo im RAM-Nirvana muß doch der Speicherplatz für den Inhalt dieser Eigenschaft schon vorhanden sein und ich will einfach dort einen Wert eintragen!??



  • 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.


Log in to reply