|
Вопрос # 5 343/ вопрос открыт / |
|
Здравствуйте!
Я использую компонент ATStreamSearch для поиска слов в тексте. Но видимо я неправильно его использую, или может что-то еще, но он у меня не ищет эти слова.
Помогите, пожалуйста, разобраться с ним.
В архиве сам проект с программой, так же есть файлы от компонента.
Компонент используется в Unit2.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- {{code}} procedure TForm2.Find(AFindFirst: Boolean);
- var
- Encoding: TATStreamSearchEncoding;
- Options: TATStreamSearchOptions;
- OK: Boolean;
- begin
- OK:=False;
- // try
- //try
- if Form2.CheckBox6.Checked then
- begin
- if Form2.CheckBox5.Checked then
- Encoding:=aseUnicodeBE
- else
- Encoding:=aseUnicodeLE;
- end
- else
- begin
- if Form2.CheckBox4.Checked then
- Encoding:=aseOEM
- else
- Encoding:=aseANSI;
- end;
- Options:=[];
- if Form2.CheckBox2.Checked then
- Include(Options, asoCaseSens);
- if form2.CheckBox3.Checked then
- Include(Options, asoWholeWords);
- if AFindFirst then
- begin
- { try
- Form2.ATStreamSearch1.FileName:=FileName;
- except
- Application.MessageBox('Cannot open filename specified', 'Error', MB_OK or MB_ICONERROR);
- Exit;
- end; }
- OK:=Form2.ATStreamSearch1.FindFirst(Form1.Memo1.Text, 0, Encoding, Options);
- end
- else
- begin
- OK:=Form2.ATStreamSearch1.FindNext;
- end;
- //finally
- //end;
- {except
- on E: Exception do
- if E.Message <> '' then
- begin
- Application.MessageBox(PChar(E.Message), 'Search failed', MB_OK or MB_ICONERROR);
- Exit;
- end; }
- // end;
- end; {{/code}}
 |
Вопрос задал: Driver_09 (статус: Посетитель)
Вопрос отправлен: 30 мая 2011, 10:55
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 17; последнее сообщение — 31 мая 2011, 14:45; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 30 мая 2011, 11:08 [#1]:
Если возникают проблемы с левыми компонентами, то надо обращаться не сюда, а к аффтарам этих самых компонентов.
Ну вот как ты себе представляешь нашу помощь? Щас мы всё бросим, скачаем дружно этот компонент себе на компы, установим его в delphi, разберёмся, как он работает, и будем отлаживать твою прогу? Ты бы сам стал этим заниматься, если бы был на моём месте, а?
С другой стороны, странно, что для происка текста в файле вообще используется какой-то компонент. Можно ж всё вручную написать и заточить под свои нужды.
Щас посмотрю твой исходник, так и быть. Только переформатирую его в божеский вид...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 11:20 [#2]:
min@y™: ну естественно понимаю что этим мало кто займется)
Да я вот тоже вручную уже давно написал бы поиск слов)
а мне нужно именно этим компонентом, так как это тема курсача.
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 11:25 [#3]:
Я сделал щас то, что должен был сделать ты перед выкладыванием куска кода - отформатировал и понарасставлял комментариев. Криминала, вроде, не увидел.
procedure TFind(AFindFirst: Boolean);
var
Encoding: TATStreamSearchEncoding; // кодировка текста
Options: TATStreamSearchOptions; // настрокйи поиска
OK: Boolean; // результат
begin
OK:= False; // Эту переменную можно выкинуть, она никак не используется
try
if CheckBox6.Checked // выбран Unicode
then begin
if CheckBox5.Checked // big endian?
then Encoding:=aseUnicodeBE
else Encoding:=aseUnicodeLE;
end
else begin // однобайтовый текст
if CheckBox4.Checked
then Encoding:=aseOEM // DOS cp-866
else Encoding:=aseANSI; // windows cp-1251
end;
Options:=[];
// с учётом регистра
if CheckBox2.Checked
then Include(Options, asoCaseSens);
// только слова целиком
if CheckBox3.Checked
then Include(Options, asoWholeWords);
// поиск
if AFindFirst
then begin
try
ATStreamSearch1.FileName:=FileName;
// А ты уверен, что ATStreamSearch1 именно здесь
// сгенерирует исключение при неверном имени файла?
except
Application.MessageBox('Cannot open filename specified', 'Error', MB_OK or MB_ICONERROR);
Exit;
end;
OK:= ATStreamSearch1.FindFirst(Form1.Memo1.Text, 0, Encoding, Options);
end
// найти далее
else OK:= ATStreamSearch1.FindNext();
except on E: Exception do
Application.MessageBox(PChar(E.Message), 'Search failed', MB_OK or MB_ICONERROR);
end;
end;
Мой тебе совет - пройдись по коду дебаггером и посмотри значения переменных Options, Encoding, Form1.Memo1.Text. Возможно в них содержатся неверные значения.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 11:27 [#4]:
Цитата (Driver_09):
Да я вот тоже вручную уже давно написал бы поиск слов) а мне нужно именно этим компонентом, так как это тема курсача.
Тема курсача - "Поиск текста в файлах с помощью компонента TATStreamSearch"???!!! Это в каком же ВУЗе придумывают такие темы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 11:37 [#5]:
min@y™: э, ну за совет по дебаггеру спасибо, посмотрю... а сама тема: Текстовый редактор, который шифрует и сжимает текст, а также выполняет поиск слов. и вот для шифрации и поиска дали 2 компонента, что бы ими воспользовался
|
|
Вадим К (статус: Академик), 30 мая 2011, 11:39 [#6]:
В том, где написали компонент TATStreamSearch - это же логично!
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 11:46 [#7]:
ну я как бы скопировал этот код из демонстрационного примера, который прилагался с этим компонентом.
Вот оттуда эти опции, кодировки, и исключения при неверном имени файла...
Но в принципе, оно у меня и выскакивает(
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 13:04 [#8]:
Цитата (Driver_09):
Но в принципе, оно у меня и выскакивает(
Ну шож ты сразу-то не сказал, что исключение генерируется! Самое главное - надо было сразу указать текст сообщения об ошибке.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 13:16 [#9]:
min@y™: ну могу написать что генерировалось...
Но я щас все-таки случайно наткнулся, где есть пример поиска с этим компонентом! только там вместо memo используется richedit, и вот там все работает) по-крайней мере поиск первого слова, а поиск следующего я думаю не проблема уже сделать)
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 13:27 [#10]:
Цитата (Driver_09):
ну могу написать что генерировалось...
Пиши давай. Дело тут не в мемо, а в кривых руках.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 13:49 [#12]:
Теперь открой модуль ATStreamSearch.pas, найди строку 442 и скопируй сюда метод, в котором эта строка находится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 18:55 [#13]:
min@y™: все я разобрался кое с чем, теперь у меня ищет первое слово, но следующие такие же слова, прога не ищет, может что-то еще не проверяется в моей процедуре Find?
вот код:
procedure TForm2.Find(ok: boolean);
var
Encoding: TATStreamSearchEncoding;
Options: TATStreamSearchOptions;
begin
ATStreamSearch1.FileName:=Form1.OpenDialog1.FileName;
if CheckBox6.Checked then
begin
if CheckBox5.Checked then
Encoding := aseUnicodeBE
else
Encoding := aseUnicodeLE;
end
else
begin
if CheckBox4.Checked then
Encoding := aseOEM
else
Encoding := aseANSI;
end;
Options := [];
{$IFDEF REGEX}
if CheckBox1.Checked then
Include(Options, asoRegEx);
{$ENDIF}
if CheckBox2.Checked then
Include(Options, asoCaseSens);
if CheckBox3.Checked then
Include(Options, asoWholeWords);
ok:= ATStreamSearch1.FindFirst(edit1.Text, 0, Encoding, Options);
if not ok then
ShowMessage('Не найдено');
Form1.Richedit1.SelStart:= ATStreamSearch1.FoundStart;
Form1.Richedit1.SelLength:= ATStreamSearch1.FoundLength;
Form1.Richedit1.SetFocus;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
Find(True);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Find(False);
end;
если нужно, я могу показать пример, как там используется процедура Find, она немного покруче конечно. и там все ищет...а у меня только первое совпадение и все(((
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 19:02 [#14]:
Хы, ёпрст, а где ж вызов FindNext()? Или я слепой и не вижу?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 30 мая 2011, 19:07 [#15]:
min@y™: то есть нужно это прописать в процедуре Find?
а как тогда? вот код демо-примера, там есть вызовы FindFirst FindNext, но я не понимаю че тут как проверяется?
if AFindFirst then
begin
try
Search.FileName := FFileName;
except
Application.MessageBox('Cannot open filename specified', 'Error', MB_OK or MB_ICONERROR);
Exit;
end;
OK := Search.FindFirst(edString.Text, 0, Encoding, Options);
end
else
begin
OK := Search.FindNext;
end;
ну до этого куска кода естесственно там проверяется все опции и кодировки)
|
|
min@y™ (статус: Доктор наук), 30 мая 2011, 19:27 [#16]:
Я этот компонент не знаю, но предположу, что метод FindFirst() запоминает параметры поиска, а FindNext() их потом использует.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Driver_09 (статус: Посетитель), 31 мая 2011, 14:45 [#17]:
min@y™: спасибо за внимание, я смог реализовать поиск слов этим компонентом)
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|