![]() |
AW: Anregungen + StringgridSelection-Problem
Zitat:
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 |
AW: Kreuzworträtsel
Zumindest in Delphi ist diese Variante denkbar:
Delphi-Quellcode:
Alternativ könnte man auch eine Klasse von TStringGrid ableiten und diese Methode implementieren.
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); |
Lösung?
Delphi-Quellcode:
Nach ein paar Tests scheint diese Methode zu funktionieren.
//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; Vielen vielen Dank für die vielen, schnellen und hilfreichen Antworten! |
AW: Kreuzworträtsel
du solltest aber trotzdem noch beide Schleifen beenden, wenn die FrageNr gefunden wurde
|
AW: Kreuzworträtsel
Das habe ich ja gestern auch schon angedeutet, wenn auch etwas durch die Blume :zwinker:
|
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?
|
AW: Schleife beenden
Zitat:
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; |
Alles klar, danke :-)
Alles klar, danke :-)
|
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! |
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 01:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz