Исправление ошибки изменения размера шрифта в TWebBrowser
В статье рассматривается проблема, связанная с изменением размера шрифта выделенного текста в TWebBrowser компоненте, использующем команду FONTSIZE. Проблема заключается в возникновении ошибки EVariantTypeCastError при попытке получить текущий размер шрифта выделенного текста. Ошибка возникает при вызове метода queryCommandValue('FONTSIZE') для объекта IHTMLTxtRange.
Описание проблемы
Разработчик клиента электронной почты столкнулся с проблемой при изменении размера шрифта выделенного текста. При попытке изменить размер шрифта вверх или вниз, возникает ошибка EVariantTypeCastError с сообщением о невозможности преобразования значения типа Null в тип OleStr. Эта ошибка возникает при вызове метода TextRange.queryCommandValue('FONTSIZE').
Пример кода, который вызывает ошибку:
procedure TForm1.act_FontIncreaseExecute(Sender: TObject);
var
Selection: IHTMLSelectionObject;
HtmlPage: IHTMLDocument2;
TextRange: IHTMLTxtRange;
s: string;
i, mode: Integer;
begin
HtmlPage := self.HtmlEditor.Document as IHTMLDocument2;
Selection := HtmlPage.Selection;
TextRange := Selection.createRange as IHTMLTxtRange;
if (TextRange <> nil) then
begin
s := TextRange.queryCommandValue('FONTSIZE');
Val(s, i, mode);
if mode = 0 then
HtmlPage.execCommand('FONTSIZE', False, inttostr(i + 1))
end;
end;
Исходный HTML и его влияние на проблему
Проблема связана с использованием стиля FONT-SIZE в HTML. Если убрать стиль FONT-SIZE, ошибка не возникает. Это указывает на то, что проблема заключается именно в стиле FONT-SIZE. Пример HTML, который вызывает ошибку:
<P>
<SPAN style='FONT-SIZE: 7pt;'>
Test Text
</SPAN>
</P>
Разработчики нередко копируют данные из Outlook, Word и других приложений
Данные с этими стилями, например, color:red, не вызывают ошибок. В случае Outlook и Word, предпочтительно использовать CSS, что является современным подходом.
Подтвержденный ответ и его анализ
Ошибка возникает, когда команда queryCommandValue возвращает NULL. В этом случае вызов функции Val() приведет к ошибке. Рекомендуется настроить стандартный размер шрифта при получении NULL:
procedure TForm1.FontIncreaseExecute;
var
Selection: IHTMLSelectionObject;
HtmlPage: IHTMLDocument2;
TextRange: IHTMLTxtRange;
s: OleVariant;
i, mode: Integer;
begin
HtmlPage := WebBrowser1.Document as IHTMLDocument2;
Selection := HtmlPage.Selection;
TextRange := Selection.createRange as IHTMLTxtRange;
if (TextRange <> nil) then
begin
s := TextRange.queryCommandValue('FONTSIZE');
if VarisNull(s) then
s := 0; // Установка стандартного размера шрифта
Val(s, i, mode);
if mode = 0 then
HtmlPage.execCommand('FONTSIZE', False, inttostr(i + 1))
end;
end;
Альтернативные решения и практические рекомендации
Следует обратить внимание на то, что тег FONT устарел и не поддерживается в HTML5. Вместо него рекомендуется использовать CSS-стили. Если вы используете string вместо OleVariant для переменной s, то проверка VarisNull не будет работать. В таком случае, стоит обработать возможное исключение с помощью конструкции try...except.
Итоги
Для корректного изменения размера шрифта выделенного текста в TWebBrowser, необходимо обрабатывать случай возврата NULL при вызове queryCommandValue('FONTSIZE') и использовать современные CSS-стили. Пример кода должен использоваться с учетом типов данных и возможной обработки исключений.
Разработчик столкнулся с ошибкой при изменении размера шрифта выделенного текста в компоненте `TWebBrowser`, связанной с получением размера шрифта через метод `queryCommandValue('FONTSIZE')`, и ищет способ её исправления, учитывая уст
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.