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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2008, 16:17   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию FindDialog - обратный поиск текста

Непонятно как прикрутить обратный(Вверх) поиск фразы к исходнику(здешнее Memo не TMemo, а TSynMemo):
Код:
procedure TForm1.FndDlg1Find(Sender: TObject);
var
   Sens :Boolean; // чувствительность к регистру
   Buff,P,FT :PChar;
   BuffLen :Word;
begin // поиск
 with (Sender As TFindDialog) do
 begin
  Sens := (frMatchCase in Options);
  GetMem(FT, Length(FindText) + 1);
   StrPCopy(FT, FindText);
   BuffLen := memo1.GetTextLen + 1;
  GetMem(Buff, BuffLen);
   Memo1.GetTextBuf(Buff, BuffLen);
 {начало поиска}
   P := Buff + Memo1.SelStart + Memo1.SelLength;

 If Sens then // Регистр
 begin
  If (frDown in Options) then
   P :=  StrPos(P, FT)
  Else
   {Обратно};
 end
  else
 begin
  If (frDown in Options) then
   P :=  StrPos(AnsiStrLower(P), AnsiStrLower(FT))
  Else
   {Обратно};
 end;
 
 if P = nil then
 begin
  MessageBox(Handle, PChar('Не удаётся найти "'+FindText+'"'), 'Блокнот',
             MB_OK+MB_ICONINFORMATION);
 end
  else
 begin
  memo1.SelStart := P - Buff;
  memo1.SelLength := Length(FindText);
 end;
  FreeMem(FT, Length(FindText) + 1);
  FreeMem(Buff, BuffLen);
 end;
  Memo1.SetFocus;
end;
Alter вне форума Ответить с цитированием
Старый 16.12.2008, 17:25   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Никак нельзя изменить/добавить сюда чтобы осуществить обратный поиск-ВВЕРХ?
Alter вне форума Ответить с цитированием
Старый 17.12.2008, 15:07   #3
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Я, когда делал обратный поиск, выворачивал строку на изнанку при помощи AnsiReverseString и в ней осуществлял поиск. Надеюсь разберетесь. Вот функция поиска из моей программы:


Код:
function TForm1.FFindNext(): boolean;
var s, s1: PChar;
 //переменная для области поиска
 MyTxt: string;
 //преобразованная строка поиска
 NewFindTxt: string;
 //начальная точка поиска
 StartFind: CARDINAL;
 //длина области поиска
 LenFind: cardinal;
 //найденное выделение
 SelFind : CARDINAL;

begin
 //если нет стоки поиска - выйти
 if Length(FindTxt)<=0 then
  begin
   ShowMessage('Не задана строка поиска.');
   result:=False;
   Exit;
  end;

 ...

 ...

 //строка поиска
 NewFindTxt:=FindTxt;

 //область поиска
 if frDown in FindOpt then
  //поиск вниз
  begin
   StartFind:=Memo1.SelStart+Memo1.SelLength+1;
   LenFind:=Length(Memo1.Text)-StartFind;
   MyTxt:=copy(Memo1.Text,StartFind,LenFind);
  end
 else
  //поиск вверх
  begin
   StartFind:=Memo1.SelStart;
   MyTxt:=copy(Memo1.Text,0,StartFind);
   //реверс области поиска
   MyTxt:=AnsiReverseString(MyTxt);
   //реверс строки поиска
   NewFindTxt:=AnsiReverseString(NewFindTxt);
  end;

 ...

 ...

 //выделение найденного
 SelFind:=pos(NewFindTxt,MyTxt);
 //если не найдено
 if SelFind=0 then
  begin
   ShowMessage('Строка не найдена');
   Result:=False;
   Exit;
  end;

...

 if frDown in FindOpt then
  //поиск вниз
  begin
   Memo1.SelStart:=StartFind+SelFind-2;
   Memo1.SelLength:=Length(FindTxt);
  end
 else
  //поиск вверх
  begin
   Memo1.SelStart:=Memo1.SelStart+1-SelFind-Length(FindTxt);
   Memo1.SelLength:=Length(FindTxt);
  end;
 Result:=True;
end;
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 18.12.2008 в 05:30. Причина: убраны элементы, не относящиеся к вопросу
Andrei вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема поиск и замена текста(Delphi) KirkMETAL Помощь студентам 4 26.07.2010 08:41
FindDialog ,ReplaceDialog Bayram_662 Компоненты Delphi 8 16.12.2008 16:59
Поиск текста в строке CoDeR Общие вопросы Delphi 8 02.10.2007 01:01
Поиск и замена текста в файле VAbramyak Общие вопросы Delphi 3 04.04.2007 20:20
поиск и замена текста в RichEdit Vasya Помощь студентам 11 16.03.2007 06:48