| 
| 
 | Вопрос # 5 343/ вопрос открыт / | 
 |  Здравствуйте!Я использую компонент ATStreamSearch для поиска слов в тексте. Но видимо я неправильно его использую, или может что-то еще, но он у меня не ищет эти слова.
 Помогите, пожалуйста, разобраться с ним.
 В архиве сам проект с программой, так же есть файлы от компонента.
 Компонент используется в Unit2.
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим {{code}} procedure TForm2.Find(AFindFirst: Boolean);var   Encoding: TATStreamSearchEncoding;   Options: TATStreamSearchOptions;   OK: Boolean;beginOK:=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™: спасибо за внимание, я смог реализовать поиск слов этим компонентом) |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |