Главная страница
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.04 c
1-1094638585
Abajun
2004-09-08 14:16
2004.09.26
TreeView


14-1094562277
Holy
2004-09-07 17:04
2004.09.26
Сколько бы россиян так сделало?


1-1095000503
Gear
2004-09-12 18:48
2004.09.26
Как сделать, чтобы форму нельзя было закрыть и уничтожить пока


14-1094803291
Pat
2004-09-10 12:01
2004.09.26
Клиент для форумов, использующих phpBB


3-1093861707
Kein
2004-08-30 14:28
2004.09.26
Как поудобней сохранить в базе массив данных ?