Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизНужно отобразить HTML Найти похожие ветки
← →
BPK (2004-09-09 11:52) [0]Задача:
ВНУТРИ программы (в константе типа string), а не в виде отдельного файла имеется текст справки в виде кода HTML. Нужно отобразить по нажатию кнопки.
Код содержит таблицы.
Я пробовал преобразовать MSWord"ом в RTF и использовать TRichEdit, но последний ругается о невозможности интерпретировать такой код. Он ведь понимает только RTF версии 1.
Как отобразить?
Обязательное условие: справка должна представлять собой единое целое с программой.
← →
TUser © (2004-09-09 11:59) [1]WebBrowser1.Navigate2("about:"+YourString);
← →
Ihor Osov'yak © (2004-09-09 12:05) [2]1 вариант
procedure ShowHTML(aText: string);
var
v: Variant;
HTMLDocument: IHTMLDocument2;
begin
HTMLDocument := WebBrowser.DefaultInterface.Document as IHTMLDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := aText; // Here"s your HTML string
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
end;
2 вариант
function TForm1.LoadFromStream(const AStream: TStream): HRESULT;
begin
AStream.seek(0, 0);
Result := (WebBrowser1..DefaultInterface.Document as IPersistStreamInit).Load
(TStreamAdapter.Create(AStream));
end;
3 вариант (nikkie)var
Doc: Variant;
begin
Doc := WebBrowser1.DefaultInterface.Document;
Doc.write(aText);
end;
во всех вариантах какой-нибудь документ предварительно должен
быть уже загружен, например, через WebBrowser1.Navigate("about:blank") - с целью инициализации WebBrowser1.DefaultInterface.Document ;
← →
BPK (2004-09-09 13:00) [3]Ihor Osov"yak, я попробовал третий вариант. Работает.
TUser, твой вариант тоже работает, но страдает ограничением на длину String.
Всем спасибо.
← →
BPK (2004-09-10 15:44) [4]Дополнение:
Третий вариант от Ihor Osov"yak работает с MSIE версии 5.50.4134.0600IC и выше, а с 5.00.3502.1000 выдаёт ошибку защиты.
← →
Ihor Osov'yak © (2004-09-11 00:41) [5]2 [4] BPK (10.09.04 15:44)
Дополнение некоректно. Вывод сделан из Вашего мыла, сваливщегося мне на голову несколько минут назад (благо Вы гуглем пользоватся умеете.).
Разьяснение причины вашего заблуждения ушло мылом. Ключевые моменты дублирую сюда...
Итак. Вы именили мой код. Проигнорировав "во всех вариантах какой-нибудь документ предварительно должен быть уже загружен"
Итак ВАш код:
>Я попробовал два варианта загрузки html-кода из string:
TFrmHtmlHelp = class(TForm)
WB: TWebBrowser;
end;
>================== Первый вариант ============================procedure ShowHtmlHelp(Title,HelpStr:string);
var Frm:TFrmHtmlHelp;
v:Variant;
HTMLDocument: IHTMLDocument2;
begin
Frm:=TFrmHtmlHelp.Create(Application);
Frm.Caption:=Title;
Frm.WB.Navigate("about:blank");
HTMLDocument:=Frm.WB.DefaultInterface.Document as IHTMLDocument2;
v:=VarArrayCreate([0,0],varVariant);
v[0]:=HelpStr;
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
Frm.ShowModal;
Frm.Release;
end;</CODE
>================== Второй вариант ============================procedure ShowHtmlHelp(Title,HelpStr:string);
var Frm:TFrmHtmlHelp;
Doc:Variant;
begin
Frm:=TFrmHtmlHelp.Create(Application);
Frm.Caption:=Title;
Frm.WB.Navigate("about:blank");
Doc:=Frm.WB.DefaultInterface.Document;
Doc.Write(HelpStr);
Frm.ShowModal;
Frm.Release;
end;
>==============================================================
>Оба варианта работают одинаково, а именно:
>работают нормально с MSIE версии 5.50.4134.0600IC и выше, а у тех, у кого
>стоит MSIE 5.00.3502.1000 выдают ошибку защиты.
Мой комментарий:
Вероятно, проблема связана с тем, что более старые ИЕ выполняют
Frm.WB.Navigate("about:blank"); асинхронно,
а более новые - синхронно (есть такая особенность). Сдедовательно - старые
ИЕ не успевают сделать навигацию, и как следствие - инициализацию
Frm.WB.DefaultInterface.Document - и мы при первой же попытке запроса
интерфейса от Frm.WB.DefaultInterface.Document (посредством as) получаем
исключителльную ситуацию.
Для учета этого момента измените свой код так -
Frm.WB.Navigate("about:blank");
while Frm.WB.ReadyState < 4 do Application.ProcessMessages;
на более новых ИЕ навигация будет выполнятся синхронно, и цыкл ожидания
не будет крутиться, так как Frm.WB.ReadyState на момент проверки условия
цыкла будет уже 4, на более старых - немного поработает, пока не произойдет инициализация документа.
Удачи.
← →
Ihor Osov'yak © (2004-09-13 12:09) [6]> Попробовал. При таком подходе цикл вообще никогда не заканчивается.
>IE сначала проходит фазу READYSTATE_LOADING, а затем постоянно пребывает в READYSTATE_INTERACTIVE
Это значит, что вы делаете что о не так, причем это "что-то" мешает выполнению загрузки about:blank (достижению 4 для readyState).
Этим "что-то" может быть и тот факт, что Вы навигацию делаете до визуализации вебброузера. Иногда я наблюдал такое поведение, его особо не исследовал. Попытайтесь либо визуализировать форму перед Navigate("about:blank"), либо измените условие цыкла на while Frm.WB.ReadyState < 3 do Application.ProcessMessages;
так как достижение 3 (READYSTATE_INTERACTIVE) - достоточное условие для инициализации документа.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c