![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма и сообщения системы [D6, Win95/98, WinXP]
prorok2 © (2004-09-20 09:22:00)Добрый день!
Вопрос вот в чем - в цикле идет поиск по содержимому текстовых файлов. Но почему-то он идет либо когда форма активна, либо (если сверху открыто другое приложение) если курсор мыши двигается над формой моей программы, в которой идет поиск.
В чем подстава?
GuAV (2004-09-20 12:02:00) [1]
> Fedia (20.09.04 10:45) [10]
Такое лучше делать с пом BeginUpdate/EndUpdate а не второго окна.
Fedia (2004-09-20 10:45:00) [2]Если хочешь быстрее, то на время заполнения CheckListBox1 делай его невидимым. Это заметно ускоряет заполнение, а чтобы при этом программа смотрелась нормально, помести второй CheckListBox на форму и подменяй CheckListBox1 на CheckListBox2 на время заполнения.
prorok2 (2004-09-20 10:42:00) [3]Всё. Решил проблемы. Спасибо всем! Очень помогли!
prorok2 (2004-09-20 10:39:00) [4]Внял я вашим замечаниям и внес изменения (разве что не стал пока использовать TFileStream). Сейчас поиск идет нормально. Но вот какую фишку заметил. Если мышкой во время поиска не двигать, то он идет медленно, а если двигать, то гораздо быстрее. Это я отслеживаю (это относится и к вопросу про то, как я узнал, что поиск не идет) по ползунку в CheckListBox1. При быстром поиске он и ведет себя быстрее :)
TUser (2004-09-20 10:34:00) [5]Да. Слона-то я и не приметил
Fedia (2004-09-20 10:32:00) [6]>Еще бяка - цикл крутится даже когда уже be. Напиши
>while (not be) and (...) do
Да нет, прекращает выполняться, т.к. стоит break;
TUser (2004-09-20 10:05:00) [7]
> Нахрена в цикле делаеш Create? И затераеш старый указатель,
> вывеси "StrList := TStringList.Create;"
И еще free неплохо бы, + try ... finally
Еще бяка - цикл крутится даже когда уже be. Напиши
while (not be) and (...) do
Erik1 (2004-09-20 10:03:00) [8]Ну это лучше запихнуть в переменую PChar(AnsiUpperCase(Edit1.Text)) Кроме того поставь Application.ProcesMessage; в нутрь цикла будет перерисовыватся форма.
Если фаил маленький то такой метод подойдет, но лучше использовать TFileStream. Будет намного быстрее. Кроме того невижу освобождения StrList! Только кучу потеряных указателей! Нахрена в цикле делаеш Create? И затераеш старый указатель, вывеси "StrList := TStringList.Create;" за "while not QuerySearch.Eof do begin". Вобщем учти все замечания, перепиши код личше с использованием TFileStream и если будет проблемя задаш вопрос снова.
TUser (2004-09-20 10:03:00) [9]Тут я виже сразу несколько ошибок, хотя они и не омеют отношения к топику.
А как ты установил, что когда форма неактивна, поиск не осуществляется? Это я к тому, что если подобное заключение основано на том, что CheckListBox1 и ListBox1 не меняются, то может помочь Application.ProcessMessages.
prorok2 (2004-09-20 09:43:00) [10]Цикл идет по некоему запросу. Анализируется поле запроса, в котором содержится имя файла, по содержимому которого и будет идти поиск.
var StrList: TStringList;
be: Boolean;
begin
QuerySearch.First;
while not QuerySearch.Eof do
begin
StrList := TStringList.Create;
StrList.Clear;
StrList.LoadFromFile(QuerySearch.FieldByName('Article').AsString);
i := 0;
be := False;
while i <= StrList.Count - 1 do
begin
str := '';
str := AnsiStrPos(PChar(AnsiUpperCase(StrList.Strings[i])), PChar(AnsiUpperCase(Edit1.Text)));
if (Length(str) > 0) then
begin
be := True;
break;
end;
Inc(i);
end;
if be then
begin
CheckListBox1.Items.Add(QuerySearch.FieldByName('Name').AsString);
ListBox1.Items.Add(IntToStr(QuerySearch.FieldByName('Rn').AsInteger));
end;
QuerySearch.Next;
end;
end;
TUser (2004-09-20 09:23:00) [11]Пиши код