Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TWebBrowser, поиск текста, "Найти вперед" и "Найти назад" 
:(
    Опции темы
RaIDeR
Дата 13.7.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Здравствуйте все ! Я нашел хороший код поиска текста в докементе загруженном
в браузер, вот собственно сам код:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Doc, Txt: Variant;
begin
  if edit1.Text = '' then Exit;
  Doc := Browser.Document;
  Txt := Doc.Body.CreateTextRange;
  if not Txt.FindText(edit1.Text) then Exit;
  while edit1.Text > '' do
  begin
    Txt.FindText(edit1.Text);
    Txt.ExecCommand('BackColor', '', 'yellow');
    Txt.ExecCommand('ForeColor', '', 'red');
    Txt.ExecCommand('Bold');
    Txt.ScrollInToView;
    Txt.Collapse(false);
    if not Txt.FindText(edit1.Text) then Break;
  end;
end;


Всё бы хорошо, но данный код находит и выделяет весь текст найденый
в документе, а как сделать типа "Найти вперед" и "Найти назад" ?
И снять старое выделение ?
PM MAIL   Вверх
_hunter
Дата 13.7.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



как искать вперед/назад:
Цитата

bFound = TextRange.findText(sText [, iSearchScope] [, iFlags])
Parameters

sText Required. String that specifies the text to find.
iSearchScope Optional. Integer that specifies the number of characters to search from the starting point of the range. A positive integer indicates a forward search; a negative integer indicates a backward search. 
iFlags Optional. Integer that specifies one or more of the following flags to indicate the type of search: 0 Default. Match partial words.
1 Match backwards.
2 Match whole words only.
4 Match case.
131072 Match bytes.
536870912 Match diacritical marks.
1073741824 Match Kashida character.
2147483648 Match AlefHamza character.


как снять старое выделение: перед закрашиванием запомни цвета и перед новым поиском закрасть текст этими цветами


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RaIDeR
Дата 13.7.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Своими знания англ. вот как я это перевёл:

Цитата

sText - Строка которую нужно найти.
iSearchScope - Целое число определяющее кол-во символов для поиска с диапозона стартовой точки,
положительное число указывает на поиск вперёд, отрицательное - назад.
iFlags - Целое число которое определяет одно или более кол-во флагов для того чтобы указать тип поиска.
Параметры iFlags:
0 - По умолчанию/Соответствующее части слова
1 - Задом наперед.
2 - Только целое слово ???
4 - Соответсвующее регистру ???
131072 - ???
536870912 - ???
1073741824 - ???
2147483648 - ???


Приведи ПОЖАЛУЙСТА пример поиска, а то здаётся мне я всё не так понял smile И покажи как нужно сохранять цвет. smile

Это сообщение отредактировал(а) RaIDeR - 13.7.2005, 15:52
PM MAIL   Вверх
December
Дата 13.7.2005, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Цитата(_hunter @ 13.7.2005, 14:22)
1 Match backwards.

1 Искать назад


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
RaIDeR
Дата 14.7.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Помогите разобраться ! smile Я в этом ничё понять не могу smile

Исходя из выше показанного:
Цитата

TextRange.findText(sText [, iSearchScope] [, iFlags])


Получается примерно такой запрос:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  Doc, Txt: Variant;
begin
Doc := Browser.Document;
Txt := Doc.Body.CreateTextRange;

Txt.FindText(edit1.Text, Legnth(edit1.Text), 0); // <<--- Вот он :)


В итоге получается полная фигня ... smile smile smile
PM MAIL   Вверх
RaIDeR
Дата 15.7.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Вот какой ёще я нашёл код:
Код
 
procedure TForm1.edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Txt: IHTMLTxtRange; // Выжный момент, вместо Variаnt --> IHTMLTxtRange
begin
if key = VK_RETURN then
begin

  if edit1.Text = '' then Exit;

  Txt := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;

  Txt.findText(edit1.Text, Length(edit1.Text), 0); // <-- Вот сам поиск
  Txt.pasteHTML('<span style="background-color: Lime; font-weight: bolder;">' + Txt.htmlText + '</span>');  //Set the highlight, now background color will be Lime
  Txt.scrollIntoView(True);

end;
end;

Этот код вроде правельный, ищет вперед и назад, но как сделать поск пошагово ?
Т.е чтоб он продолжался с той позиции на которой он остановился при последнем
поиске ? Помогите плиз smile
PM MAIL   Вверх
RaIDeR
Дата 15.7.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Ура !!! Я понял как сохранять позицию smile smile smile У IHTMLTxtRange есть
св-во text - вот его то как раз нудо запоминать, вот код:

Код

uses MSHTML;
...
private
  SourceText: WideString; // Сюда я сохраняю text
  TextRange: IHTMLTxtRange; // Сам диапозон
...

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BrowserNavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
SourceText := ''; 
TextRange := ((Browser.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  if edit1.Text = '' then Exit;

  if SourceText <> '' then TextRange.text := SourceText; // Восстанавливаем позицию

  TextRange.findText(edit1.Text, 1, 0); // Ищем текст
  SourceText := TextRange.text; // Запоминаем позицию
  TextRange.select;  // Выделяем текст
  TextRange.scrollIntoView(True);

end;

Таким образом я организовал поиск вперед, но как искать назад ???
Цитата

1 Match backwards.

Не работает smile
PM MAIL   Вверх
RaIDeR
Дата 18.7.2005, 18:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 2
Всего: 4



Хе Хе Хе, Я сделал ЭТО smile smile smile Вот какую процедуру Я накатал:

Код

procedure WBFindText(Browser: TWebBrowser; const Direction: Boolean; const FText: String;
  const SearchScope, Flags: Integer);
var
  Doc: IHTMLDocument2;
  SelObj: IHTMLSelectionObject;
  SelRange: IHtmlTxtRange;
begin

  Doc := Browser.Document as IHTMLDocument2;
  SelObj := Doc.Selection;
  SelRange := SelObj.CreateRange as IHTMLTxtRange;

  SelRange.Collapse(Direction);

  if SelRange.FindText(FText, SearchScope, Flags) then
  begin
    SelRange.Select;
    SelRange.ScrollIntoView(True);
  end
    else MessageBox(Handle, 'По Вашему запросу ничего не найдено', 'Поиск текста', MB_ICONINFORMATION);

end;


Использование:

WBFindText(MyCoolBrowser, False, 'MyCoolText', 1, 0); // Найти вперед

WBFindText(MyCoolBrowser, False, 'MyCoolText', 1, 0 or 4); // Найти вперед + чуствительность к регистру

WBFindText(MyCoolBrowser, True, 'MyCoolText', - 1, 1); // Найти назад

WBFindText(MyCoolBrowser, True, 'MyCoolText', - 1, 1 or 4); // Найти назад + чуствительность к регистру
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.