![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
УЖАВАЕМЫЕ МАСТЕРА! Как выйти из цикла?! [D5, dBase, FoxPro]
NDR © (2002-08-12 13:07:00)Организую поиск далее, поиск внутри поля:
procedure TForm1.Button1Click(Sender: TObject);=======База большая. 53"312 позиций.
var
f,r:boolean;
w,w0,wn:string;
key:char;
label gonext;
begin
if (length(Edit1.Text)=0) then fnend: exit; // искать нечего
TRY
begin
r:=false;
repeat
form1.refresh;
if (length(Edit1.Text)=0) then exit;
if table1.RecNo>1 then table1.Next;
f:=false;
repeat
w:=(Edit1.text);
if (dbgrid1.SelectedField.AsString="") then begin
//==
goto gonext;
//==
end else begin
while pos(" ",w)>0 do delete(w,pos(" ",w),1);
while w[1]=" " do delete(w,1,1);
while w[length(w)]=" " do delete(w,length(w),1);
f:=true;
wn:=(table1[dbgrid1.SelectedField.DisplayName]);
while length(w)>0 do begin
if pos(" ",w)>0 then begin
w0:=copy(w,1,pos(" ",w)-1);
delete(w,1,pos(" ",w));
end else begin
w0:=w;
w:="";
end;
if f then f:=pos(w0,wn)>0
end;
gonext: if not f then table1.Next;
end;
until ((table1.RecNo=53210) or (f));
if ((table1.RecNo=table1.RecordCount) and (not f)) then
r:= MessageDlg("Не найдено "+Edit1.text+" Вернуться к началу ?",
mtConfirmation, [mbYes, mbNo], 0) = mrYes;
if not f then
if r then begin
table1.First;
r:=false;
end;
until not r;
end;
FINALLY
DBGrid1.Refresh;
END;
end;
Как по нажатию на Esc прекращать(останавливать) поиск.
У меня неполучается.
Внутри цикла (repeat) пишу
if key:=#27 then exit;Помойму "exit" выход из цикла?! непомню...
Если использовать событие формы Form1.onKeyDown(or onKeyPress) то нажатие просто игнорируется.
Пока не будет обработана последняя запись поиск не прекращается.
Подскажите пожалуйста как мне решить эту проблему.
с Уважением, NDR
Bars (2002-08-16 23:19:00) [1]Не EXITа BREAK
SaS13 (2002-08-12 15:32:00) [2]
NDR (12.08.02 15:14)
у тебя в коде есть еще вложенный цикл, может и там следует проверочку поставить?
gek (2002-08-12 15:28:00) [3]
Установить у формы KeyPreview = true
procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
if Key = VK_ESCAPE then ESCPressed:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
f,r:boolean;
w,w0,wn:string;
key:char;
label gonext;
begin
ESCPressed:=false;
.........
NDR (2002-08-12 15:14:00) [4]Ничего невыходит. ПИшу так
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then ESCPressed:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
f,r:boolean;
w,w0,wn:string;
key:char;
label gonext;
begin
if (length(Edit1.Text)=0) then fnend: exit; // искать нечего
TRY
begin
r:=false;
repeat
Application.processmessages;
if ESCPressed then exit;
form1.refresh;
if (length(Edit1.Text)=0) then exit;
if table1.RecNo>1 then table1.Next;
f:=false;
repeat
w:=(Edit1.text);
if (dbgrid1.SelectedField.AsString="") then begin
//==
goto gonext;
//==
end else begin
while pos(" ",w)>0 do delete(w,pos(" ",w),1);
while w[1]=" " do delete(w,1,1);
while w[length(w)]=" " do delete(w,length(w),1);
f:=true;
wn:=(table1[dbgrid1.SelectedField.DisplayName]);
while length(w)>0 do begin
if pos(" ",w)>0 then begin
w0:=copy(w,1,pos(" ",w)-1);
delete(w,1,pos(" ",w));
end else begin
w0:=w;
w:="";
end;
if f then f:=pos(w0,wn)>0
end;
gonext: if not f then table1.Next;
end;
until ((table1.RecNo=53210) or (f));
if ((table1.RecNo=table1.RecordCount) and (not f)) then
r:= MessageDlg("Не найдено "+Edit1.text+" Вернуться к началу ?",
mtConfirmation, [mbYes, mbNo], 0) = mrYes;
if not f then
if r then begin
table1.First;
r:=false;
end;
until not r;
end;
FINALLY
DBGrid1.Refresh;
END;
end;
И через "BREAK" тоже пробовал... Через BREAK - даже больше похоже на правду. но всё равно не калбасит... нет результата.
Что делать ?
Исправьте Код как считаете он должен работать !!!!!
с Уважением, NDR
NDR (2002-08-12 14:38:00) [5]Okey! попробую ....
Desdechado (2002-08-12 13:15:00) [6]1. break выход из цикла
2. вставь в цикл Application.ProcessMessages
Kaban (2002-08-12 13:12:00) [7]заводишь глобальный флаг ESCPressed:Boolean = false;
в OnKeyPress:
if Key = #27 then ESCPressed:=true;
в том месте, где нужно выйти из цикла пишешь:
Application.processmessages;
if ESCPressed then exit;