Hallo Leute,
mein Kreuzwortprogramm macht nicht das, was es tun soll.
Ein Screenshot befindet sich im Anhang zum besseren Verständnis.
Die obere Listbox enthält alle horizontalen, die untere alle vertikalen Fragen.
Wählt man einen Eintrag aus, so springt das rote Quadrat auf dem Stringgrid in fast allen Fällen in die richtige Zelle des Stringgrids:
Delphi-Quellcode:
//
//TForm1.GeheZuFrage: Markiert das erste Feld der gesuchten Frage (markiert in Listbox)
//
procedure TForm1.GeheZuMarkierterFrage(var pListBox: TListBox);
var
i,j: Integer;
FrageNr: String;
Vertikal: Integer;
Horizontal: Integer;
begin
//Vertikal oder Horizontal?
Horizontal := 0;
Vertikal := 0;
if pListBox = ListBoxHorizontal then Horizontal := 1 else Vertikal := 1;
//Anfangskaestchen finden
//zunächst die Nr der Frage bestimmen
FrageNr := '';
i := 1;
while pListbox.Items[pListbox.ItemIndex][i] in ['0'..'9'] do
begin
FrageNr := FrageNr + pListbox.Items[pListbox.ItemIndex][i];
Inc(i);
end;
//Vorangestellte 0 eliminieren
FrageNr := IntToStr(StrToInt(FrageNr));
//Alle Kästchen nach der Nummer durchsuchen
for i := 0 to SGridKreuzwort.ColCount - 1 do
for j := 0 to SGridKreuzwort.RowCount - 1 do
if SGridKreuzwort.Cells[i,j] = FrageNr then
begin
SGridKreuzwort.Col := (i + Horizontal);
SGridKreuzwort.Row := (j + Vertikal);
end;
end;
Das Problem taucht auf, wenn Frage vier markiert ist.
Diese ist als einzige in beiden Listboxes enthalten.
Hier springt das rote Kästchen gar nicht, ich weiß aber absolut nicht warum.
Zur Zusatzinfo die wichtigsten Ereignisse:
Delphi-Quellcode:
//
//TForm1.ListBoxHorizontalClick: Sucht eine ausgewählte horizontale Frage
//
procedure TForm1.ListBoxHorizontalClick(Sender: TObject);
begin
ListBoxHorizontal.Update;
ListBoxHorizontal.Repaint;
GeheZuMarkierterFrage(ListBoxHorizontal);
GeheZuMarkierterFrage(ListBoxHorizontal); //bei einmaligen Aufruf springt das Kästchen manchmal falsch
Richtung := RHorizontal;
SGridKreuzwort.SetFocus();
end;
//
//TForm1.ListBoxVertikalClick: Sucht eine ausgewählte vertikale Frage
//
procedure TForm1.ListBoxVertikalClick(Sender: TObject);
begin
ListBoxVertikal.Update;
ListBoxVertikal.Repaint;
GeheZuMarkierterFrage(ListBoxVertikal);
GeheZuMarkierterFrage(ListBoxVertikal);
Richtung := RVertikal;
SGridKreuzwort.SetFocus();
end;
Das rote Kästchen wird in der Prozedur OnDrawCell des Stringgrids gezeichnet:
Delphi-Quellcode:
//Markierte Zelle einfärben
if SGridKreuzwort.IsCellSelected[aCol,aRow] then
begin
//Zelleninhalt mit Hintergrundfarbe löschen/einfärben
SGridKreuzwort.Canvas.Brush.Color := clRed;
SGridKreuzwort.Canvas.Fillrect(aRect);
//Mit kleinerem Kästchen in Originalfarbe übermalen -> Rahmen entsteht
SGridKreuzwort.Canvas.Brush.Color := clWhite; //Standardfarbe
outRect.Left := aRect.Left+2;
outRect.Top := aRect.Top+2;
outRect.Right := aRect.Right-2;
outRect.Bottom := aRect.Bottom-2;
SGridKreuzwort.Canvas.Fillrect(outRect);
end;