Autor Beitrag
WerderJung
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 28.02.10 15:04 
Hallo,

wir machen gerde in der Schule einen Taschenrechner mit WinForms. Nun da wir es erst mit C# angefangen haben und ich mich jetzt ein bisschen "eingelesen" hab folgendes:

Das "Layout ist eigentlich wie das im WIndows Taschenrechner und er muss nur die Rechnungsart plus und minus können.

Was ich bissher geschafft habe, dass es mir die Zahlen oben in der textbox eingibt wenn ich draufdrücke.. Das habe ich so gemacht:

textBox1.Text += 1.ToString();

dazu ist zu sagen, dass das ToString vom Professor !sehr! empfohlen wurde (warum auch immer) .. und das += habe ich damit ich auch Zahlen über 9 schreiben kann (hoffe das stimmt so)

Was eigentlich heißt ich kann jetzt gerade mal die erste Zahl eingeben. Sonst kann das Prog noch nichts. Jetzt zu meinen Problemen:

Ich hab ja nur eine textbox --> ich muss aber zwei zahlen eingeben (dazwischen das plus klicken) und dann sollte mit = das ergebnis kommen. Ich weiß nicht ob mein Gedankengang stimmt.. aber ich würde die Zahl1 dann wenn ich aufs plus klicke abspeichern (wo auch immer), die textbox löschen und dann kann ich die nächste Zahl2 eingeben. Nur klick ich halt jetzt auf 1 und zwei also zwölf aber speichert der dann das auch als 12 ab? muss ich da was umwandeln?

Lieg hier irgendwie richtig oder gehe ich einen komplett falschen weg?

Lg Rainer
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 28.02.10 16:17 
Hallo und :welcome:

ich würde es anders angehen, nämlich mit zwei Eingabefeldern. Aber dein/euer Konzept ist auch machbar.
Zitat:
aber ich würde die Zahl1 dann wenn ich aufs plus klicke abspeichern (wo auch immer), die textbox löschen und dann kann ich die nächste Zahl2 eingeben.

"wo auch immer" sollte eine Variable im Formular sein für die erste Zahl. Sofern ihr nur mit ganzen Zahlen arbeitet, ist es als int-Variable zu deklarieren.

"auf plus klicken" ist doch genau die richtige Antwort. Fast dieselbe Maßnahme passt natürlich auch für "auf minus klicken".

Zum Abspeichern sollte nicht Convert verwendet werden, sondern Parse oder TryParse. Normalerweise empfehle ich immer TryParse; bei deinem Verfahren kann es keine falschen Eingaben wie "ab23,4c" geben. Also:
ausblenden C#-Quelltext
1:
int firstNumber = int.Parse(inputBox.Text);					

Ähnlich kannst du eine Variable für das gewählte Rechenzeichen benutzen:
ausblenden C#-Quelltext
1:
char calculator;					

Dann geht es so auf einen Schlag:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void Calculators_Click(object sender, EventArgs e) {
   calculator = (sender as Button).Text[0];
   firstNumber = int.Parse(inputBox.Text);
   inputBox.Text = String.Empty;
}

ToString kann sinnvoll sein, muss es aber nicht. Genauso wie ich Calculators_Click als einheitlichen EventHandler für Plus und Minus genommen habe, kann man Numbers_Click für alle Ziffern verwenden; dann kann man natürlich nicht mit ToString arbeiten.

Ich glaube, ich habe jetzt schon mehr geschrieben, als für dich nötig/sinnvoll ist. Gruß Jürgen
WerderJung Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 28.02.10 16:59 
hallo thomas! danke erstmal natürlich :)

Zitat:
ich würde es anders angehen, nämlich mit zwei Eingabefeldern. Aber dein/euer Konzept ist auch machbar.

das geht leider nicht, weil der win TR auch nur eine textbox hat (zumidnest bei mir) und wir sollen es halt so machen ;)

Zitat:

"wo auch immer" sollte eine Variable im Formular sein für die erste Zahl. Sofern ihr nur mit ganzen Zahlen arbeitet, ist es als int-Variable zu deklarieren.
"auf plus klicken" ist doch genau die richtige Antwort. Fast dieselbe Maßnahme passt natürlich auch für "auf minus klicken".


also ich habs jetzt die Zahl1 in int abgespeichert, ich hab das wahrlich viel zu kompliziert denke es folgend nicht funktionieren kann... sprich ich hab bei private void button1_Click
ausblenden C#-Quelltext
1:
2:
textBox1.Text += 1.ToString();
zahl1 = textbox1.Text


nunja jetzt speichert es halt nach jeden buttonklick die Zahl ab sprich ich klick auf 384 und es speichert 384 ab, da ich das zahl1 = textbox1.Text bei jedem Zahlenbutton drinnen habe --> wo speichert es zahl 2 hin ^^

also hab ich mir überlegt es in eine if else reinzugeben und zwar wie folgt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if (i == 0// i ist halt eine variable die ich erzeugt habe
{
textBox1.Text += 1.ToString;
zahl1 = textBox1.Text;
}
else
{
textBox1.Text += 1.ToString;
zahl2 = textBox1.Text;
}


so und bei private void btn_plus_Click hab ich dann eben i++ reingeschrieben, dass er dann halt in die else schleife reinspringt. Es funktioniert auch aber eben nur mit plus.

Weiters Frage ich mich was im "plus" Button genau drinstehen soll.. bei mir steht eben nur das i++ und textBox1.Text = "" .. dass das Feld für die zweite Zahl halt wieder leer ist ;) oO mehr hab ich da nicht, weil ich ja die zweite zahl nicht weiß..

So jetzt zum =..
Das hab ich halt so gemacht (hab es beim googlen gefunden): cast = Convert.ToInt32(zahl1) + Convert.ToInt32(zahl2). Dann kann ich aber nicht schreiben textbox1.text = cast.. das geht nicht.. auch kann ich nicht schreiben MessageBox.Show(cast).. was aber geht ist MessageBox.Show(""+cast) .. weiß der Teufel warum aber ich muss es sowieso in die textbox hineinbringen. Weil wenn textbox1.Text = zahl1+zahl2 eingebe also zB 12 + 1 eingebe ist das ergebnis 121 :(

Nun das weitere Problem ist ich hab da eben beim = button nur das plus also was mach ich bei minus? sprich wenn er den button plus geklickt hat dann plus rechnen wenn minus dann minus.. aber "wie lese ich es aus" was man angeklickt hat?


Zitat:
Zum Abspeichern sollte nicht Convert verwendet werden, sondern Parse oder TryParse. Normalerweise empfehle ich immer TryParse; bei deinem Verfahren kann es keine falschen Eingaben wie "ab23,4c" geben. Also:
ausblenden C#-Quelltext
1:
int firstNumber = int.Parse(inputBox.Text);					

Ähnlich kannst du eine Variable für das gewählte Rechenzeichen benutzen:
ausblenden C#-Quelltext
1:
char calculator;					

Dann geht es so auf einen Schlag:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void Calculators_Click(object sender, EventArgs e) {
   calculator = (sender as Button).Text[0];
   firstNumber = int.Parse(inputBox.Text);
   inputBox.Text = String.Empty;
}

warum funktioniert leicht Convert nicht.. also bei mir hat es zwar funktioniert aber ich halte mich natürlich an dich und versuche es mit TryParse (was ist da der Unterschied)?
Hui naja man muss auch erst mal "draufkommen" dass es zB auch mit inputBox.Text geht ;)

Danke nochmal natürlich! ;)
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 28.02.10 19:03 
user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
hallo thomas!

So bitte nicht. Ich merke schon, du stammst aus Österreich, und da dreht man sich um. In Deutschland außerhalb Bayerns kommt zuerst der Vorname; also entweder wie in Foren üblich als "Jürgen" oder notfalls als "Herr Thomas". :wink:

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
also ich habs jetzt die Zahl1 in int abgespeichert, ich hab das wahrlich viel zu kompliziert denke es folgend nicht funktionieren kann... sprich ich hab bei private void button1_Click
ausblenden C#-Quelltext
1:
2:
textBox1.Text += 1.ToString();
zahl1 = textbox1.Text

nunja jetzt speichert es halt nach jeden buttonklick die Zahl ab sprich ich klick auf 384 und es speichert 384 ab, da ich das zahl1 = textbox1.Text bei jedem Zahlenbutton drinnen habe

Das halte ich für weniger gut. Du musst die Zahl doch erst am Schluss separat verwenden; also wozu bei jedem Zahlen-Click? Außerdem kann das nicht funktionieren, wenn Zahl1 ein int ist:
ausblenden C#-Quelltext
1:
zahl1 = textbox1.Text					

Da muss doch konvertiert werden! Und das muss wirklich nicht ständig wiederholt werden.
user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
--> wo speichert es zahl 2 hin ^^

Naja, nach "int secondNumber", aber erst am Schluss, wenn das Gleichheitszeichen gedrückt wird.

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
also hab ich mir überlegt es in eine if else reinzugeben ...

Naja, das geht schon, wird aber unterm Strich komplizierter.

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
Es funktioniert auch aber eben nur mit plus.

Benutze denselben EventHandler für Plus/Minus/Mal/Durch. Das geht wie folgt:
1. Doppelclick auf Plus.
2. plusbtn_Click umbenennen in calculators_Click.
3. allgemeinen Inhalt reinschreiben (ähnlich wie in meinem vorigen Code)
4. in die Designer-Ansicht wechseln
5. den Minus-Button auswählen
6. nach Eigenschaften, dann nach Ereignisse gehen (Button mit dem Blitz)
7. unter "Click" die ComboBox öffnen und
8. calculators_Click auswählen
Dann gehört calculators_Click zu beiden Buttons.

Das gleiche Verfahren ist auch meine Empfehlung für Numbers_Click.

Es muss nicht auf diese Weise gemacht werden! Das ist nur mein Vorschlag zur Vereinheitlichung, weil für 10 Ziffern das gleiche Verfahren gilt und für vier Rechenoperationen (oder später noch mehr) ebenso. So eine Vereinheitlichung ist immer besser.

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
So jetzt zum =..

Tut mir leid, was du bisher vorhast, verstehe ich nicht so ganz. Du musst zuerst beide Werte in Zahlen verwandeln: Bei calculators_Click nach zahl1 (aber nicht einfach per String, sondern per int.Parse), bei Gleich-Click nach zahl2.

Abhängig vom vorher registrierten (!) Rechenzeichen - deshalb meine Variable calculator - wird dann gerechnet:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private int calculate()
{
   int result = 0;
   switch(calculator) {
      case '+': result = zahl1 + zahl2; break;
      case '-': result = zahl1 - zahl2; break;
      case '*': result = zahl1 * zahl2; break;
      case '/': result = zahl2 == 0 ? 0 : zahl1 / zahl2; break;
   }
   return result;
}


user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
Nun das weitere Problem ist ich hab da eben beim = button nur das plus also was mach ich bei minus? sprich wenn er den button plus geklickt hat dann plus rechnen wenn minus dann minus.. aber "wie lese ich es aus" was man angeklickt hat?

Das hatte ich doch alles schon geschrieben in Calculators_Click().

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
warum funktioniert leicht Convert nicht.. also bei mir hat es zwar funktioniert aber ich halte mich natürlich an dich und versuche es mit TryParse (was ist da der Unterschied)?

Das war ein Missverständnis. Convert.ToInt32 und int.Parse machen im Wesentlichen das Gleiche und funktionieren gleich. Die Methoden der Convert-Klasse passen aber in vielen Fällen nicht; deshalb versuche ich sie zu vermeiden, und das ist auch meine Standardempfehlung. (Wenn die InputBox von Hand gefüllt werden dürfte mit einem solch schwachsinnigen Inhalt wie "ab23,4c", dann dürfte nur TryParse benutzt werden. Hinweise dazu stehen wie immer in SDK-Doku/MSDN/Hilfe.)

Gruß Jürgen
WerderJung Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 01.03.10 17:04 
Vielen dank Jürgen.

Hab es vollbracht, danke danke. Aber eine Frage hätte ich noch und zwar:

calculator = (sender as Button).Text[0];

was ist damit genau gemeint? also es wird hineingespeichert welchen Button ich drücke oder? aber was heißt das Text[0]? Steht dann 0 für + 1 für - 2 für * oder wie? Und muss man sender as Button schreiben?

Das mit den EventHandler ist echt eine feine Sache. Ist dann eigentlich für +-*/ dasselbe nur eben statt 4x nur 1x geschrieben? ;) aber da muss man als Anfänger erst mal draufkommen :D

Naja der Lehrer hat oft gesagt Übung macht den Meister ;)

Danke, Lg
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 01.03.10 17:39 
user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
Das mit den EventHandler ist echt eine feine Sache. Ist dann eigentlich für +-*/ dasselbe nur eben statt 4x nur 1x geschrieben?

Genau das ist der große Vorteil. Alles, was wiederholt in fast gleicher Weise vorkommt, sollte zusammengefasst werden.

user profile iconWerderJung hat folgendes geschrieben Zum zitierten Posting springen:
calculator = (sender as Button).Text[0];
was ist damit genau gemeint?

Jeder EventHandler bekommt durch den Parameter sender mitgeteilt, wer das Ereignis ausgelöst hat. Das ist zunächst einmal ein Ding vom Typ object; .NET steuert das (vor allem bei Click) einheitlich. Die Unterscheidung, was für ein Ding es konkret ist, kommt im nächsten Schritt. (Schließlich ist alles von object abgeleitet.)

Wir wissen, dass es sich bei diesen Clicks immer um einen Button handelt. Also können wir dieses Ding auch als Button benutzen. Die Sicherheitsvariante, wenn sender auch einmal etwas anderes sein sollte als ein Button, geht dann so:
ausblenden C#-Quelltext
1:
2:
3:
4:
Button btn = sender as Button;
if (btn != null) {
  // usw.
}

Ein Button hat die Text-Eigenschaft, also können wir jetzt darauf zugreifen:
ausblenden C#-Quelltext
1:
  string content = btn.Text;					

Ein String enthält Chars und kann per Index direkt auf ein einzelnes zugreifen; Array-Indizes werden immer von 0 an gezählt. Also bekommen wir damit das erste Zeichen:
ausblenden C#-Quelltext
1:
  char c = content.Chars[0];					

Bei einem String gibt es auch die kürzere Schreibweise:
ausblenden C#-Quelltext
1:
  char c = content[0];					

Und wenn man jetzt alles, was ich Schritt für Schritt erklärt habe, in eine Zeile zusammenzieht, bekommt man die o.g. Lösung.

Ich freue mich, dass ich dich mit meinen langen Erläuterungen nicht nur verwirrt habe, sondern zu einer vernünftigen Lösung gebracht habe. Weiter so! Jürgen
WerderJung Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 01.03.10 19:03 
Danke Jürgen ;)