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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2012, 13:01   #1
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию WebBrowser - Проверить наличие Hyperlink в Textrange

var WB_document:IHTMLDocument2;
TextRange1:IHTMLTxtRange;
begin
...
TextRange1:=(WB_document.selection. createRange as IHTMLTxtRange);

Как можно проверить является ли Textrange или его часть гиперссылкой или частью гиперссылки ?
AvRob вне форума Ответить с цитированием
Старый 10.07.2012, 12:32   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Как-то вот так:
Код:
var
   WB_document:IHTMLDocument2;
   TextRange1:IHTMLTxtRange;
   txtRangeParent : IHTMLElement;
   Link : IHTMLAnchorElement;
// ... 
   TextRange1:=(WB_document.selection. createRange as IHTMLTxtRange);
   txtRangeParent := TextRange1.parentElement;
   txtRangeParent.QueryInterface(IHTMLAnchorElement, Link);
   if Assigned(Link) then ShowMessage(Link.href);
// ...
volvo877 вне форума Ответить с цитированием
Старый 10.07.2012, 13:09   #3
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию

Спасибо.

Однако это не всегда даст верный ответ.

В ParentElement может быть несколько Link-ов, которые не будут иметь ничего общего с Textrange1.

Нужно проверить Textrange1 на пересечение с Link-ом и найти этот Link.
AvRob вне форума Ответить с цитированием
Старый 10.07.2012, 13:25   #4
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию

Код:
txtRangeParent := TextRange1.parentElement;
txtRangeParent.QueryInterface(IHTMLAnchorElement, Link);
if Assigned(Link) then ShowMessage(Link.href);
верно, когда selection совпадает с Link или находится внутри Link-а.

не верно, если какая-то часть selection находится вне Link-a.
AvRob вне форума Ответить с цитированием
Старый 10.07.2012, 14:27   #5
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

В таком случае, другого варианта, как сначала проверять приведенным выше способом (или через Supports(TextRange1.parentElement, IHTMLAnchorElement, Link), так даже проще), а если результат отрицательный - проверять TextRange1.htmlText на наличие тега '<A>', и вытаскивать руками из него href, я не вижу.

Можно, конечно, взять Children у родителя, пройти по всем дочерним элементам (возможно даже рекурсивно), и проверить, есть ли среди них Anchor-ы, но если есть, как ты IHTMLEmelent превратишь в IHTMLTxtRange, чтобы проверить свойством inRange, находится ли найденный среди дочерних элементов anchor внутри selection, или нет?
volvo877 вне форума Ответить с цитированием
Старый 10.07.2012, 15:30   #6
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию

Спасибо.

Наверное так и придется сделать.
AvRob вне форума Ответить с цитированием
Старый 10.07.2012, 17:07   #7
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Есть еще одна идея, проверь:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   WB_Doc : IHTMLDocument2;
   TR, TTR : IHTMLTxtRange;
   Element : IHTMLElement;
   i : Integer;
   Links : IHTMLElementCollection;
begin
   WB_Doc := WebBrowser1.Document as IHTMLDocument2;
   TR := (WB_Doc.selection.createRange as IHTMLTxtRange);

   Links := WB_Doc.links;
   TTR := (WB_Doc.body as IHTMLBodyElement).createTextRange;

   for i := 0 to links.length - 1 do
   begin
      Element := links.item(i, varEmpty) as IHTMLElement;
      if Assigned(Element) then
      begin
         TTR.moveToElementText(Element);
         if ((TTR.compareEndPoints('StartToStart', tr) = 1) and
             (TTR.compareEndPoints('StartToEnd', tr) = -1)) or
            ((TTR.compareEndPoints('EndToStart', tr) = 1) and
             (TTR.compareEndPoints('EndToEnd', tr) = -1)) then
         begin
            ShowMessage((Element as IHTMLAnchorElement).href);
         end;
      end;
   end;
end;
По идее должно выдавать все линки, находящиеся внутри selection.
volvo877 вне форума Ответить с цитированием
Старый 10.07.2012, 20:00   #8
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию

Так оно и есть!

Работает отлично, то что нужно!!

Спасибо!
AvRob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить наличие программы googl Общие вопросы Delphi 13 22.03.2012 16:14
Проверить на наличие изображения Nikolay-1989 БД в Delphi 1 15.03.2011 08:21
Проверить наличие устройства Hulkus Помощь студентам 0 27.02.2011 23:50
Проверить наличие eng символов? alco84 Microsoft Office Access 4 08.04.2010 11:08
Проверить наличие запроса? alco84 Microsoft Office Access 2 25.03.2010 22:56