Ehrlich gesagt war das auch mein erster Ansatz
Delphi-Quellcode:
procedure TForm4.StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var Spalte,Zeile,Zahl,xAdd,yAdd,x,y:integer;
Sudoku:string;
begin
If ((Key=vk_delete) or (Key=vk_Back)) //wenn Backspace oder Entfernen gedrückt wurde
and (StringGrid1.Cells[StringGrid1.col,StringGrid1.row]<>' ')
then
begin
StringGrid1.Cells[StringGrid1.col,StringGrid1.row]:=' '; //dann lösche den Zellinhalt
For Zeile:=0 to 8 do
For Spalte:=0 to 8 do
FeldMenge[Spalte,Zeile]:=[1,2,3,4,5,6,7,8,9]; //FeldMengen neu füllen
For Zeile:=0 to 8 do
For Spalte:=0 to 8 do
If StringGrid1.Cells[Spalte,Zeile]<>' '
then
begin
Zahl:=strtoint(StringGrid1.Cells[Spalte,Zeile]);
RestMengeNeuZuOrdnen(Zahl,Spalte,Zeile); //FeldMengen reduzieren
end;
end;
end;
Das Problem: es funktioniert genauso nicht -.-
Aber ich habe imzwischen eine Lösung des Problems gefunden: Zum Speichern einer Sudoku-Datei wandle ich das Sudoku in einen String um und zum Laden wandle ich den String in das Sudoku um
Delphi-Quellcode:
function TForm4.SudokuInListeSpeichern:String;
var Spalte,Zeile:integer;
Datei:String;
begin
For Zeile:=0 to 8 do
For Spalte:=0 to 8 do
Datei:=Datei+StringGrid1.cells[Spalte,Zeile];
Result:=Datei;
end;
procedure TForm4.SudokuAusListeLaden(Datei:string);
var Spalte,Zeile,i:integer;
begin
FormCreate(Form4);
For i:=1 to 81 do //die gespeicherte Datei besteht aus 81 Zeichen
begin
Spalte:=(i-1) mod 9;
Zeile:=(i-1) div 9; // i-1 da Zellen/Spalten von 0..8
StringGrid1.Cells[Spalte,Zeile]:=Datei[i];
If Datei[i] in ['1'..'9']
then
begin
FeldMenge[Spalte,Zeile]:=[];
RestMengeNeuZuordnen(strtoint(Datei[i]),Spalte,Zeile);
end;
end;
end;
Und das funktioniert seltsamerweise, obwohl der Unterschied eigentlich nur im Löschen und Neuschreiben aller Zahlen liegt
Aber gestern Nacht kam mir ein wahrer Geistesblitz, als ich mit was völlig anderem beschäftigt war
Delphi-Quellcode:
procedure TForm4.StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var Spalte,Zeile,Zahl,xAdd,yAdd,x,y:integer;
Sudoku:string;
begin
If ((Key=vk_delete) or (Key=vk_Back)) //wenn Backspace oder Entfernen gedrückt wurde
and (StringGrid1.Cells[StringGrid1.col,StringGrid1.row]<>' ')
then
begin
Sudoku:=SudokuInListeSpeichern;
Sudoku[StringGrid1.Row*9+StringGrid1.Col+1]:=' ';
SudokuAusListeLaden(Sudoku);
end;
Das ist wahrscheinlich nicht die schnellste Methode, aber es funktioniert schonmal
Obwohl ich mich wirklich frage, warum die ersten 2 Ansätze fehlerhaft sind...