Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 343

/ вопрос открыт /

Здравствуйте!
Я использую компонент ATStreamSearch для поиска слов в тексте. Но видимо я неправильно его использую, или может что-то еще, но он у меня не ищет эти слова.
Помогите, пожалуйста, разобраться с ним.
В архиве сам проект с программой, так же есть файлы от компонента.
Компонент используется в Unit2.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. {{code}} procedure TForm2.Find(AFindFirst: Boolean);
  2. var
  3. Encoding: TATStreamSearchEncoding;
  4. Options: TATStreamSearchOptions;
  5. OK: Boolean;
  6. begin
  7. OK:=False;
  8. // try
  9. //try
  10. if Form2.CheckBox6.Checked then
  11. begin
  12. if Form2.CheckBox5.Checked then
  13. Encoding:=aseUnicodeBE
  14. else
  15. Encoding:=aseUnicodeLE;
  16. end
  17. else
  18. begin
  19. if Form2.CheckBox4.Checked then
  20. Encoding:=aseOEM
  21. else
  22. Encoding:=aseANSI;
  23. end;
  24. Options:=[];
  25. if Form2.CheckBox2.Checked then
  26. Include(Options, asoCaseSens);
  27. if form2.CheckBox3.Checked then
  28. Include(Options, asoWholeWords);
  29. if AFindFirst then
  30. begin
  31. { try
  32. Form2.ATStreamSearch1.FileName:=FileName;
  33. except
  34. Application.MessageBox('Cannot open filename specified', 'Error', MB_OK or MB_ICONERROR);
  35. Exit;
  36. end; }
  37. OK:=Form2.ATStreamSearch1.FindFirst(Form1.Memo1.Text, 0, Encoding, Options);
  38. end
  39. else
  40. begin
  41. OK:=Form2.ATStreamSearch1.FindNext;
  42. end;
  43. //finally
  44. //end;
  45. {except
  46. on E: Exception do
  47. if E.Message <> '' then
  48. begin
  49. Application.MessageBox(PChar(E.Message), 'Search failed', MB_OK or MB_ICONERROR);
  50. Exit;
  51. end; }
  52. // end;
  53. end; {{/code}}


Driver_09 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Driver_09 (статус: Посетитель)
Вопрос отправлен: 30 мая 2011, 10:55
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 31 мая 2011, 14:45; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 11:08 [#1]:

Если возникают проблемы с левыми компонентами, то надо обращаться не сюда, а к аффтарам этих самых компонентов.
Ну вот как ты себе представляешь нашу помощь? Щас мы всё бросим, скачаем дружно этот компонент себе на компы, установим его в delphi, разберёмся, как он работает, и будем отлаживать твою прогу? Ты бы сам стал этим заниматься, если бы был на моём месте, а?
С другой стороны, странно, что для происка текста в файле вообще используется какой-то компонент. Можно ж всё вручную написать и заточить под свои нужды.

Щас посмотрю твой исходник, так и быть. Только переформатирую его в божеский вид...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

Driver_09 (статус: Посетитель), 30 мая 2011, 11:20 [#2]:

min@y™: ну естественно понимаю что этим мало кто займется)
Да я вот тоже вручную уже давно написал бы поиск слов)
а мне нужно именно этим компонентом, так как это тема курсача.
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™

min@y™ (статус: Доктор наук), 30 мая 2011, 11:27 [#4]:

Цитата (Driver_09):

Да я вот тоже вручную уже давно написал бы поиск слов) а мне нужно именно этим компонентом, так как это тема курсача.

Тема курсача - "Поиск текста в файлах с помощью компонента TATStreamSearch"???!!! Это в каком же ВУЗе придумывают такие темы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

Driver_09 (статус: Посетитель), 30 мая 2011, 11:37 [#5]:

min@y™: э, ну за совет по дебаггеру спасибо, посмотрю... а сама тема: Текстовый редактор, который шифрует и сжимает текст, а также выполняет поиск слов. и вот для шифрации и поиска дали 2 компонента, что бы ими воспользовался
Вадим К

Вадим К (статус: Академик), 30 мая 2011, 11:39 [#6]:

В том, где написали компонент TATStreamSearch - это же логично!
Галочка "подтверждения прочтения" - вселенское зло.
Driver_09

Driver_09 (статус: Посетитель), 30 мая 2011, 11:46 [#7]:

ну я как бы скопировал этот код из демонстрационного примера, который прилагался с этим компонентом.
Вот оттуда эти опции, кодировки, и исключения при неверном имени файла...
Но в принципе, оно у меня и выскакивает(
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 13:04 [#8]:

Цитата (Driver_09):

Но в принципе, оно у меня и выскакивает(

Ну шож ты сразу-то не сказал, что исключение генерируется! Самое главное - надо было сразу указать текст сообщения об ошибке.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

Driver_09 (статус: Посетитель), 30 мая 2011, 13:16 [#9]:

min@y™: ну могу написать что генерировалось...
Но я щас все-таки случайно наткнулся, где есть пример поиска с этим компонентом! только там вместо memo используется richedit, и вот там все работает) по-крайней мере поиск первого слова, а поиск следующего я думаю не проблема уже сделать)
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 13:27 [#10]:

Цитата (Driver_09):

ну могу написать что генерировалось...

Пиши давай. Дело тут не в мемо, а в кривых руках.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

Driver_09 (статус: Посетитель), 30 мая 2011, 13:35 [#11]:

м, не знаю как картинку вставить, но вот такое сообщение было: http://s007.radikal.ru/i301/1105/51/003bedd76d50.jpg
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 13:49 [#12]:

Теперь открой модуль ATStreamSearch.pas, найди строку 442 и скопируй сюда метод, в котором эта строка находится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

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™

min@y™ (статус: Доктор наук), 30 мая 2011, 19:02 [#14]:

Хы, ёпрст, а где ж вызов FindNext()? Или я слепой и не вижу?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

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™

min@y™ (статус: Доктор наук), 30 мая 2011, 19:27 [#16]:

Я этот компонент не знаю, но предположу, что метод FindFirst() запоминает параметры поиска, а FindNext() их потом использует.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Driver_09

Driver_09 (статус: Посетитель), 31 мая 2011, 14:45 [#17]:

min@y™: спасибо за внимание, я смог реализовать поиск слов этим компонентом)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.03 сек.