Einzelnen Beitrag anzeigen

Salazriel

Registriert seit: 13. Feb 2010
33 Beiträge
 
#3

Re: Sudoku: Probleme beim Löschen

  Alt 2. Mär 2010, 09:38
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...
  Mit Zitat antworten Zitat