Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.022 c
6-1090364380
MIGUR
2004-07-21 02:59
2004.09.26
ЧЕКЕР


4-1091517105
volser
2004-08-03 11:11
2004.09.26
Ярлыки


8-1088750197
maxistent
2004-07-02 10:36
2004.09.26
Поворот битмапа по/против часовой стрлк


14-1094732952
mfender
2004-09-09 16:29
2004.09.26
INDY Help


1-1094893452
AntiGen
2004-09-11 13:04
2004.09.26
Алгоритм случайного выбора без повтора




   Наверх