Hey.
Ich bin derzeit damit beschäftigt, einen "Crossword-Generator" zu entwickeln.
Ich habe also ein Memo, in dem Begriffe stehen. Diese Begriffe werden per Klick auf einen Button in ein StringGrid gepackt (Je Zelle ein Buchstabe, also wie bei einem Crossword --> ist ja auch logisch.

). Position und Richtung der Ausgabe in dem Grid werden zufällig bestimmt. Und dann werden natürlich die restlichen Felder noch zufällig befüllt.
Das funktioniert ja auch schonmal alles, war ja auch recht einfach.
Aber nun habe ich noch einen weiteren Button, ich nenne ihn einfach mal "Lösung". Denn wenn man auf diesen Button klickt, soll die Lösung des Crossword angezeigt werden, und zwar so, dass alle "richtigen" Zellen (die mit den "richtigen" Buchstaben) farblich markiert/befüllt werden.
Btw.: Diese Übung soll für mich der Einstieg in OOP sein.
Also: Mein Objekt ist ja 'ne Zelle - oder auch mehrere Zellen, wenn man's genau nimmt.
Nun dachte ich mir, ich kann ja erstmal beim FormCreate jeder Zelle sowas wie einen Index zuweisen, der zu diesem Zeitpunkt 0 ist.
Und dann, wenn man das Grid mit den Begriffen füllt, sollte den entsprechenden Zellen der Index 1 zugewiesen werden. Dann haben ja alle "richtigen" Zellen den Index 1 und alle "falschen" den Index 0.
Und dann beim Klick auf "Lösung" kann das Programm ja mittels einer Schleife das Grid durchgehen und immer dann, wenn der Index = 1 ist, diese Zelle färben.
Ja. Die Idee an sich soll ja schonmal soweit richtig sein. Aber bei mir hängts noch etwas an der Umsetzung.
Ich habe erstmal eine neue Klasse deklariert:
Delphi-Quelltext
1: 2: 3: 4:
| TCellData = class color: TColor; index: Integer; end; |
Beim FormCreate muss diese dann ja erstmal aufgerufen werden, weil ja jeder Zelle der Index 0 zugewiesen werden soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TfrmMain.FormCreate(Sender: TObject); var I: Integer; e: Integer; grdRect: TGridRect; begin with grdRect do begin Top := -1; Left := -1; Right := -1; Bottom := -1; end; grdGrid.Selection := grdRect;
for I := 0 to grdGrid.RowCount do for e := 0 to grdGrid.ColCount do begin grdGrid.Objects[I, e] := TCellData.Create; TCellData(grdGrid.Objects[I, e]).index := 0; end; end; |
Dann muss ich beim Eintrag der Buchstaben auch immer gleich den Index auf 1 setzen (hier im Beispiel genügt wohl die Richtung Rechts):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| procedure TfrmMain.right(var sTerm: string); var I, k: Integer; begin bStop_process := false; repeat Application.ProcessMessages; begin iCol_StartingValue := random(grdGrid.ColCount - length(sTerm)); iRow_StartingValue := random(grdGrid.RowCount); iCol := iCol_StartingValue; bMatch := True; bOutput := false; for k := 0 to length(sTerm) - 1 do if (grdGrid.Cells[iCol + k, iRow_StartingValue] <> '') and (grdGrid.Cells[iCol + k, iRow_StartingValue] <> sTerm[k + 1]) then bMatch := false; for I := 1 to length(sTerm) do begin if bMatch = True then begin grdGrid.Cells[iCol, iRow_StartingValue] := sTerm[I]; bOutput := True; iCol := iCol + 1; grdGrid.Objects[iCol + (I - 1), iRow_StartingValue] := TCellData.Create; TCellData(grdGrid.Objects[iCol + (I - 1), iRow_StartingValue]) .index := 1; end; end; Screen.Cursor := crHourglass; end; until (bOutput = True) or (bStop_process = True); Screen.Cursor := crDefault; end; |
So. Nachdem der Index 1 sein sollte (sofern das bei mir richtig ist ...) muss ja das Ereignis btnLösungMouseDown folgen:
Ja... Da brauch ich gar keinen Quelltext kopieren jetzt, da steht eh nur wirres Zeug. Jedenfalls muss ich a ja irgendwie eine Verbindung mit grdGridDrawCell aufbauen und das klappt nicht so ganz.
Ich kopier auch mal schnell mein DrawCell hier rein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TfrmMain.grdGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Assigned(grdGrid.Objects[ACol, ARow]) then exit; if gdFocused in State then begin grdGrid.Canvas.Brush.color := clRed; grdGrid.Canvas.FillRect(Rect); end; end; |
Ich glaub in dem Teil ist auch alles falsch ... irgendwie komm ich damit nicht weiter.
Kann mir da jemand weiterhelfen? Wenn's denn so jetzt überhaupt verständlich war. :'D
Falls jmd den ganzen Q-Text benötigt, kann ich den auch nochmal hier posten.