const String^ in eigenem Namespace ?
-
Hallo,
ich bin noch immer am alles mögliche ausprobieren.
Nun hab ich gerade mal versucht einen eigenen Namespace anzulegen, nur zum TESTEN !!Also hingegangen und ein neues WinForm Projekt erstellt.
Ganz untern in der *.h Datei endet ja der Namespace nach der letzten Klammer.
Dahinter einfach mal nen neuen NS angelegt :. . . 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 ??? testfunc(); } }; // Class } // NS namespace Konstants { System::String^ Konstant = L"String^"; }
So, leiger geht das so nicht. Ich bekomme einen Fehler :
Fehler 1 error C3145: "Konstant": Eine globale oder statische Variable darf nicht den verwalteten Typ "System::String ^" aufweisen. e:\eigene dateien\visual studio 2005\projects\projects c++\winformprojekt\winformprojekt\Form1.h 123
Hmm, was kann man da machen ... oder wie macht man das ... oder was hab ich falsch gemacht ? Ist das mit dem neunen Namespace richtig ?
Wo legt man eigentlich ( im Namespace der Anwendung ) Konstanten an auf die man dann aus anderen Dateien zugreifen kann ?
Ich bin noch nicht so ganz durch die Dateistrucktur durchgestiegen.-> http://www.c-plusplus.net/forum/viewtopic-var-t-is-160646.html
Danke
Matthias
-
Du kannst (manged) Dinge in .NET nur innerhalb von Klassen/value-types anlegen, sonst ist es nicht CLR konform.
Also z.B.
using namespace System; namespace Foo { public ref class Bar { public: static const String ^Str1 = "Hello world"; // oder "schöner": static property String^ Str2 { String^ get() { return "Hello world"; } } }; }
-
Hallo,
danke Dir für die Antwort, aber ich glaube ich hab Dir noch nicht gesagt das ich noch Anfänger bin und zwar "blutige". Also brauche ich eine etwas genauere Ausführung.
Ich hab aber folgendes probiert ( wohlegemerkt das ist alles nur probieren, die Möglichkeiten kennen lernen !! )
Ach so ... ich finde das aber ganz schön umständlich !!
in der Form1.h:
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 ??? testfunc(); } . . . namespace NSKonstants { public ref class CKonstants { public: static const System::String^ Konstant = L"String^"; }; // Class }
in der WinFormProjekt.cpp:
#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; } void Form1::testfunc() { using namespace NSKonstants; this->textBox1->Text = CKonstants::Konstant; // ich glaub hier ist der Fehler !! ?? }
Ich bekomm da einen Fehler:
Fehler 1 error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)': Konvertierung des Parameters 1 von 'const System::String' in 'System::String ^' nicht möglich e:\Eigene Dateien\Visual Studio 2005\Projects\Projects C++\WinFormProjekt\WinFormProjekt\WinFormProjekt.cpp 24
... asu dem ich ( wiedermal, wie fast immer weil sehr aussagekräftig !! ?? ) nicht schlau werde .
Kannst Du mir nochmal weiterhelfen ?
Matthias
-
Die Meldung ist doch eindeutig:
Du kannst const System::String nicht in System::String^ konvertieren.
Du hast also eine konstante Zeichenkette vom Typ System::String aber das Ziel erwartet einen Zeiger auf eine Zeichenkette vom Typ System::String.
-
Wie schon in einem anderen Thread erwähnt: Du solltest es mit einem static property machen, das ist CLR Konform...
ref class CKonstants { public: static property String^ Konstant { String^ get() { return "String"; } } };
this->button1->Text = CKonstants::Konstant;
PS: Das "using namespace NSKonstants;" kannst Du Dir auch in der Methode sparen... schreib einfach
NSKonstants::CKonstants::Konstant
PPS: Das "L" vor dem Strings brauchst Du nur für native C/C++!!! für Zuweisungen zu C++/CLI-Strings kannst Du es weglassen, da der Compiler es da schon richtig umsetzt (im gegenteil zu VC2002/3, wo es eine Konvertierung gab, wenn man "S" nicht angegeben hat...)