Verständnis Dateien in Visual Studio 2005
-
Hallo,
eine Frage zum VS 2005. Wenn ich ein neues Forms Pojekt mit .NET funktionalität erstellen will muss ich doch ein "Visual C++ -> CLR -> Windows Forms Anwendung" erstellen.
Nun hab ich in meinem Tutorial vorerst nur mit consolenanwendungen gearbeitet und wollte mal was ausprobieren weil es gerade um Prototypen der functionen geht.
Ich versteh das mit den vielen dateien und hauptsächlich header dateien nicht so ganz.
Wenn ich also z.B. auf meine Form zwei buttons und eine textbox ziehe. Wenn ich auf den einen button clicke will ich mal eine funktion in der art aufrufen das diese nicht in der classe der form vorhanden ist. Mit dem zweiten button mal so das die function in der classe steht.
also einmal void Form1::testfunc() und dann nochmal void testfunc1(), also ohne Form1::
In der ersten müsste textBox1->text = L"test"; funktionieren in der zweiten eigentlich nicht. Ich glaube da müsste es dann Form1::textBox->text = L"Test"; heissen. Nur bei der zweiten version müsste ja auch irgendwo ein Functionsprototype hin oder ? Wo genau müsste der dann hin ?Wie genau mache ich das ?
Danke
Matthias
-
Verstehe Dein Problem nicht ganz...
Wenn Du eine Windows-Forms Form hast, dann erstellt VS alle Methoden in der h-Datei. Somit sind alle Methoden innerhalb der Klasse definiert und die Methodendeklaration braucht kein "Form1::" als vorangestellter prefix.
Du kannst natürlich auch nur die Deklaration in der h-Datei machen und dann in der cpp-Datei die implementierung der Methode. Dann musst Du aber ein "Form1::" voranstellen, damit der Compiler weiss, dass diese Methode zur Klasse "Form1" gehört (da die Implementierung ja nicht innerhalb der Klasse ist, wie es in der h-Datei der Fall ist).
Bzgl. dem Zugriff auf Member-Variablen der Form1-Klasse: Hier kannst Du nur zugreifen, wenn Du Dich scon innerhalb der Form1-Klasse befindest (also in einer Methode der Form1-Klasse); ein "Form1::" wird hier aber *nie* benötigt!
Etwas mit dem Klassennamen kann man *nur* verwenden, wenn es sich um statische Daten handelt; dann ist nämlich keine Instanz der Klasse notwendig, sondern kann direkt angesprochen werden.
Ansonsten kannst Du auch auf alle public/internal Methoden/Properties/Fields von extern zugreifen, wenn Du eine Instanz von "Form1" erstellt hast.
-
Hallo,
Ich hab mich sicher nicht richtig ausgedrückt.
Folegendes :
Eine Form(Form1), darauf 2 Buttons ( button1, button2 ) und eine Textbox ( textBox1
Ich habe ( siehe quelltext ) dem button 1 ein Ereignis onClick zugewiesen welches der textBox1 den Text "Button 1 gedrückt" zuweist.
Das steht in der *.h Datei des Projekts.Nun möchte ich die Funktion des Buttons in die *.cpp auslagern.
Sie soll genau das gleiche machen und einfach der TextBox den Text "Button 2 gedrückt" zuweisen.Wie mache ich das ?
Ich möchte also eine einfache Funktion ( void testfunc() ) in der *.cpp haben in der so etwa folgendes gemacht wird :
void testfunc() { textBox1->text = L"Button 2 gedrückt"; }
Mehr nicht. Es geht nur darum das ich den Zusammenhang zwischen den Dateien noch nicht wirklich verinnerlicht habe.
hier mal die *.h und *.cpp des Projekts:
#pragma once namespace WinFormProjekt { 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. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; protected: private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::Button^ button2; 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->button2 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(32, 27); 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); // // textBox1 // this->textBox1->Location = System::Drawing::Point(32, 70); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(214, 20); this->textBox1->TabIndex = 1; // // button2 // this->button2->Location = System::Drawing::Point(171, 27); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 2; this->button2->Text = L"button2"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(273, 122); this->Controls->Add(this->button2); 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 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { textBox1->Text = L"Button 1 gedrückt"; } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { // Ich möchte hier eine Funktion aufrufen die // dem textBox1 Element den Text "Button 2 gedrückt" zuweist ??? } }; }
und hier die *.cpp
// WinFormProjekt.cpp: Hauptprojektdatei. #include "stdafx.h" #include "Form1.h" using namespace WinFormProjekt; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Hauptfenster erstellen und ausführen Application::Run(gcnew Form1()); return 0; }
Die anderen Dateinen ( AssemblyInfo.cpp,resource.h, stdafx.cpp und stdafx.h brauch ich ja vorerst nicht nicht oder ?
Für was sind die eigentlich gut, aber das vielleicht später ..Erst mal meine Bitte:
Kann vielleicht mal jemand die beiden Dateien einfach so abändern das obiges funktioniert ?
Ich muss das blos einmal sehen wie und warum das geht / nicht geht.Danke
Matthias