Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gewollter Fehler (https://www.delphipraxis.net/164645-gewollter-fehler.html)

Marcel2906 23. Nov 2011 11:21

Delphi-Version: 2010

Gewollter Fehler
 
Ich weiß, der Titel hört sich schon mal Interesannt an :-P

Erstma mein Code:

Delphi-Quellcode:
   Procedure Suchen(x, y: integer);
   Begin
      Save();
      //Suche Feld mit 2 Kandidaten
      If (aSudoku[x, y] > 10) And (aSudoku[x, y] < 100) Then Begin
         z := IntToStr(aSudoku[x, y]);
         aSudoku[x, y] := StrToInt(z[1]);
         Try
            BtEiKdnEtClick(BtEiKdnEt);
            BtSolveClick(BtSolve);          //FEHLER WENN ZAHL DOPPELT!!!!!!
         Except
            aSudoku[x, y] := StrToInt(z[2]);
            BtEiKdnEtClick(BtEiKdnEt);
            BtSolveClick(BtSolve);
         End;
      End;
   End;
Dort wo mein KOmmentar "Fehler wenn zahl doppelt!!!" gibt es in dem BtSolveClick eine weitere funktion die mein Sudoku auf doppelte Zahlen prüft:

Delphi-Quellcode:
Procedure TForm2.BtPruefenClick(Sender: TObject);
Type
   THilfsArray = Array[1..9] Of Integer;
Var
   x, y, xx, yy: Integer;
   HilfsArray: THilfsArray;

   //HilfsArray erstellen
   Procedure HilfsArrayLeeren;
   Var
      i: Integer;
   Begin
      For I := 1 To 9 Do
         HilfsArray[i] := 0;
   End;

   //Wenn eine Zahl doppelt, result = true
   Function ZahlDoppelt: boolean;
   Var
      i: Integer;
   Begin
      For i := 1 To 9 Do Begin
         If HilfsArray[i] > 1 Then Begin
            Result := True;
            Exit; // Ergebnis steht fest
         End;
      End;
      Result := False;
   End;

   //Zahl zum Hilfsarray hinzufügen
   Procedure AddHilfsArray(z: Integer);
   Begin
      If (z > 0) And (z < 10) Then
         inc(HilfsArray[z]);
   End;

Begin
   //Zeile prüfen
   For y := 0 To 8 Do Begin
      HilfsArrayLeeren;
      For x := 0 To 8 Do
         AddHilfsArray(aSudoku[y, x]);
      If ZahlDoppelt Then
         ShowMessage(' Zahl in einer Zeile doppelt');
      break;
   End;
   //Spalte prüfen
   For x := 0 To 8 Do Begin
      HilfsArrayLeeren;
      For y := 0 To 8 Do
         AddHilfsArray(aSudoku[y, x]);
      If ZahlDoppelt Then
         ShowMessage('Zahl in einer Spalte doppelt');
      break;
   End;
   //Felder prüfen
   For xx := 0 To 2 Do
      For yy := 0 To 2 Do Begin
         HilfsArrayLeeren;
         For y := yy * 3 To yy * 3 + 2 Do Begin
            For x := xx * 3 To xx * 3 + 2 Do
               AddHilfsArray(aSudoku[y, x]);
         End;
         If ZahlDoppelt Then
            ShowMessage('Zahl in einem Feld doppelt');
         exit;
      End;
End;
Nun möchte ich, dass wenn ShowMessage(Zahl doppelt) gezeigt wird, es wie ein Fehler behandelt wird. Hab schon versucht selber einen einzubauen ( durch 0 teilen ect.) klappt aber alles nicht.
Ihr werdet bestimmt schimpfen man darf keine Fehler selber erzeugen...aber mir fällt nichts besseres ein :lol:

Doch wie schaff ich es, dass das Try abgebrochen wird wenn eine Zahl doppelt vorkommt?

himitsu 23. Nov 2011 11:24

AW: Gewollter Fehler
 
Ablaufsteuerung über Exceptions ist nunmal nicht die optimale Lösung.

Excetion = Ausnahme
standardmäßiger/vorhersehbarer Programmablauf = Normalfall


Delphi-Quellcode:
raise Exception.Create('wahr wohl nix');

Codewalker 23. Nov 2011 11:26

AW: Gewollter Fehler
 
Alternativ rufst du nach deinem ShowMessage ein
Delphi-Quellcode:
Abort;
auf. Dadurch wird eine stille Exception ausgelöst: Keine Meldung, aber die aktuelle Prozedur wird abgebrochen


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz