Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 18:46   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию Поиск текста с позиции найденного слова "+1"

Всем привет! Такое вот замысловатое название темы. Но, суть вопроса попроще будет. Итак, есть некий файл. В нем есть какой-то текст, с небольшими элементами таблицы, который в формате RTF и грузится в RichEdit (это сделано). Есть 3 слова-выражения, от которых должен "отталкиваться" поиск. Эти три слова-выражения находятся друг за другом, но между ними заключен некий текст. Например, есть выражение в тексте "в отношении ", которое сначала нужно найти, а потом скопировать все, что идет после этого выражения до второго ключевого слова. Потом от второго ключевого слова до третьего. Потом от третьего одно слово (одно т.к. там идет только номер и все). Скопированные тексты между ключевыми словами скопировать куда-нибудь, например в эдиты. Пока я сделал удаление пробелов через ReplaceAll и поиск текста через компонент FindDialog1:
Код:
procedure TForm1.dlgFind1Find(Sender: TObject);
var
 FoundAt: LongInt;
 StartPos, ToEnd: Integer;
begin
 with sRichEdit1 do
 begin
  if SelLength <> 0 then
     StartPos := SelStart + SelLength
  else
  StartPos := 0;
  ToEnd := Length(Text) - StartPos;
  FoundAt := FindText(Form1.dlgFind1.FindText, StartPos, ToEnd, [stMatchCase]);
  if FoundAt <> -1 then
   begin
    SetFocus;
    SelStart := FoundAt;
    SelLength := Length(Form1.dlgFind1.FindText);
   end;
 end;
end;
вызов диалога:
Код:
procedure TForm1.sSpeedButton4Click(Sender: TObject);
begin
 Form1.dlgFind1.Execute;
 Form1.dlgFind1.FindText:=' ' + Form1.sRadioButton2.Caption + ' ';
end;
Возникло несколько вопросов:
1. Как скрыть диалог, чтобы он не появлялся, а поиск работал?
2. Почему не срабатывает строка кода
Код:
Form1.dlgFind1.FindText:=' ' + Form1.sRadioButton2.Caption + ' ';
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.04.2011, 19:00   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

т.е. в RichEdit находится что-то подобное:
Цитата:
<Left>left Text<Center>center text<right>1
и нужно вытащить:
left Text
center text
1

и распихать по контролам?
Человек_Борща вне форума Ответить с цитированием
Старый 08.04.2011, 19:03   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Ага, верно понял меня. Есть идеи как это сделать? Код который я привел выше, ищет слово введенное через диалог только.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.04.2011, 19:37   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Да есть,
AnsiPos,Copy,Delete вот реализация:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  aMsg = '<Left>left Text<Center>center text<right>1';
  a1 = '<Left>';
  a2 = '<Center>';
  a3 = '<right>';
var
  sTemp: string;
  p: Integer;
  ResultS: string;
begin
  sTemp := aMsg;
  //ищем первый слово
  p := AnsiPos(a1, sTemp);
  //Копируем(Позиция слова+длинная слова, кол-во коп. знаков(Позция второго слова - длинная этого слова +1))
  ResultS := Copy(sTemp, p + Length(a1), AnsiPos(a2, sTemp) - Length(a2) + 1);
  //Удаяем скопированный участок, и повторяем схуму
  Delete(sTemp, p, AnsiPos(a2, sTemp) - 1);

  //Получаем текст между center & Right
  p := AnsiPos(a2, sTemp);
  ResultS := ResultS + ' ' + Copy(sTemp, p + Length(a2), AnsiPos(a3, sTemp) - Length(a3) - 2);
  Delete(sTemp, p, AnsiPos(a3, sTemp) - 1);

  //Получаем последнее
  p := AnsiPos(a3, sTemp);
  ResultS := ResultS + ' ' + Copy(sTemp, p + Length(a3), 1);
  Delete(sTemp, p, Length(a3));

  ShowMessage(ResultS);
end;
если 2 тега, то можно ещё упростить до такого:
Код:
//фантизия закончилась ;)  На имена функций
function GetText1(OpenTag,aText,CloseTag:string):string;
begin
  Result:=Copy(aText,AnsiPos(OpenTag,aText)+Length(OpenTag),AnsiPos(CloseTag,aText)-Length(CloseTag)-1);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(GetText1('<1>',Edit1.Text,'<2>'));
end;

Последний раз редактировалось Человек_Борща; 08.04.2011 в 20:08. Причина: правка кода первого варианта
Человек_Борща вне форума Ответить с цитированием
Старый 09.04.2011, 09:44   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Код отличный и работает вроде бы как надо). Только один вопрос: после третьего тэга добавляется весь текст, который идет после слова, идущего за третьим тэгом. Не могу найти в коде где убрать, чтобы остальной текст не добавлялся. Покажи где подправить? А так, работает вроде как надо). Чтобы бралось только одно слово идущее после третьего тэга.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 09.04.2011, 12:17   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
после третьего тэга добавляется весь текст, который идет после слова, идущего за третьим тэгом.
не, неправда Ваша..
после третьего тега добавляется исключительно ОДНА БУКВА из текста!
Цитата:
Код:
  ResultS := ResultS + ' ' + Copy(sTemp, p + Length(a3), 1);
Добавлено
выделить одно слово от третьго ключа до первого пробела можно так:
Код:
  //Получаем последнее
  p := AnsiPos(a3, sTemp);
  sTemp := Copy(sTemp, p + Length(a3), Length(sTemp) - p - Length(a3)+ 1);
  if Pos(' ', sTemp)>1 then
     ResultS := ResultS + ' ' + Copy(sTemp, 1, Pos(' ', sTemp)-1);
  ShowMessage('Last word = ' +  Copy(sTemp, 1, Pos(' ', sTemp)-1)  );

Последний раз редактировалось Serge_Bliznykov; 09.04.2011 в 14:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2011, 14:52   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Полный код будет такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  aMsg = '<Left>left Text<Center>center text<right>1';
  a1 = '<Left>';
  a2 = '<Center>';
  a3 = '<right>';
var
  sTemp: string;
  p: Integer;
  ResultS: string;
begin
  sTemp := aMsg;
  //ищем первый слово
  p := AnsiPos(a1, sTemp);
  //Копируем(Позиция слова+длинная слова, кол-во коп. знаков(Позция второго слова - длинная этого слова +1))
  ResultS := Copy(sTemp, p + Length(a1), AnsiPos(a2, sTemp) - Length(a2) + 1);
  //Удаяем скопированный участок, и повторяем схуму
  Delete(sTemp, p, AnsiPos(a2, sTemp) - 1);

  //Получаем текст между center & Right
  p := AnsiPos(a2, sTemp);
  ResultS := ResultS + ' ' + Copy(sTemp, p + Length(a2), AnsiPos(a3, sTemp) - Length(a3) - 2);
  Delete(sTemp, p, AnsiPos(a3, sTemp) - 1);

//Получаем последнее
  p := AnsiPos(a3, sTemp);
  sTemp := Copy(sTemp, p + Length(a3), Length(sTemp) - p - Length(a3)+ 1);
  if Pos(' ', sTemp)>1 then
     ResultS := ResultS + ' ' + Copy(sTemp, 1, Pos(' ', sTemp)-1);
  ShowMessage('Last word = ' +  Copy(sTemp, 1, Pos(' ', sTemp)-1)  );
end;
????
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 09.04.2011, 15:03   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

в принципе я и так знал что, чтобы найти последнее слово надо чтобы после последнего было что-нибудь, что отделяет это слово от остального. Возможно это пробел. Что собственно и делается.

, да код дополнен приавильно и работает.
Человек_Борща вне форума Ответить с цитированием
Старый 09.04.2011, 15:35   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Не, а у меня он как-то не так работает. У меня в сообщении выводится самое первое слово в тексте. Если не трудно, то покажите полностью код? А то может я неправильно располагаю что-то.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 09.04.2011 в 15:40.
artemavd вне форума Ответить с цитированием
Старый 09.04.2011, 16:04   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как вариант
Код:
const a: array [1..4] of String = ('<Left>','<Center>','<right>',' ');
var i,j,k: Integer;
    s,ResultS: string;
begin
  ResultS:='';
  s:='...<Left>left Text<Center>center text<right>12 ...';
  for i:=1 to 3 do begin
    j:=Pos(a[i],s);
    if j=0 then Break;
    k:=Pos(a[i+1],s);
    if (k=0) or (k<j) then Break;
    ResultS:=ResultS+Copy(s,j+Length(a[i]),k-j-Length(a[i]))+' ';
    s:=Copy(s,k,Length(s)-k);
  end;
  if ResultS<>'' then ResultS:=Copy(ResultS,1,Length(ResultS)-1);
  ShowMessage(ResultS);
end;
или боле точно
Код:
const a: array [1..4] of String = ('<Left>','<Center>','<right>',' ');
var i,j: Integer;
    s,ResultS: string;
begin
  ResultS:='';
  s:='...<Left>left Text<Center>center text<right>12 ...';
  for i:=1 to 3 do begin
    j:=Pos(a[i],s);
    if j=0 then Break;
    s:=Copy(s,j+Length(a[i]),Length(s)-j-Length(a[i])+1);
    j:=Pos(a[i+1],s);
    if (j=0) and (i<3) then Break;
    if j=0 then ResultS:=ResultS+s+' '
           else ResultS:=ResultS+Copy(s,1,j-1)+' ';
    s:=Copy(s,j,Length(s)-j+1);
  end;
  if ResultS<>'' then ResultS:=Copy(ResultS,1,Length(ResultS)-1);
  ShowMessage(ResultS);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.04.2011 в 16:19.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти слова, в которых доля букв "а" и "е" минимальна. Андрей_ка Паскаль, Turbo Pascal, PascalABC.NET 0 10.10.2010 16:56
все слова с нечетным количеством букв подходят для "ёлочной" рекурсии. Все буквы слова расположены в форм no_to Помощь студентам 0 04.01.2010 16:06
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12