Wenn ich es mit der while schleife versuche, habe ich wieder das Problem, dann wenn z.b. Sudoku[0,0] und [0,1] gleich sind er mir 4 mal eine meldung ausspuckt. 2mal das in einer reihe etwas doppelt ist und 2 mal dass im feld eine zahl doppelt ist...
Mit break und exit hab ich schon ein wenig rumprobiert, leider es nicht geschafft, da es ja eine procedure in einer procedure ist.
Mein code sieht so aus:
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, Fehlermeldung
Procedure ZahlDoppelt(WO: String);
Var
i: Integer;
doppelt: boolean;
Begin
// Das alte mit der for Schleife
{ For I := 1 To 9 Do
If HilfsArray[i] > 1 Then Begin
Showmessage('Zahl in' + WO + ' doppelt');
BtNewClick(BtNew);
End; }
i := 1;
doppelt := false;
While (i < 9) And Not doppelt Do Begin
If HilfsArray[i] > 1 Then Begin
doppelt := true;
ShowMessage('Zahl in' + WO + ' doppelt');
End;
inc(i);
End;
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]);
ZahlDoppelt(' einer Zeile');
End;
//Spalte prüfen
For x := 0 To 8 Do Begin
HilfsArrayLeeren;
For y := 0 To 8 Do
AddHilfsArray(aSudoku[y, x]);
ZahlDoppelt(' einer Spalte');
End;
//Feld 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;
ZahlDoppelt(' einem Feld');
End;
End;