Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Поиск по каждому слову.


Автор: Sergmzk 2.4.2008, 06:45
Добрый день.
Подскажите, не могу сообразить, в RicheDit набран какой то текст, нужно перебирая все слова сверить их с базой, по первому я сделал так, а как сделать чтобы он перебирал по каждому слову.


Код

procedure TForm1.Button1Click(Sender: TObject);
var 
  StartPos, Position, Endpos, i: Integer;
  SearchText, f1: string;
begin

//------------------------------------------
f1:=leftStr(RichEdit1.Text,Pos(' ',RichEdit1.Text)-1);
SearchText:=f1;
StartPos := 0;
  with RichEdit1 do
  begin
   Query1.First;
    Endpos := Length(RichEdit1.Text);
    Lines.BeginUpdate;
    while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos   := Length(RichEdit1.Text) - startpos;
      Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
    begin
      for i:=1 to Query1.RecordCount do
      begin
        if Query1['TXT1']=SearchText then
        Memo1.Text:=Query1['P_K'];
        Query1.Next;
      end;
    end;
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart  := Position;
      SelLength := Length(SearchText); 
    end;
    Lines.EndUpdate;
  end;
//-------------------------------------------

end;




M
Alexeis
Модератор: используйте подсветку кода.

Автор: 1Andrey1 2.4.2008, 12:19
я решал подобную задачу при помощи компонента http://regexpstudio.com/RU/, в итоге получается нечто похожее на это:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
RegExpr : TRegExpr;
i:integer;
begin
RegExpr := TRegExpr.Create();//создаем экземпляр TRegExpr
RegExpr.Expression := ' ';//в качестве регулярного выражения(у нас - разделителя) задаем пробел
regexpr.Split(RichEdit1.Text,memo1.Lines);// в каждую строку memo добавляем каждое слово после пробела

for I := 0 to memo1.Lines.Count - 1 do
  begin  //перебираем все строки и для каждой делаем запрос в базу на SQL
    Query1.Active:=false;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT *');//показать всё
    Query1.SQL.Add('FROM tablename');//из таблицы "tablename"
    Query1.SQL.Add('WHERE fieldname LIKE '''+memo1.Lines[i]+'''');//если поле "fieldname" содержит memo1.Lines[i] 
    Query1.Active:=true;

{Здесь можно проверить, если recordcount у Query больше ноля, значит такое слово в базе есть}
  end;
end;


Надеюсь я правильно понял вопрос...

Автор: MetalFan 2.4.2008, 12:35
Цитата(1Andrey1 @  2.4.2008,  12:19 Найти цитируемый пост)
нечто похожее на это:

только бы убить еще не забыть TRegExpr созданный. а вообще есть в них функция SplitRegExpr

Автор: 1Andrey1 2.4.2008, 12:44
Цитата(MetalFan @  2.4.2008,  12:35 Найти цитируемый пост)
только бы убить еще не забыть TRegExpr созданный. а вообще есть в них функция SplitRegExpr


ну тогда, нечто похожее на это smile

Код

procedure TForm1.Button1Click(Sender: TObject);
var
RegExpr : TRegExpr;
i:integer;
begin
RegExpr := TRegExpr.Create();
SplitRegExpr(' ',RichEdit1.Text,memo1.Lines);
RegExpr.Free;
for I := 0 to memo1.Lines.Count - 1 do
  begin
    Query1.Active:=false;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT * FROM tablename WHERE artist LIKE '''+memo1.Lines[i]+'''');
    Query1.Active:=true;
    {необходимые проверки и действия}
  end;
end;


там еще многое будет зависеть от текста набранного в RichEdit, если например в тексте будут служебные символы или знаки препинания, то от них прийдется заранее избавляться отдельной процедуркой

Автор: Rennigth 2.4.2008, 12:49
Цитата(1Andrey1 @  2.4.2008,  12:44 Найти цитируемый пост)
ну тогда, нечто похожее на это 

ну тогда нечто похожее на ЭТО  smile 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SplitRegExpr(' ',RichEdit1.Text, memo1.Lines);
  for I := 0 to memo1.Lines.Count - 1 do
  begin
    Query1.Active:=false;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT * FROM tablename WHERE artist LIKE '''+memo1.Lines[i]+'''');
    Query1.Active:=true;
    {необходимые проверки и действия}
  end;
end;


Автор: 1Andrey1 2.4.2008, 12:54
Цитата(Rennigth @  2.4.2008,  12:49 Найти цитируемый пост)
ну тогда нечто похожее на ЭТО  


ух ты, точно smile

Автор: MetalFan 2.4.2008, 14:10
а вообще использовать для такой простой задачи регулярки - это имхо перебор...
есть же функция ExtractStrings. ну или заменить пробелы на sLineBreak и присвоить TStrings.Text

Автор: Sergmzk 3.4.2008, 04:30
Большое спасибо, помогло, накоплю постов - прибавлю репутацию.

Автор: Sergmzk 3.4.2008, 08:31
Так а можно ещё спросить, а как можно в этом случае ещё разделять слова если и точка и пробел и запятая к примеру или дополнительно ещё раз текст прогонять.


update
всё оказалось очень просто. спасибо ещё раз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)