Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#1: 2011-10-29 12:22:44 ЛС | профиль | цитата
nesco, добавить бы в SearchInFile "С учетом регистра символов""Без учета регистра символов".

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 26061
Рейтинг: 2120
#2: 2011-10-29 13:45:07 ЛС | профиль | цитата
Tad писал(а):
добавить бы в SearchInFile "С учетом регистра символов""Без учета регистра символов"

Вариант решения в студию
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#3: 2011-10-29 15:38:56 ЛС | профиль | цитата
nesco, [flood]Да-ааа, по лени ты меня превзошел [/flood]
------------ Дoбавленo в 14.27:
Сейчас подумаю.
------------ Дoбавленo в 15.38:
Вот вроде searchinfile_sensitive.rar
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1searchinfile_sensitive.rar [1.5KB] [321]
Разработчик
Ответов: 26061
Рейтинг: 2120
#4: 2011-10-29 16:07:32 ЛС | профиль | цитата
Tad, нельзя применять lowerCase для кириллицы, он ее не понимает


function LowerCase(const S: string): string;
var I : Integer;
begin
Result := S;
for I := 1 to Length( S ) do
if Result[ I ] in [ 'A'..'Z' ] then
Inc( Result[ I ], 32 );
end;
Надо применить функцию AnsiLowerCase


function AnsiLowerCase(const S: string): string;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PChar(S), Len);
if Len > 0 then CharLowerBuff(Pointer(Result), Len);
end;
или что-то подобное
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#5: 2011-10-29 17:08:43 ЛС | профиль | цитата
Да. Замена LowerCase на AnsiLowerCase решило проблему. Выпустил из виду русский язык.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#6: 2011-10-29 17:22:48 ЛС | профиль | цитата
Tad писал(а):
Выпустил из виду русский язык

Не только кириллицу, но и любую другую локаль
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#7: 2011-10-29 17:38:37 ЛС | профиль | цитата
nesco писал(а):
Не только кириллицу, но и любую другую локаль
В иврите нет больших и маленьких.Все большие

Сам заменишь или мне заменить LowerCase на AnsiLowerCase ?
------------ Дoбавленo в 17.38:
А как думаешь BlockFind-у этого не надо ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#8: 2011-10-29 17:48:27 ЛС | профиль | цитата
Tad писал(а):
А как думаешь BlockFind-у этого не надо ?

Да надо, наверное.
Еще вопрос мне стал непонятен -- NotSearch должен выдаваться один раз в конце поиска, или каждый раз
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#9: 2011-10-29 18:03:28 ЛС | профиль | цитата
nesco писал(а):
каждый раз
Ну да. А вдруг нужно проверить ту же строку дальше на что-то ещё тем же BlockFind-ом.
------------ Дoбавленo в 18.03:
Заменил модернизированным SearchInFile обычную связку: загрузить файл по doLoad в StrList и поиск BlockFind-ом с точки StrList.Text.
Фаллометер показал, что с модернизированным SearchInFile работает на порядок быстрее.


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#10: 2011-10-29 18:23:19 ЛС | профиль | цитата
Tad, а вот ты не скажешь, нахрена LowerСase(t) делать каждый раз в цикле

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#11: 2011-10-29 18:25:16 ЛС | профиль | цитата

нельзя
if not _prop_Sensitive then str := AnsiLowerCase(str);
str дальше должна выдаваться в первозданном виде
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#12: 2011-10-29 18:31:00 ЛС | профиль | цитата
Tad писал(а):
str дальше должна выдаваться в первозданном виде

Я это понял и вернул остальной код на место, вот так



procedure THiSearchInFile._work_doSearch;
var
F: TextFile;
fn, t: string;
BufIn : Array[0..65535] of Char;
k: integer;
begin
num := -1;
str := ';
fn := ReadString(_Data, _data_FileName, _prop_FileName);
if not FileExists(fn) then exit;
t := ReadString(_Data, _data_Text, _prop_Text);
AssignFile(F, fn);
Reset(F);
SetTextBuf(F, BufIn);
FStop := False;
if t = ' then
while not eof(F) and not FStop do
begin
Readln(F, str);
inc(num); // счетчик строк
_hi_onEvent(_event_onSearch, str);
end
else
begin
if not _prop_Sensitive then t := AnsiLowerCase(t);
while not eof(F) and not FStop do
begin
Readln(F, str);
inc(num); // счетчик строк
if _prop_Sensitive then
k := Pos(t, str)
else
k := Pos(t, AnsilowerCase(str));
if k = 0 then
_hi_onEvent(_event_onNotSearch, str)
else
_hi_onEvent(_event_onSearch, str);
end;
end;
CloseFile(F);
_hi_onEvent(_event_onEnd);
end;
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#13: 2011-10-29 18:34:39 ЛС | профиль | цитата
Нормально.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#14: 2011-10-29 18:36:20 ЛС | профиль | цитата
Можно было еще и вот так сделать, но это проверять надо, будет ли прирост



procedure THiSearchInFile._work_doSearch;
var
F: TextFile;
fn, t: string;
BufIn : Array[0..65535] of Char;
str1: string;
begin
num := -1;
str := ';
fn := ReadString(_Data, _data_FileName, _prop_FileName);
if not FileExists(fn) then exit;
t := ReadString(_Data, _data_Text, _prop_Text);
AssignFile(F, fn);
Reset(F);
SetTextBuf(F, BufIn);
FStop := False;
if t = ' then
while not eof(F) and not FStop do
begin
Readln(F, str);
inc(num); // счетчик строк
_hi_onEvent(_event_onSearch, str);
end
else
begin
if not _prop_Sensitive then t := AnsiLowerCase(t);
while not eof(F) and not FStop do
begin
Readln(F, str);
inc(num); // счетчик строк
if _prop_Sensitive then
str1 := str
else
str1 := AnsilowerCase(str);
if Pos(t, str1) then
_hi_onEvent(_event_onNotSearch, str)
else
_hi_onEvent(_event_onSearch, str);
end;
end;
CloseFile(F);
_hi_onEvent(_event_onEnd);
end;
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#15: 2011-10-29 18:43:15 ЛС | профиль | цитата
     if _prop_Sensitive then
str1 := str // если здесь str1 передается только указатель на str без выделения памяти
else // то
str1 := AnsilowerCase(str);// здесь создается новая строка с пожиранием памяти (грубо)
я бы вернулся к предыдущему варианту.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)