Kein Zugriff auf TextBox1->Text



  • Hallo,

    Hab hier ein dummes Problem. Bin vor kurzem von C++ Builder 6 endlich mal auf Visual Studio 2005 umgestiegen. Irgendwie klappt nun mein bisheriges Wissen nicht mehr ... ?!? Beim stöbern in den Foren wurde ich leider nicht fündig.

    Ich habe eine einfache Test-FORM (Form1) mit einer Textbox und einem Button und möchte zunächst nur den Text der Textbox auslesen und in einer MessageBox ausgeben. Geht leider nicht mehr wie bisher. Compiler meldet Fehler:

    -Form1 nicht deklarierter Bezeichner

    Hat da jemand eine Idee für mich??

    Danke im voraus...

    Hier etwas Code:

    //Form1.h
    #include "stdafx.h"
    #pragma once

    namespace test_cpp_20070104 {

    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>
    /// Zusammenfassung für Form1
    ///
    /// 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 Form1 : public System::Windows::Forms::Form
    {
    public:
    Form1(void)
    {
    InitializeComponent();
    //
    //TODO: Konstruktorcode hier hinzufügen.
    //
    }

    public:
    /// <summary>
    /// Verwendete Ressourcen bereinigen.
    /// </summary>
    ~Form1()
    {
    if (components)
    {
    delete components;
    }
    }
    public: System::Windows::Forms::Button^ button1;
    protected:

    public: System::Windows::Forms::TextBox^ textBox1;
    private:
    protected:

    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->textBox1 = (gcnew System::Windows::Forms::TextBox());
    this->SuspendLayout();
    //
    // button1
    //
    this->button1->Location = System::Drawing::Point(1052, 626);
    this->button1->Name = L"button1";
    this->button1->Size = System::Drawing::Size(107, 40);
    this->button1->TabIndex = 0;
    this->button1->Text = L"button1";
    this->button1->UseVisualStyleBackColor = true;
    this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    //
    // textBox1
    //
    this->textBox1->Location = System::Drawing::Point(560, 313);
    this->textBox1->Name = L"textBox1";
    this->textBox1->Size = System::Drawing::Size(199, 20);
    this->textBox1->TabIndex = 1;
    //
    // Form1
    //
    this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->ClientSize = System::Drawing::Size(1361, 729);
    this->Controls->Add(this->textBox1);
    this->Controls->Add(this->button1);
    this->Name = L"Form1";
    this->Text = L"Form1";
    this->ResumeLayout(false);
    this->PerformLayout();

    }
    #pragma endregion
    public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
    {
    Test();
    }
    };
    }

    //function.cpp

    #include "stdafx.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;

    int Test ( void )
    {
    MessageBox::Show(Form1->textBox1->Text);
    return 0;
    }



  • Deklariere Test innerhalb der Form1!

    Auch verwendest Du kein C++ sondern C++/CLI!



  • Jochen Kalmbach schrieb:

    Deklariere Test innerhalb der Form1!

    Auch verwendest Du kein C++ sondern C++/CLI!

    Hast recht! Sorry. Ich hätte aber das "Test()" gerne in einer getrennten cpp. Gibt es dazu nicht eine Möglichkeit? Ich möchte "Funktionen" und die Form möglichst von den Arbeits-Dateien her auftrennen.

    Danke schon mal für die Hilfe...



  • Dann deklariere halt das Test in der Klasse (h-Datei) und implementiere es in der cpp-Datei!!!

    PS: Anfängern rate ich dringend von C++/CLI ab... da es nur verwirrend ist und oft mit "normalem" C++ durcheinander gebracht wird!



  • Jochen Kalmbach schrieb:

    Dann deklariere halt das Test in der Klasse (h-Datei) und implementiere es in der cpp-Datei!!!

    PS: Anfängern rate ich dringend von C++/CLI ab... da es nur verwirrend ist und oft mit "normalem" C++ durcheinander gebracht wird!

    Ok,
    Danke. Wenn ich es aber trotzdem lernen will, wie sollte ich dann am besten vorgehen, um C++/CLI vernünftig zu lernen? Hast du ein paar gute Tipps für mich? Irgendwie muss ich ja anfangen....

    Vielen Dank für die Hilfe



  • Das wichtigeste ist eigentlich erst mal, dass Du C++ kannst. Dann wäre z.B. das Trennen von h- und cpp-Datei schon bekannt gewesen 😉
    Du kannst Dich aber auch natürlich durchbeisen...



  • Jochen Kalmbach schrieb:

    Das wichtigeste ist eigentlich erst mal, dass Du C++ kannst. Dann wäre z.B. das Trennen von h- und cpp-Datei schon bekannt gewesen 😉
    Du kannst Dich aber auch natürlich durchbeisen...

    Sorry,
    Ich glaube da liegt ein Missverständnis vor. Ich konnte im C++ Builder 6 problemlos neue cpp's (inkl. .h) anlegen, andere includieren (z.B. eine Form1.h) und dann problemlos auf eine Textbox in der Form1 zugreifen durch Form1->TextBox1->Text o.ä. Seit ich mit VS2005 arbeite ist das nicht nach bekannten Vorgehensweisen möglich. Egal wieviele cpp und h ich anlege und wie ich diese includiere, mir ist der Zugriff auf die zuvor genannte Form1.h und damit auf die Textbox verweigert. Das VS2005 erkennt den Zugriff an und wirft fehler wie " Form1: nicht deklarierter Bezeichner.."

    Ich hoffe du verstehst wie ich das meine? Das Problem sind nicht einfache includes oder anlegen neuer Workspaces, sondern dass es scheinbar mit C++/CLI bzw Visual Studio 2005 ganz anders funktioniert als mir bisher bekannt.



  • Nein, ich verstehe nicht was Dein Problem ist...
    Wo ist denn bitte in Deinem Code

    //function.cpp 
    
    #include "stdafx.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; 
    
    int Test ( void ) 
    { 
    MessageBox::Show(Form1->textBox1->Text); 
    return 0; 
    }
    

    Ein "#include "Form1.h"" ???
    Woher soll er also Form1 kennen???
    Was soll hier anders Funktionieren als bisher???? Es wäre mir ein Rätsel wenn der C++Builder dies ohne ein include gekonnt hätte... 😕

    Ganz abgesehen davon, dass man *nie* direkt auf Member-Variablen zugreifen sollte (und die deshalb in Windows-Forms auf private sind). Und wenn man schon C++/CLI verwendet, dann macht man dies über properties.



  • Das Problem ist, das Du Dich nicht mit den Grundlagen beschäftigt hast.
    C++ != die IDE macht alles.

    Die Grundlagen bleiben die gleichen, unabhängig davon welchen Compiler Du einsetzt. So wird ein #include public,private etc. z.B. bei jedem C++ Compiler funktionieren.

    //function.cpp 
    
    #include "stdafx.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; 
    
    int Test ( void ) 
    { 
    MessageBox::Show(Form1->textBox1->Text); 
    return 0; 
    }
    

    In dieser Unit ist weder eine Definition noch eine Deklaration von Form1 vorhanden.

    Abgesehen davon sollte man es vermeiden auf Member direkten zugriff zu nehmen. Wenn man das elegant lösen möchte, kann man get und set Methoden verwenden. In C++/CLI wurden hierfür speziell Properties eingeführt.



  • Jochen Kalmbach schrieb:

    Nein, ich verstehe nicht was Dein Problem ist...
    Wo ist denn bitte in Deinem Code

    //function.cpp 
    
    #include "stdafx.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; 
    
    int Test ( void ) 
    { 
    MessageBox::Show(Form1->textBox1->Text); 
    return 0; 
    }
    

    Ein "#include "Form1.h"" ???
    Woher soll er also Form1 kennen???
    Ganz abgesehen davon, dass man *nie* direkt auf Member-Variablen zugreifen sollte (und die deshalb in Windows-Forms auf private sind). Und wenn man schon C++/CLI verwendet, dann macht man dies über properties.

    Ok, Verstehe was du meinst. Meine ganzen includes laufen über die "globale" Includedatei stdafx.h. Dort sind die function.h, Form1.h etc. Durch diese stdafx sind alle nötigen Dateien includiert mit #pragma once. Hätte ich vielleicht vorher dazusagen sollen.

    Letztes mal werd ich dich nerven: Stichwort Eigenschaften:

    Wie würdest also du diese textbox auslesen?

    Vielen Dank...



  • Erst mal dafür sorgen, das deine Funktion überhaupt an eine Instanz von Form1 gelangen kann.

    Danach schau mal in der Onlinehile nach Property, die sind da eigentlich gut erklärt.



  • Oh,

    hab grad gesehen, dass du ja noch editiert hast und noch ein paar Antworten dazu geschrieben hast.

    /*
    Ok, ich verstehe aber so ungefähr auf was du hinaus willst. Trotzdem: Selbst wenn ich mit Get arbeite, wie bekomme ich Zugriff auf die Form1 (sie ist ja includiert in stdafx.h s.o). Ich muss doch so oder so über Form1->... auf die Objekte zugreifen (was ich bisher nicht geschafft habe)oder sehe ich da was falsch?

    */

    ... hab grad noch die letzte gelesen. Danke für die Hilfe.... So wirds dann schon gehen



  • ReiHa schrieb:

    Wie würdest also du diese textbox auslesen?

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


  • Jochen Kalmbach schrieb:

    ReiHa schrieb:

    Wie würdest also du diese textbox auslesen?

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

    Echt Spitze!! Danke dass du dir die Mühe nochmal gemacht hast. Freut mich 🙂
    So kann ich jetzt mal weiterlernen in C++/CLI!

    CU


Anmelden zum Antworten