Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизФорма и сообщения системы Найти похожие ветки
← →
prorok2 (2004-09-20 09:22) [0]Добрый день!
Вопрос вот в чем - в цикле идет поиск по содержимому текстовых файлов. Но почему-то он идет либо когда форма активна, либо (если сверху открыто другое приложение) если курсор мыши двигается над формой моей программы, в которой идет поиск.
В чем подстава?
← →
TUser © (2004-09-20 09:23) [1]Пиши код
← →
prorok2 (2004-09-20 09:43) [2]Цикл идет по некоему запросу. Анализируется поле запроса, в котором содержится имя файла, по содержимому которого и будет идти поиск.
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;
← →
Erik1 © (2004-09-20 10:03) [3]Ну это лучше запихнуть в переменую 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) [4]Тут я виже сразу несколько ошибок, хотя они и не омеют отношения к топику.
А как ты установил, что когда форма неактивна, поиск не осуществляется? Это я к тому, что если подобное заключение основано на том, что CheckListBox1 и ListBox1 не меняются, то может помочь Application.ProcessMessages.
← →
TUser © (2004-09-20 10:05) [5]
> Нахрена в цикле делаеш Create? И затераеш старый указатель,
> вывеси "StrList := TStringList.Create;"
И еще free неплохо бы, + try ... finally
Еще бяка - цикл крутится даже когда уже be. Напиши
while (not be) and (...) do
← →
Fedia (2004-09-20 10:32) [6]>Еще бяка - цикл крутится даже когда уже be. Напиши
>while (not be) and (...) do
Да нет, прекращает выполняться, т.к. стоит break;
← →
TUser © (2004-09-20 10:34) [7]Да. Слона-то я и не приметил
← →
prorok2 (2004-09-20 10:39) [8]Внял я вашим замечаниям и внес изменения (разве что не стал пока использовать TFileStream). Сейчас поиск идет нормально. Но вот какую фишку заметил. Если мышкой во время поиска не двигать, то он идет медленно, а если двигать, то гораздо быстрее. Это я отслеживаю (это относится и к вопросу про то, как я узнал, что поиск не идет) по ползунку в CheckListBox1. При быстром поиске он и ведет себя быстрее :)
← →
prorok2 (2004-09-20 10:42) [9]Всё. Решил проблемы. Спасибо всем! Очень помогли!
← →
Fedia (2004-09-20 10:45) [10]Если хочешь быстрее, то на время заполнения CheckListBox1 делай его невидимым. Это заметно ускоряет заполнение, а чтобы при этом программа смотрелась нормально, помести второй CheckListBox на форму и подменяй CheckListBox1 на CheckListBox2 на время заполнения.
← →
GuAV © (2004-09-20 12:02) [11]
> Fedia (20.09.04 10:45) [10]
Такое лучше делать с пом BeginUpdate/EndUpdate а не второго окна.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c