Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Showmessage bei fehlgeschlagenem Suchvorgang


Sievo - So 26.09.10 00:03
Titel: Showmessage bei fehlgeschlagenem Suchvorgang
Hi ho ich hab noch ne Frage!!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
begin
for row:=0 to StringGrid1.RowCount do
for col:=0 to StringGrid1.ColCount do begin
if StringGrid1.Cells[col,row]=Edit3.Text then begin
StringGrid1.Col:=Col;
StringGrid1.Row:=Row;
end
else

ShowMessage('Leider nichts gefunden');
 end;
end;


Habe diese Suchfunktion eingebaut um sachen aus einer StringGrid Tabelle zu suchen!

Ist auch alles toll soweit aber ich hab dann das else eingefügt und die showmessage wenn nichts gefunden wurde
Problem ist das Fenster öffnet sich und geht nicht wieder weg :) also ich muss das Programm über den Taskmanager schließen
Kann ich das irgendwie begrenzen auf ein Fenster?


Vielen Dank!


Delete - So 26.09.10 00:26

Was für ein Fenster geht nicht mehr weg? Der Dialog? Der ist modal und muss mit klicken auf die OK-Schaltfläche geschlossen werden. Oder was meinst du jetzt?


Narses - So 26.09.10 00:28

Moin und :welcome: im Forum!

user profile iconSievo hat folgendes geschrieben Zum zitierten Posting springen:
ich hab dann das else eingefügt und die showmessage wenn nichts gefunden wurde
Problem ist das Fenster öffnet sich und geht nicht wieder weg :)
Doch, irgendwann (genauer: wenn alle Zeilen durchsucht wurden) "geht" die Dialogbox wieder weg. ;) Warum? :gruebel: Wenn du deinen Quelltext mal vernünftig formatiert hättest (ist "Quelltexteinrücker" jetzt sowas wie "Saunauntensitzer"? :|), würdest du auch sehen, warum: 8)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
  var
    row, col: Integer; // solltest du hier nicht eine Compilerwarnung erhalten haben, dass Schleifenvariablen lokal sein sollten?
begin
  for row := 0 to StringGrid1.RowCount do
    for col := 0 to StringGrid1.ColCount do begin
      if (StringGrid1.Cells[col,row] = Edit3.Text) then begin
        StringGrid1.Col:=Col;
        StringGrid1.Row:=Row;
      end
      else
        ShowMessage('Leider nichts gefunden');
    end;
end;
Die Lösung ist allerdings nicht durch ein bischen Code-Umstellen machbar, ich schlage das mal so vor:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
  var
    row, col: Integer; // solltest du hier nicht eine Compilerwarnung erhalten haben, dass Schleifenvariablen lokal sein sollten?
begin
  for row := 0 to StringGrid1.RowCount do
    for col := 0 to StringGrid1.ColCount do
      if (StringGrid1.Cells[col,row] = Edit3.Text) then begin
        StringGrid1.Col:=Col;
        StringGrid1.Row:=Row;
        Exit; // Prozedur verlassen, Suchbegriff gefunden
      end;
  ShowMessage('Leider nichts gefunden'); // wenn wir hier ankommen, wurde nichts gefunden
end;
cu
Narses


Tilman - So 26.09.10 00:31

Oder man setzt eine Boolean-Variable und fragt die am Ende ab

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var gefunden: boolean;
begin
gefunden := false;
for ...
   if ... then gefunden := true;
...
if not gefunden then ShowMessage('Nicht gefunden');
end;


Falls du nach der ShowMessage noch Code ausführen willst kannst du das so machen, weil nach exit() verlässt du die Prozedur und kannst nichts mehr ausführen.


Sievo - So 26.09.10 01:51

Vielen Dank für die Zahlreichen Antworten! :)

Und vielen Dank Narses!! Das funktioniert alles nur jetzt hab ich das Problem das er mir direkt den ersten fund anzeigt also das Startdatum der Kw und dann ist leider nicht die ganze KW im Sichtfenster!

Bei meinem oben hatte ich den letzten Tag obwohl ja eigentlich nicht viel anders war?
Versteh ich also nicht kann mir das einer erklären?
Und vllt auch sagen ob man das noch einstellen kann das er den letzten Eintrag nehmen soll? also das letzte Datum der KW!?

Vielen Dank!!


Tilman - So 26.09.10 01:56

Ja das ist genau das was ich meine: du rufst exit() auf, und sofort geht das Programm aus der Prozedur raus, und der Rest wird nicht mehr ausgeführt. Mache es also so wie ich gesagt habe, und richte eine Boolean-Variable ein, und lass exit() dafür weg :)


Sievo - So 26.09.10 02:07

Okay coole sache das versuch ich dann mal :)

Danke dir!


Gerd Kayser - So 26.09.10 04:41

user profile iconSievo hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
for row:=0 to StringGrid1.RowCount do
for col:=0 to StringGrid1.ColCount do begin

Das sollte doch wohl eher heißen:

Delphi-Quelltext
1:
2:
for row :=0 to StringGrid1.RowCount - 1 do
for col :=0 to StringGrid1.ColCount - 1 do