Вообще можно было бы оставить только 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 не требуется. Холостых срабатываний не будет - теперь цвет красится при потере фокуса и сбрасывается цвет у текста при получении фокуса. Называется "сделай своими руками фичу, имеющуюся во всех браузерах, у единственного браузера в мире, у которого её нет"