![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как прервать цикл While? [D7, 95/98]
dera © (2006-02-01 14:36:00)В цикле while not Table1.Eof do ищется запись в довольно большой таблице. Таблица выведена в гриде. Как можна сделать:
1) по нажатию на ESC прервать поиск и выйти из цикла
2) на время поиска "отключить" таблицу от грида (возможно так будет быстрей искать)
dera (2006-02-01 15:30:00) [41]>>КиТаЯц © (01.02.06 15:10) [7]
>>Shirson © (01.02.06 15:14) [9]
Спасибо, понял
>>msguns © (01.02.06 15:13) [8]
Использование TXXTable (таблицу в 100000 записей ни один юзер не в силах даже просто просмотреть, не говоря уж о каком-то внимании)
Можно было бы и не показывать таблицу, но дело в том, что я делаю просмотрщик таблиц и тут никуда не деться :-(
Нащет 2). Я тоже думал, что можна сначала найти первую запись, и от нее плясать. Но поиск может происходить не по одному полю, то что, для каждого кол-ва полей писать Locate?
evvcom (2006-02-01 15:21:00) [42]прокатит
Shirson (2006-02-01 15:14:00) [43]А вариант
while (условие) and (not BRK) do begin
Не прокатит?
msguns (2006-02-01 15:13:00) [44]>Ega23 © (01.02.06 15:03) [6]
>Можно. Но это будет долго. Лучше почитай про многопоточность в книжке.
Зачем в этом контексте многопоточность ?
>dera
Твои ошибки:
1. Использование TXXTable (таблицу в 100000 записей ни один юзер не в силах даже просто просмотреть, не говоря уж о каком-то внимании)
2. Поиск собственно в датасете во всех случаях вместо того, чтобы разбить его на мин. 2 части: поиск первого (Locate) и поиск в список (отдельный динамический запрос с получением списка найденных записей в виде указателей (UID) на них).
Причем, судя по всему, на время поиска грид не "освобождается" датасетом от реакции на его события (DisableControls).
КиТаЯц (2006-02-01 15:10:00) [45]
var BRK: boolean = falsle;
...
Table1.DisableControls
while условие do begin
Application.ProcessMessages; // иначе форме все нажатия на клавиши до одного места пока цикл не отработает
...
if BRK then begin
BRK:= False; // переменную сразу на место
break; // прерывание цикла
end;
...
end;
Table1.EnableControls;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then BRK:= True;
end;
Ega23 (2006-02-01 15:03:00) [46]
> а можна подробнее?
Можно. Но это будет долго. Лучше почитай про многопоточность в книжке.
dera (2006-02-01 15:02:00) [47]>>2. Ловить сообщения
а можна подробнее?
Ega23 (2006-02-01 14:50:00) [48]
> А не проще использовать метод Locate?
Вообще-то проще использовать запрос с фильтрами, а не всякие Table, но это уже Дзен... :о)
stone (2006-02-01 14:49:00) [49]
> В цикле while not Table1.Eof do ищется запись в довольно
> большой таблице.
А не проще использовать метод Locate?
ZeroDivide (2006-02-01 14:46:00) [50]
> 1) по нажатию на ESC прервать поиск и выйти из цикла
Варианты:
1. Сделать поиск в отдельном потоке
2. Ловить сообщения
Ega23 (2006-02-01 14:39:00) [51]
> 1) по нажатию на ESC прервать поиск и выйти из цикла
В цикле поставь Application.ProcessMessages
> 2) на время поиска "отключить" таблицу от грида (возможно
> так будет быстрей искать)
Table1.DisableControls
While
.....
end;
Table1.EnableControls;