Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Kreuzworträtsel (https://www.delphipraxis.net/168580-kreuzwortraetsel.html)

Helmi 30. Mai 2012 22:11

AW: Anregungen + StringgridSelection-Problem
 
Zitat:

Zitat von Noobmaster (Beitrag 1168761)
Wie kann ich Col und Row verändern (die Zelle mit diesen Koordinaten selektieren), sodass erst nach der Änderung beider Werte die Stringgrid-Ereignisse aufgerufen werden?

Hallo,

zwei Ideen:
- entweder sich eine bool´sche Variable setzen und im ersten Aufruf im OnDraw-Event gleich mit exit die Procedure beenden
- das OnDraw-Event auf nil setzen und erst nach dem setzen von Col und vor dem Setzen von Row wieder definieren

Blup 31. Mai 2012 07:50

AW: Kreuzworträtsel
 
Zumindest in Delphi ist diese Variante denkbar:
Delphi-Quellcode:
type
  TMyGridHelper = class helper for TCustomGrid
    procedure Select(ACol, ARow: Longint);
  end;

  procedure TMyGridHelper.Select(ACol, ARow: Longint);
  begin
    FocusCell(ACol, ARow, True);
  end;

{...}
SGridKreuzwort.Select(i + Horizontal, j + Vertikal);
Alternativ könnte man auch eine Klasse von TStringGrid ableiten und diese Methode implementieren.

Noobmaster 31. Mai 2012 09:34

Lösung?
 
Delphi-Quellcode:
   //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.OnSelectCell := nil; //Verhindern, dass OnSelectCell sofort ausgeführt wird
            SGridKreuzwort.Col := (i + Horizontal);
            SGridKreuzwort.OnSelectCell := @SGridKreuzwortSelectCell; //darf wieder ausgeführt werden
            SGridKreuzwort.Row := (j + Vertikal);
         end;
Nach ein paar Tests scheint diese Methode zu funktionieren.

Vielen vielen Dank für die vielen, schnellen und hilfreichen Antworten!

Helmi 31. Mai 2012 09:56

AW: Kreuzworträtsel
 
du solltest aber trotzdem noch beide Schleifen beenden, wenn die FrageNr gefunden wurde

DeddyH 31. Mai 2012 10:01

AW: Kreuzworträtsel
 
Das habe ich ja gestern auch schon angedeutet, wenn auch etwas durch die Blume :zwinker:

Noobmaster 31. Mai 2012 13:52

Schleife beenden
 
Die innere Schleife kann ich ja mit "break" beenden. Aber wie beende ich die äußere Schleife auch noch in der if-Bedingung? Muss ich dann zweimal "break" setzen?

Helmi 31. Mai 2012 13:57

AW: Schleife beenden
 
Zitat:

Zitat von Noobmaster (Beitrag 1168942)
Die innere Schleife kann ich ja mit "break" beenden. Aber wie beende ich die äußere Schleife auch noch in der if-Bedingung? Muss ich dann zweimal "break" setzen?

pro Schleife ist ein break notwendig!

Beispiel:
Delphi-Quellcode:
var
  bfound: Boolean;

{...}

   bfound := false;

   //Alle Kästchen nach der Nummer durchsuchen
    for i := 0 to SGridKreuzwort.ColCount - 1 do
      begin
        for j := 0 to SGridKreuzwort.RowCount - 1 do
          if SGridKreuzwort.Cells[i,j] = FrageNr then
            begin
              SGridKreuzwort.OnSelectCell := nil; //Verhindern, dass OnSelectCell sofort ausgeführt wird
              SGridKreuzwort.Col := (i + Horizontal);
              SGridKreuzwort.OnSelectCell := @SGridKreuzwortSelectCell; //darf wieder ausgeführt werden
              SGridKreuzwort.Row := (j + Vertikal);

              bfound := true;
              break;
            end;
        If bfound then
          break;
      end;

Noobmaster 31. Mai 2012 13:58

Alles klar, danke :-)
 
Alles klar, danke :-)

Helmi 31. Mai 2012 13:59

AW: Kreuzworträtsel
 
Wenn die Schleifen am Ende einer Procedure stehen, dann könnte man auch ein exit in der zweiten Schleife benutzen, dann wird sofort die Procedure beendet!
ja - ich bin mir bewusst dass ich für diese Aussage Schläge bekommen könnte!

DeddyH 31. Mai 2012 14:05

AW: Kreuzworträtsel
 
Oder ganz ohne break oder exit:
Delphi-Quellcode:
found := false;
i := 0;
while (i < SGridKreuzwort.ColCount) and not found do
  begin
    j := 0;
    while (j < SGridKreuzwort.RowCount) and not found do
      begin
        if ... then
          begin
            found := true;
            (* weiterer Code *)
          end;
        inc(j);
      end;
    inc(i);
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz