windows forms / redefinierte methoden ausgabe
-
Instance erzeugen
Rechteck rechteck = new Rechteck();
-
in der Form1.h?
weiss nich wo ich das so recht hinschreiben soll..normal hät ich sowas in der main geschrieben aber da
hab eien main in der aufgabe2.cpp gefunden wo auch das Form fenster erzeugt wird.
aber das bringts auch nich
error C2065: 'Rechteck': nichtdeklarierter Bezeichner
-
res0 schrieb:
in der Form1.h?
weiss nich wo ich das so recht hinschreiben soll..normal hät ich sowas in der main geschrieben aber da
hab eien main in der aufgabe2.cpp gefunden wo auch das Form fenster erzeugt wird.
aber das bringts auch nich
error C2065: 'Rechteck': nichtdeklarierter Bezeichner
Entweder du machst es global (am einfachsten, aber auch am unschönsten), du kannst die Klassen aber auch static machen, oder du übergibst das Objekt an die Funktion wo du das ausgeben lässt.
-
global wäre doch wenn ich in der aufgabe2.cpp
folgendes schreib:
[cpp]
// aufgabe2.cpp: Hauptprojektdatei.#include "stdafx.h"
#include "Form1.h"//Meine Klassen
#include "Geometrische_Figur.h" //Basisklasse
#include "Rechteck.h"; //Abgeleitete Klasse
#include "Kreis.h"; //Abgeleitete Klasseusing namespace aufgabe2;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
Rechteck test; // kreaiere ein object namens test
//label1->Text = test->BerechneFlaeche().ToString();
//test->Rechteck::BerechneFlaeche().ToString();// 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;
}[/cpp]
-
Das was du hier gepostet hast ist aber kein C# das weisst du oder?
-
schaut mal:
// aufgabe2.cpp: Hauptprojektdatei. #include "stdafx.h" #include "Form1.h" //Meine Klassen #include "Geometrische_Figur.h" //Basisklasse #include "Rechteck.h"; //Abgeleitete Klasse #include "Kreis.h"; //Abgeleitete Klasse using namespace aufgabe2; [STAThreadAttribute] int main(array<System::String ^> ^args) { Rechteck test; Form1 form; float flaeche = 0; test.Rechteck::BerechneFlaeche(); form.Text=test.BerechneFlaeche().ToString(flaeche); // 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; }
ihr seht ja was nach dem main { kommt..bis zum ersten kommentar..das is was ich mr so gedacht habe, allerdings versteh ich eins nicht:
error C2664: 'System::String ^System::Single::ToString(System::IFormatProvider ^)': Konvertierung des Parameters 1 von 'float' in 'System::IFormatProvider ^' nicht möglich
-
ja ich weiss.
nur hab kein anderes forum gefunden wo was mit .NET stand
-
Momomomo... Weisst Du was Deine Befehle da machen? Ich glaub wir gehen das mal kurz durch
Rechteck test;
Erstellt ein Rechteck, dessen Name ist test (OK)
float flaeche = 0;
Erstellt eine Kommavariable, mit dem Namen flaeche und dem initialen Wert 0 (auch OK)
test.Rechteck::BerechneFlaeche();
Rufe Rechteck::BerechneFlaeche auf dem Rechteck namens test auf (auch OK, geht aber kürzer: test.BerechneFlaeche() )
form.Text=test.BerechneFlaeche().ToString(flaeche);
Erstmal die Hälfte rechts vom Zuweisungsoperator:
Rufe auf das Ergebnis der Methode BerechneFlaeche auf dem Rechteck namens test die Methode ToString auf und übergebe ihr die Kommazahl flaeche (die immernoch 0 ist).
So und dieses ToString, welches eine Kommazahl als Parameter erwartet, gibt es nicht. Was Du willst ist test.BerechneFlaeche().ToString();
Dieses wird form.Text zugewiesen.Alles in allem sieht der Block dann so aus:
Rechteck test; Form1 form; float flaeche = 0; test.BerechneFlaeche(); form.Text=test.BerechneFlaeche().ToString();
Was uns noch zu dem Schluss bringt (bringen könnte), dass der erste Aufruf BerechneFlaeche() sinnlos ist, weil das Ergebnis ungenutzt bleibt. Ausserdem brauchen wir float flaeche garnicht.
-
hi.
okay ich hab das soweit verstandne und übernommen.
Rechteck test; Form1 form; float flaeche = 0; flaeche = test.BerechneFlaeche(); /* kann ich das nicht flaeche zuweisen und dann würde doch ToString(flaeche) einen sinn ergeben oder? weil bei flaeche kommt ja ne gleitkommazahl heraus.*/ form.Text=test.BerechneFlaeche().ToString();
das compilieren geht soweit..aber ein echt seltsames fenster kommt da
http://img496.imageshack.us/img496/3837/unbenannt6ki.jpg
-
Da in .NET alles ein Objekt ist müsste es auch bei einer float Variable tatsächlich flaeche.ToString() statt ToString(flaeche) heissen...
Der Fehler kommt weil Du form.Text zu früh benutzt... In der letzten Zeile von main wird auch Form1 nochmal neu erzeugt, also geht Dein Text garnicht in das Formular was später angezeigt wird.
Du solltest den Code in einer Methode innerhalb der Form schreiben, z.B. Form_Load (Doppelklick ins Formular im Designer erzeugt eine solche (hoffentlich auch in C++)) oder bei einem Button-Click etc...
-
hab das so gelöst das ich den code einfach unter
Application::Run(gcnew Form1());
geschrieben hab.
sooo und wenn ich die Form grafisch vor mir habe und nen doppelklick auf das label1 mache, dann bin ich ja im code des label1.
aber wie greif ich nu mit label1->Test=??? auf das zu was ich ausgelesen haben in der aufgabe2.cpp?
danke!!!
-
hmm keiner ne idee?