Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прервать цикл While? [D7, 95/98]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо