Einzelnen Beitrag anzeigen

Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#1

Kreuzworträtsel

  Alt 29. Mai 2012, 17:25
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;
Miniaturansicht angehängter Grafiken
screenshot.png  
  Mit Zitat antworten Zitat