try except

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
snoopy219
Beiträge: 11
Registriert: So 28. Okt 2012, 12:20

try except

Beitrag von snoopy219 »

Hey Leute!
Ich schreibe gerade meine Belegarbeit. Ich werde ein Matheprogramm programmieren.

Code: Alles auswählen

procedure TfmAddition.btnCheckClick(Sender: TObject);
var summe:integer;
begin
  summe:=StrToInt(summand1.Caption)+StrToInt(summand2.Caption);
 for x:=0 to 2 do begin
     if summe = StrToInt(edSumme.Text) then begin
    summand1.Caption:=IntToStr(1+random(100));
    summand2.Caption:=IntToStr(1+random(100)); end   else
    try
      edSumme.Text:='';
      ShowMessage('Falsche Antwort! Bitte probieren Sie es noch einmal.');
      except
       exit;
    end;
  end;
 end;   

Das ist mein Quelltext, bei dem ich nicht weiter komme. Ich habe zuvor schon Zufallszahlen erzeugt (summand1 und summand2), die Summe der beiden soll jetzt mit der vom Spieler eingegebenen Antwort verglichen werden. Wenn es falsch ist, soll eine ShowMessage angezeigt werden...aber wenn die angezeigt wird, dann wird die solange angezeigt, bis die Schleife nicht zu Ende ist. Irgendwie muss ich das Editfeld leeren, aber wie?

Hat jemand die Lösung zu meinem Problem? Ich komme mit der Try Except nicht ganz klar..

Danke schon mal im Vorraus!
Zuletzt geändert von Lori am Do 19. Feb 2015, 19:05, insgesamt 1-mal geändert.
Grund: Highlighter

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: try except

Beitrag von baumina »

Als erstes machen wir das mal lesbar:

Code: Alles auswählen

 
procedure TfmAddition.btnCheckClick(Sender: TObject);
var 
  summe:integer;
 
begin
  summe:=StrToInt(summand1.Caption)+StrToInt(summand2.Caption);
  for x:=0 to 2 do 
  begin
    if summe = StrToInt(edSumme.Text) then 
    begin
      summand1.Caption:=IntToStr(1+random(100));
      summand2.Caption:=IntToStr(1+random(100)); 
    end else
    begin
      try
        edSumme.Text:='';
        ShowMessage('Falsche Antwort! Bitte probieren Sie es noch einmal.');
      except
        exit;
      end;
    end;
  end;
end; 
 
.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: try except

Beitrag von baumina »

Als zweites überlegen wir mal was eine Exception auslösen könnte:

Eigentlich nur : StrToInt : Das bringt eine Exception, wenn sich der String nicht in eine Zahl umwandeln lässt (weil z.B. Buchstaben drin stehen)

Alles andere kann keine Exception auslösen. Also muss das Exception-Handling wo anders hin.


Drittens muss man mal über die Schleife nachdenken.
.

snoopy219
Beiträge: 11
Registriert: So 28. Okt 2012, 12:20

Re: try except

Beitrag von snoopy219 »

dass es woanders hin soll, habe ich mir auch schon überlegt, aber ich weiß nicht wohin..

und das mit der Schleife könnte ich mal erklären: Ich möchte, dass man zB 10 Aufgaben dieser Art lösen soll und dann wird der Highscore angezeigt..ist die Schleife jetzt etwa falsch?

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: try except

Beitrag von Socke »

snoopy219 hat geschrieben:Wenn es falsch ist, soll eine ShowMessage angezeigt werden...aber wenn die angezeigt wird, dann wird die solange angezeigt, bis die Schleife nicht zu Ende ist.
Bitte überdenke diesen Satz noch einmal ...

Zu deinem Code:
  • Die bei einem ShowMessage(); wird das Programm erst fortgesetzt, wenn der Dialog geschlossen wird. Hiermit ist es nicht möglich, eine Meldung anzuzeigen, die nach Ende der Schleife geschlossen wird (sollte das deine Idee sein).
  • Während der Schleife hat der Benutzer keine Möglichkeit die Edit-Felder zu bearbeiten. Das ist erst wieder möglich, wenn die Methode verlassen wird.
  • Der Befehl exit im except-Block wird (wahrscheinlich) nie aufgerufen, weil im Try-Block keine Exception auftritt, d.h. die Zuweiseung von '' an edSumme.Text und der Aufruf von ShowMessage() werden wohl immer korrekt funktionieren. Vielleicht solltest du ein StrToInt() in den Excpet-Block verschieben um ungültige Eingaben (Buchstaben, "Nicht-Zahlen") abzufangen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: try except

Beitrag von baumina »

Ich schreib mal dahinter was du da machst:

Code: Alles auswählen

 
procedure TfmAddition.btnCheckClick(Sender: TObject);     // ein Button wird gedrückt
var 
  summe:integer;
 
begin
  summe:=StrToInt(summand1.Caption)+StrToInt(summand2.Caption);   // eine Summe wird anhand zweier Captions berechnet
  for x:=0 to 2 do 
  begin    // nun durchlaufen wir eine Schleife 3 mal
    if summe = StrToInt(edSumme.Text) then 
    begin  // wenn die Summe, die vor der Schleife  berechnet wurde dem Eingabefeld entspricht, werden die Captions verändert 
      summand1.Caption:=IntToStr(1+random(100));
      summand2.Caption:=IntToStr(1+random(100)); 
    end else
    begin // wenn die Summe nicht übereinstimmt, wird der Text leer gemacht und es kommt eine Fehlermeldung
      try
        edSumme.Text:='';
        ShowMessage('Falsche Antwort! Bitte probieren Sie es noch einmal.');
      except
        exit;
      end;
    end;
  end;
end; 
 
Fazit : Der Benutzer hat gar keine Chance innerhalb der Schleife irgendetwas einzugeben. Die Summe wird vor der Schleife berechnet und nie verändert.
.

snoopy219
Beiträge: 11
Registriert: So 28. Okt 2012, 12:20

Re: try except

Beitrag von snoopy219 »

es hat klick gemacht!

snoopy219
Beiträge: 11
Registriert: So 28. Okt 2012, 12:20

Re: try except

Beitrag von snoopy219 »

aber wie kann man es dann machen, dass nach einer gewissen Anzahl von Klicks auf den Button die Übung zu Ende ist?

snoopy219
Beiträge: 11
Registriert: So 28. Okt 2012, 12:20

Re: try except

Beitrag von snoopy219 »

Ich habe eine Lösung!
Trotzdem danke für mein anderes Problem :)

Antworten