Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Webbrowser выделение элементов


Автор: KAMIKAZE 24.1.2010, 19:56
Помогите реализовать подобную функцию как в опере: 
Даже не знаю, в какую сторону копать, можно ведь если искать просто текст и выделять его, но если имеется одинаковый текст в коде, выделение тогда сработает на первом попавшемся найденном слове.
http://img24.imageshack.us/i/35663313.jpg/

Автор: ZVano 14.2.2010, 16:36
Нужно используя DOM найти нужный элемент "<li> Действия модераторов ... </li>" и назначить ему свойство border="2px solid black". 
Должно получиться:
<li border="2px solid black"> Действия модераторов ... </li>

Автор: KAMIKAZE 14.2.2010, 23:14
Первый вопрос: как? Второй - а что если текст будет встречаться? Например: <b>bla bla<b>blabla<b>  - пользователь выделяет "bla" в случае где написано слитно "blabla" - как выделить именно этот текст ?

И еще - должно ведь быть взаимное выделение т.е. когда  в коде выделил - подсветится в браузере и наоборот.

Автор: ZVano 15.2.2010, 10:31
Поиск текста при помощи парсинга. 
Если выделить нужно часть текста, то заключаеш его в DIV или SPAN, которому назначаеш стиль.
Код

<body>
<table>
<tr>
<td>
  <b>123 123<b>123124<b>
</td>
</tr>
<tr>
<td>
   1234567890 -1234 12 34
</td>
</tr>
</table>
</body>


Ищем 1234. Получаем
Код

<body>
<table>
<tr>
<td>
  <b>123 123<b>123124<b>
</td>
</tr>
<tr>
<td>
   <SPAN border="2px solid black">1234</SPAN>567890 -1234 12 34
</td>
</tr>
</table>
</body>


Т.е. заменяем содержимое контейнера <td>
<td>1234567890 -1234 12 34</td>
на 
<td><SPAN border="2px solid black">1234</SPAN>567890 -1234 12 34</td>


Если нужно снимать выделение, то нужно запомнить что и где подменяли. 
А можно назначить свой атрибут-флаг:
<td><SPAN border="2px solid black" MyAttribute="TemporaryContainer">1234</SPAN>567890 -1234 12 34</td>
Затем пройтись по всем контейнерам и проверить наличие атрибута "MyAttribute".

Автор: KAMIKAZE 16.2.2010, 01:42
Это понятно, но как правильно искать если есть дубликаты? 
Код

<body>
<table>
<tr>
<td>
  <b>bla bla 123 123<b>123124<b>
</td>
</tr>
<tr>
<td>
  <b>123 bla bla 123 <b>вапвапвапвап<b>    -  // пользователь выделяет именно этот текст в браузере, я к чему клоню - можно ли как то получить точный указатель на выделенный текст, по другому будут проблемы с дубликатами...
</td>
</tr>
<tr>
<td>
   1234567890 -1234 12 34
</td>
</tr>
</table>
</body>


Автор: ZVano 16.2.2010, 10:29
Цитата

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

Думал, что тебе нужно сделать подсветку всех вхождений искомого текста (как в Opera AC и Mozilla).
А оказалось, нужно подсветить именно выделеный пользователем фрагмент.
Точного ответа у меня нет. 
Знаю лиш, что сам выделеный текст доступен через
range = Document.Selection.createRange() 
range типа TextRange

Отсюда и надо копать. Посмотри в справочнике информацию о TextRange.

Автор: KAMIKAZE 16.2.2010, 11:59
Попробую поискать, спс. А вот еще интересный вопрос: когда  в Opera включается режим Developer tools, то клики по ссылкам не работают т.е. не выполняется любая навигация, это чем то похоже на режим редактирования в Webbrowser1. Как перевести в такой режим Webbrowser1?

Автор: ZVano 17.2.2010, 17:05
Цитата

Как перевести в такой режим Webbrowser1?


У WebBrowser есть событие "BeforeNavigate2". Его и нужно обрабатывать.
Код

procedure TForm2.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
  var Cancel: WordBool);
begin
  if (Условие, проверяющее на прерывание навигации) then begin
    Cancel := True;
    Exit;
  end;
end;


PS: Скачай полную базу знаний с http://drkb.ru/ В ней есть ответы на большую часть вопросов.

Автор: KAMIKAZE 18.2.2010, 01:36
Я так уже делал. 
Навигейтим на сайт _http://www.yandex.ua/ затем ставим флаг на cancel - ссылки не пашут, но если кликнуть по картинке

http://img716.imageshack.us/i/90948586.jpg/

то будет выполнена навигация. Нужно больше "кенселить"... но вот что и как?

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