Zum Inhalt springen

Windows Form Applikation


Empfohlene Beiträge

Geschrieben (bearbeitet)

private: System::Void button1_Click_1(System::Object *  sender, System::EventArgs *  e)

		 {


//System::IO::StreamReader  *in;

string line;

string input;

ifstream in;

std::map<string,int> StrMap;



	this->label2->Text="Option 1: Select one file";

	//OpenFileDialog1->ShowDialog();

	 if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

	{

	      //in = new System::IO::StreamReader(OpenFileDialog1->FileName);

	      std::string input = OpenFileDialog1.FileName.ToString();

	      std::ifstream in(input.c_str(), ios::in);

                    //std::ifstream in((OpenFileDialog1->OpenFile()), ios::in);

                    //MessageBox::Show(sr->ReadToEnd());

                   //textBox1->Text = openFileDialog1->FileName; 

                   //textBox1->Text = in->ReadToEnd(); 



	       //	in->Close();



	}

Hat jmd. eine Idee wo der Fehler liegt?

Fehlermeldung:

error C2228: left of '.FileName' must have class/struct/union type

type is 'System::Windows::Forms::OpenFileDialog __gc *'

did you intend to use '->' instead?

Bearbeitet von Klotzkopp
Geschrieben (bearbeitet)

OpenFileDialog1->FileName

Ich habe deinen Thread ins .NET-Forum verschoben, weil das kein C++ ist, sondern C++/CLI. Das ist trotz des ähnlichen Namens eine andere Sprache.

Und ein ernst gemeinter Rat: Wenn du GUI mit Windows Forms machen willst, nimm besser C#.

Siehe auch: Jochen Kalmbach

Code Tags vergessen!

Sorry.

Statt dich zu entschuldigen, kannst du sie auch einfach noch einfügen. Du kannst deine Beiträge 15 Minuten lang editieren. Bearbeitet von Klotzkopp
Geschrieben

Okay allerdings taucht eine erneute Fehlermeldung auf, wenn ich die Zeile wie oben beschrieben verändere.

Fehlermeldung:


c:\Program Files\Microsoft Visual Studio .NET 2003\Visual Studio Projects\wfa_test\Form1.h(279) : error C2440: 'initializing' : cannot convert from 'System::String __gc *' to 'std::basic_string<_Elem,_Traits,_Ax>'

        with

        [

            _Elem=char,

            _Traits=std::char_traits<char>,

            _Ax=std::allocator<char>

        ]

        No constructor could take the source type, or constructor overload resolution was ambiguous

Geschrieben (bearbeitet)

http://support.microsoft.com/kb/311259

Du mischst die Klassen der C++-Standardbibliothek mit den .NET-Klassen. Die können nicht miteinander.

Mach dir klar, was der Unterschied zwischen System::String und std::string ist.

Nochmal mein Rat: Benutz C#, oder benutz zumindest konsequent die .NET-Klassen. Mit diesem Mischmasch begibst du dich auf einen sehr steinigen Pfad.

Bearbeitet von Klotzkopp
Geschrieben
irgendwie funktioniert das nicht...
Das ist keine ausreichende Fehlerbeschreibung. Zeig deinen Code und die Fehlermeldung.

wie hieße denn die syntax korrekterweise?
So, wie sie auf der verlinkten Seite steht.

verzweifel schon wieder...:/
Wer nicht hören will...

Ich schreibe hier mehrfach, dass dein Ansatz, Standard-C++ mit C++.NET und Windows Forms zu mischen, keine gute Idee ist. Du merkst anscheinend selbst, dass das nicht einfach ist. Trotzdem machst du offenbar unbeirrbar damit weiter. Da bleibt mir nur, dir zu wünschen, dass du mit deinen selbstauferlegten Schwierigkeiten glücklich wirst.

Geschrieben

Das problem ist, dass ich es nicht beeinflussen kann. Mir wurde WFA vom Lehrpersonal vorgegeben.


private: System::Void button1_Click_1(System::Object *  sender, System::EventArgs *  e)

		 {


//System::IO::StreamReader  *in;

string line;

string input;

ifstream in;

std::map<string,int> StrMap;



			this->label2->Text="Option 1: Select one file";

			//OpenFileDialog1->ShowDialog();

		   if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

			{



System::String * input = OpenFileDialog1->FileName;

const __wchar_t __pin * FileName = PtrToStringChars(input);





				//in = new System::IO::StreamReader(OpenFileDialog1->FileName);

				//System::String *input = OpenFileDialog1->FileName;

				std::ifstream in(input);

//std::ifstream in((OpenFileDialog1->OpenFile()), ios::in);

//textBox1->Text = in->ReadToEnd(); 



						//	in->Close();



			}


Fehlermeldung:

c:\Program Files\Microsoft Visual Studio .NET 2003\Visual Studio Projects\wfa_test\Form1.h(294) : error C2664: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const char *,std::_Iosb<_Dummy>::openmode,int)' : cannot convert parameter 1 from 'System::String __gc *' to 'const char *'

with

[

_Elem=char,

_Traits=std::char_traits<char>,

_Dummy=int

]

Cannot convert a managed type to an unmanaged type

Geschrieben
Das problem ist, dass ich es nicht beeinflussen kann. Mir wurde WFA vom Lehrpersonal vorgegeben.
Wurde dir auch C++.NET vorgegeben?

Falls nicht, benutz C#.

Falls doch: Wurde dir vorgegeben, dass du C++.NET mit Standard-C++ mischen sollst?

Falls nicht, benutzt die .NET-Klassen, nicht std::map, std::string und std::ifstream.

Falls doch: Dann sehen wir weiter.

Geschrieben

Mir wurde nicht direkt vorgegeben das ich das mischen soll, habe allerdings nur Visual .NEt zur Verfügung gestellt bekommen. Ich habe den Sourcecode für das Tool bereits fertig, nun aber nur noch diese Woche um eine GUI zu erstellen.

Die GUI soll ich über WFA machen.

Geschrieben
habe allerdings nur Visual .NEt zur Verfügung gestellt bekommen.
Welche Version von Visual Studio .NET? 2002 oder 2003?

Ich habe den Sourcecode für das Tool bereits fertig, nun aber nur noch diese Woche um eine GUI zu erstellen.

Die GUI soll ich über WFA machen.

Geht es immer noch um diesen Zeilenzähler-Tool? Das besteht doch zum größten Teil aus Ein- und Ausgabe, die du für ein GUI sowieso umschreiben musst.

Am schnellsten wäre vermutlich, das Tool komplett in C# neu zu schreiben.

Geschrieben

gibt es vorschläge ohne das komplette umschreiben c#?

dafür fehlt mir wohl ein wenig die zeit...

wie bereits erwähnt, möchte ich in einer dialogbox eine datei angeben, die dann über ifstream eingelesen wird und folglich bearbeitet wird.

danke!

Geschrieben
gibt es vorschläge ohne das komplette umschreiben c#?

dafür fehlt mir wohl ein wenig die zeit...

Wie gesagt, ich vermute, neu schreiben geht schneller.

Du brauchst für den ifstream-Konstruktor den Dateinamen in einem char*. PtrToStringChars bringt dir da nicht viel, weil du damit einen wchar_t* bekommst.

Besser ist vermutlich Methode 2 mit Marshal::StringToHGlobalAnsi, da bekommst du gleich den richtigen Typ.

Du musst natürlich dann ifstream auch mit der richtigen Variablen aufrufen. In deinem letzten Beispiel benutzt du immer noch den System::String*.

Geschrieben


if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

			{

				//StreamReader * input = new StreamReader(OpenFileDialog1->FileName);

				String * input = OpenFileDialog1->FileName;

				StreamReader* srFromStream = new StreamReader( File::OpenRead( input ) );


				//MessageBox::Show(sr->ReadToEnd());

				//textBox1->Text = srFromStream->ReadToEnd(); 

				 //textBox1->ScrollBars = ScrollBars::Vertical;


				//in2->Close();


				String* line; 


				while ((line = srFromStream->ReadLine())) 

				{


						//Prüfung ob Zeilen den Anforderungen entspricht	

						if(line->Length > 0 && line->StartsWith( "[" ))			

						{

							// b=line->Contains( "[" );

							//Falls Prüfung zutrifft wird die Zeile im ersten Durchlauf in der map angelegt,

							//bei allen weiteren wird der Zähler erhöht


							++StrMap[*line];

						//	textBox1->Text = line;

						}



				} 


			}

Fehlermeldung:

error C2679: binary '[' : no operator found which takes a right-hand operand of type 'System::String' (or there is no acceptable conversion)

Kann mir jmd helfen, bzgl. der map ohne alles komplett umzuschreiben. Denke ich bin da schonmal auf einen guten Weg. Komme aber nun nicht weiter.

Danke

Geschrieben

Das ist immer noch dasselbe Problem: System::String nach std::string.

Du hast das Problem bei ifstream (C++-Klasse) umgangen, indem du auf StreamReader (.NET-Klasse) umgestiegen bist. Wenn du bei std::map (C++-Klasse) bleiben willst, wirst du trotzdem nicht drumherum kommen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...