Nero1 schrieb:
Das "Problem", was ich nur, an deinem so unglaublich kurz gefassten Code dass ich mir schon wieder doof vorkomme^^,
Das ist doch Blödsinn. Der Code ist ja auch gar nicht kurz gefasst. Das einzige was ich gemacht habe, den Code aus dem Timer-TickEventHandler zu entfernen und ihn zu den Buttons zu schieben.
Deine TextBox war ja von vornherein readonly, d.h. Eingaben konnten während der Timer aktiv ist, nicht verändert werden. Da macht es dann auch keinen Sinn ständig das Intervall zu setzen oder zu prüfen, ob man die Eingabe grade parsen kann.
All das passt wunderbar in die Logik für den Start-Button.
Nero1 schrieb:
sehe ist, dass die Progressbar im Gegensatz zu meinem Code verzögert ist und nicht gleichzeitig mit der Ausgabe der Zeit läuft. Wenn du da noch ne Lösung für hättest würde ich niederknien
Ist mir nichtmals aufgefallen. Ich schau's mir gleich nochmal an.
Nero1 schrieb:
Und ein paar Fragen:
Code:
private void Reset( bool resetProgress )
{
myTimer.Stop();
textboxEingabe.ReadOnly = false;
btnStart.Text = "START";
// Bestimmt, ob auch der Inhalt der TextBox und die Progressbar
// zurückgesetzt werden sollen.
if ( resetProgress )
{
textboxEingabe.Text = "[Bitte Zahl eingeben]";
progressBar.Value = 0;
Wie wirkt da die if (resetProgress) bzw das resetProgress? Heißt das automatisch wenn resetProgress true ist? Aber wie bestimme ich/das Programm den Zustand? Blicke da nich durch. Heißt das im Endeffekt, wenn im Verlaufe des Codes Reset(true) wird, dann tritt das mit Textbox und progressbar ein?
Ja, du kannst diese Methode so aufrufen
Code:
Reset( true );
Reset( false );
Wenn du nun 'true' übergibst, werden der Text der TextBox, sowie der Wert der ProgressBar zurückgesetzt. Bei 'false' bleibt die ProgressBar auf ihrem letzten Wert stehen und der Text der TextBox ist ebenfalls unverändert.
Wenn du mal durch den Code schaust. Wenn du Stop klickst wird 'Reset( true );' aufgerufen.
Im EventHandler für den Timer wird geprüft, ob die Zahl größer 0 ist. Wenn nicht, wird 'Reset( false )' aufgerufen. Daher bleibt die ProgressBar grün und in der TextBox steht eine 0, sobald der Countdown beendet wurde.
Nero1 schrieb:
Code:
bool isNumber = int.TryParse( textboxEingabe.Text, out _number )
wofür steht das out? was macht das genau?
Code:
// Die eingegebene Nummer speichern wir hier.
private int _number;
// Ein Boolean, der bestimmt, ob der Timer pausiert wurde.
private bool _isPaused;
Ok die Frage ist kurz: WIE?
Entweder bin ich blöd oder ich check nicht wie du das da zuweist, bzw die Zustandsabfrage rausbekommst -.-
out. Wahrscheinlich kennst du den Unterschied zwische
Werttypen und
Referenztypen nicht.
Ein 'int' ist ein Werttyp, d.h. wenn du einen 'int' an eine Methode übergibst, dann gibst du dieser Methode nur eine Kopie, aber nicht die eigentliche Variable. Als Beispiel:
Code:
void Swap( int a, int b )
{
Console.Out.WriteLine( "a: {0}", a );
Console.Out.WriteLine( "b: {0}", b );
int temp = a;
a = b;
b = temp;
Console.Out.WriteLine( "a: {0}", a );
Console.Out.WriteLine( "b: {0}", b );
}
void DoSwap()
{
int a = 1;
int b = 2;
Swap( a, b );
Console.Out.WriteLine( "a: {0}", a );
Console.Out.WriteLine( "b: {0}", b );
}
Dein Programm ruft nun die Methode 'DoSwap' auf. In der Ausgabe erscheint dann folgendes:
Code:
// aus Swap( int a, int b)
a: 1
b: 2
a: 2
b: 1
// aus DoSwap()
a: 1
b: 2
Wie man sieht, werden 'a' und 'b' zwar in 'Swap' getauscht, wenn du dir aber den Inhalt der Variablen nach dem Tausch wieder anzeigen lässt, dann haben sie immer noch ihren ursprünglichen Wert.
Bei Referenztypen (aka Verweistypen) ist das anders. Anstatt einer Kopie wird hier "lediglich" ein Verweis auf den Speicherort der Variablen übergeben. Das führt dann dazu, dass sobald du mit der übergebenen Variable arbeitest, änderst du auch das Original.
In C# gibt es nun die Schlüsselwörter 'out' und 'ref'. Im Grunde machen beide das Gleiche, sie behandeln einen Werttypen wie einen Referenztypen. (Der Unterschied zwischen 'ref' und 'out' ist, dass out der Zahl irgendwas zuweisen muss, während 'ref' die Variable auch ignorieren kann).
Nun zu deiner eigentlichen Frage:
Code:
private int _number;
...
bool isNumber = int.TryParse( textboxEingabe.Text, out _number )
Zum einen, das 'TryParse' macht genau das, was du in deinem ursprünglichen Code hattest.
Es prüft, ob der übergebene String überhaupt eine Zahl ist. Wenn ja, wird es diesen einlesen und 'true' zurückgeben, wenn nicht, eben 'false'. Gespeichert wird die Zahl in '_number' und weil '_number' vom Typ 'int' ist und 'int' ein Werttyp ist, muss hier ein 'out' vor ('ref' wäre auch möglich, hat Microsoft so aber nicht implementiert (das 'out' garantiert dir auch, dass _number hinterher irgendeinen Wert (0) hat, selbst wenn Parse fehlschlägt)).
Nero1 schrieb:
Bitte ein paar Erklärungen, ich bin schon echt geflasht, hoffe ich werd auch mal so gut^^
Als "so gut" würde ich mich garantiert nicht beschreiben, sonst wäre mir der Fehler mit der ProgressBar nicht unterlaufen
Wenn du einfach länger Programmierst, wirst du sehen, dass das von alleine kommt - naja, nicht ganz alleine, aber du wirst Fortschritt machen
Nero1 schrieb:
hat aber doch keine Möglichkeit, is doch Readonly=true XD
Das Betrifft auch nur den Fall, wenn der Countdown durchgelaufen ist und du dann die Zahl änderst.