Показать сообщение отдельно
  #13  
Старый 02.03.2017, 12:26
Droltromed Droltromed вне форума
Прохожий
 
Регистрация: 22.02.2017
Сообщения: 9
Версия Delphi: Delphi XE10
Репутация: 10
По умолчанию

Вообще можно было бы оставить только OnActivate и OnDeactivate, но для этого в OnActivate вместо
Код:
SelObj:= (Form13.WebBrowser1.Document as IHTMLDocument2).selection;
Нужно получать не selection, а весь текст из браузера, чтобы снять с него цвет, включая и ту часть, где был цвет действительно был. Тогда будет незачем так излишне трястись за сохранение выделения перед его потерей.
Но проблема в другом, как этой переменной внести не selection, а весь текст целиком? Пробовал вместо .selection что-нибудь в стиле .text, .all или вообще убирать - не принимает. Впрочем, сама переменная подразумевает получение IHTMLSelectionObject. Можно ли как-то SelRange подсунуть не IHTMLSelectionObject, а конкретно body, toString или какой-нибудь другой вид всего текста разом?


UPD: нашёл решение:
В ApplicationEvents.OnActivate вписываем:
Код:
var SelRange: IHtmlTxtRange;
begin
 SelRange:=((WebBrowser1.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange; //получаем весь текст
 SelRange.execCommand('BackColor', false, 'false'); //сбрасываем цвет у всего текста
end;

В ApplicationEvents.OnDeactivate, соответственно, остаётся:
Код:
var
 SelObj: IHTMLSelectionObject;
 SelRange: IHtmlTxtRange;
begin
 SelObj:= (WebBrowser1.Document as IHTMLDocument2).selection;
 SelRange:= SelObj.CreateRange as IHtmlTxtRange;
 SelRange.execCommand('BackColor', false, '#FFCC00'); //устанавливаем цвет выделенной части
end;
И готово. OnMessage не требуется. Холостых срабатываний не будет - теперь цвет красится при потере фокуса и сбрасывается цвет у текста при получении фокуса. Называется "сделай своими руками фичу, имеющуюся во всех браузерах, у единственного браузера в мире, у которого её нет"
Ответить с цитированием