Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Нужно отобразить 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
14-1094642393
WondeRu
2004-09-08 15:19
2004.09.26
О срывах проектов


1-1094928058
mrald
2004-09-11 22:40
2004.09.26
PopupMenu другого цвета


1-1094046629
Heretic
2004-09-01 17:50
2004.09.26
Регистрация Ehlib


1-1094569297
Боян Георгиев
2004-09-07 19:01
2004.09.26
Проблем с конструктором


1-1094556792
greenrul
2004-09-07 15:33
2004.09.26
миграция с Delphi на Cbuilder