2016-09-29 177 views
1

我有一个字符串var'HTMLCode',其中包含HTML代码。我想将这段代码加载到浏览器中。在TWebBrowser中加载字符串(HTML代码)的最佳方法是什么?

这是Embarcadero公司代码:

procedure THTMLEdit.EditText(CONST HTMLCode: string); 
{VAR 
    Doc: IHTMLDocument2; 
    TempFile: string; } 
begin 
TempFile := GetTempFile('.html'); 
StringToFile(TempFile, HTMLCode); 
wbBrowser.Navigate(TempFile); 

Doc := GetDocument; 
if Doc <> NIL 
then Doc.Body.SetAttribute('contentEditable', 'true', 0); //crash here when I load complex html files 

DeleteFile(TempFile); 
end; 

它有一些problems所以我这一个替代它:

procedure THTMLEdit.EditText(CONST HTMLCode: string); 
VAR 
    TSL: TStringList; 
    MemStream: TMemoryStream; 
begin 
wbBrowser.Navigate('about:blank'); 
WHILE wbBrowser.ReadyState < READYSTATE_INTERACTIVE 
    DO Application.ProcessMessages; 

GetDocument.DesignMode := 'On'; 

if Assigned(wbBrowser.Document) then 
    begin 
    TSL := TStringList.Create; 
    TRY 
     MemStream := TMemoryStream.Create; 
     TRY 
     TSL.Text := HTMLCode; 
     TSL.SaveToStream(MemStream); 
     MemStream.Seek(0, 0); 
     (wbBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(MemStream)); 
     FINALLY 
     MemStream.Free; 
     end; 
    FINALLY 
     TSL.Free; 
    end; 
    end; 
end; 

但是这其中有问题也。首先,当我将链接(...)插入到HTML代码中时,浏览器将在我的URL前面更改代码appending'about:'。第二:它比第一个程序(带有临时文件的程序)慢。

我可以在浏览器中加载HTML代码而无需先导航到'about:blank'吗?

+0

源:http://www.swissdelphicenter.ch/en/showcode.php?id=1096 – Ampere

回答

5

你可以加载HTML代码下面

procedure THTMLEdit.EditText(CONST HTMLCode: string); 
var 
    Doc: Variant; 
begin 
    if NOT Assigned(wbBrowser.Document) then 
    wbBrowser.Navigate('about:blank'); 

    Doc := wbBrowser.Document; 
    Doc.Clear; 
    Doc.Write(HTMLCode); 
    Doc.Close; 
end; 
+0

它作品 - 在添加Doc.DesignMode:='On'后添加到您的代码:)非常感谢。但是,当我插入html链接时,它仍然显示'about:'问题。详细信息:http://stackoverflow.com/questions/39745849/how-stop-twebbrowser-from-adding-file-in-front-of-my-links?noredirect=1#comment66853179_39745849 – Ampere

+0

@Silvester你需要包括'在HTML链接中添加base href = ...>标签。 – RepeatUntil

+0

nope:我输入'',之后的链接改为:Link Ampere

4

您Qustions:

  • 首先,当我插入链接(......)转换为HTML代码,浏览器将改变代码,在我的网址前添加“about:”。

  • 其次:它比第一个程序(带临时文件的程序)慢。

  • 我可以在浏览器中加载HTML代码而不用先导航到'about:blank'吗?

答案:

  • 是的,它是可能的,而不改变链接!
  • 不,它不会变慢!
  • 是的,这是可能的,没有必要先导航到约:空白

我们先从代码和第一个过程(只显示其中约:......)的由来。

{$R *.DFM} 
var 
Doc: IHTMLDocument2; 
TempFile: string; 
xBody : IHTMLElement; 
xLoaded : Boolean; 
onlyOnce: Boolean; 

procedure TForm1.WB_LoadHTML(HTMLCode: string); 
var 
    sl: TStringList; 
    ms: TMemoryStream; 
begin 
    xLoaded := False; 
    WebBrowser.Navigate('about:blank'); 
    while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do 
    Application.ProcessMessages; 

    if Assigned(WebBrowser.Document) then 
    begin 
    sl := TStringList.Create; 
    try 
     ms := TMemoryStream.Create; 
     try 
     sl.Text := HTMLCode; 
     sl.SaveToStream(ms); 
     ms.Seek(0, 0); 
     (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)); 
     finally 
     ms.Free; 
     end; 
    finally 
     sl.Free; 
     Doc := WebBrowser.Document as IHTMLDocument2; 
    end; 
    end; 
end; 

procedure TForm1.LoadHTMLBtnClick(Sender: TObject); 
begin 
WB_LoadHTML(Memo1.Text); 
end; 

procedure TForm1.LoadFileBtnClick(Sender: TObject); 
begin 
Memo1.Lines.LoadFromFile('G:\Programme\Apache Group\Apache\htdocs\bearbeiten1.html'); 
end; 

我们创建了2个文件(相同)只有脚本不同才能在加载时获得警报。
bearbeiten1.html

<script type="text/javascript"> 
alert ("bearbeiten1.html");  
</script> 

bearbeiten3.html

<script type="text/javascript"> 
alert ("bearbeiten3.html");  
</script> 

:点击加载文件我们加载 “bearbeiten1.html” 文件
WB_LoadHTML我们把它加载到内存。

我们得到网址:关于:空白

enter image description here

和警报

enter image description here

现在我们创建了一个链接:
我们选择蓝色部分,然后点击createlink

enter image description here

链接创建

enter image description here

,也是新的 “Doc.body.innerHTML”

procedure TForm1.createlinkBtnClick(Sender: TObject); 
begin 
Doc.execCommand('createlink', false,'bearbeiten3.html'); 
Memo1.Text := Doc.body.innerHTML; 
end; 

enter image description here

到目前为止好!但它会工作...? 没有

我们得到的链接上的所有点击后是一个空白网站与网址:

enter image description here

现在我们尝试新的的EditText()代码

procedure TForm1.EditText(CONST HTMLPath: string); 
begin 
TempFile := HTMLPath; 
xLoaded := False; 
WebBrowser.Navigate(TempFile); 
Doc := WebBrowser.Document as IHTMLDocument2; 
if Doc <> nil then xLoaded := True; 
end; 

procedure TForm1.EditTextBtnClick(Sender: TObject); 
begin 
    EditText('G:\Programme\Apache Group\Apache\htdocs\bearbeiten1.html'); 
end; 

点击加载文件,我们再次加载“bearbeiten1.html”文件 ,并使用EditTextBtnClick直接加载它。 看起来好多了!它会工作...?

enter image description here

让我们点击链接!我们得到警报!来自Nr。 ... 3.html”

enter image description here

和.html文件被加载没有问题。

enter image description here

你的其他问题

if Doc <> NIL 
then Doc.Body.SetAttribute('contentEditable', 'true', 0); 
//crash here when I load complex html files 

你做它在错误的地方机构只有在网站加载后才可用!

所以我把它放在事件WebBrowserNavigateComplete2

只有快速的解决方案可以提高

procedure TForm1.WebBrowserNavigateComplete2(Sender: TObject; 
    const pDisp: IDispatch; var URL: OleVariant); 
begin 
if xLoaded = True then begin 
    xBody := Doc.Get_body; 
    if xBody <> nil then begin 
     xBody.SetAttribute('contentEditable', 'true', 0); 
     Memo1.Text := Doc.body.innerHTML; 
     xLoaded := False; 
    end; 
end; 
label2.Caption := URL; 
end; 

完整的代码。

type 
    TForm1 = class(TForm) 
    WebBrowser: TWebBrowser; 
    Label1: TLabel; 
    Label2: TLabel; 
    Memo1: TMemo; 
    LoadHTMLBtn: TButton; 
    LoadFileBtn: TButton; 
    EditTextBtn: TButton; 
    createlinkBtn: TButton; 
    innerHTMLBtn: TButton; 
    procedure LoadHTMLBtnClick(Sender: TObject); 
    procedure LoadFileBtnClick(Sender: TObject); 
    procedure EditTextBtnClick(Sender: TObject); 
    procedure createlinkBtnClick(Sender: TObject); 
    procedure WebBrowserNavigateComplete2(Sender: TObject; 
     const pDisp: IDispatch; var URL: OleVariant); 
    procedure innerHTMLBtnClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure WB_LoadHTML(HTMLCode: string); 
    procedure EditText(CONST HTMLPath: string); 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM} 
var 
Doc: IHTMLDocument2; 
TempFile: string; 
xBody : IHTMLElement; 
xLoaded : Boolean; 
onlyOnce: Boolean; 

procedure TForm1.WB_LoadHTML(HTMLCode: string); 
var 
    sl: TStringList; 
    ms: TMemoryStream; 
begin 
    xLoaded := False; 
    WebBrowser.Navigate('about:blank'); 
    while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do 
    Application.ProcessMessages; 

    if Assigned(WebBrowser.Document) then 
    begin 
    sl := TStringList.Create; 
    try 
     ms := TMemoryStream.Create; 
     try 
     sl.Text := HTMLCode; 
     sl.SaveToStream(ms); 
     ms.Seek(0, 0); 
     (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)); 
     finally 
     ms.Free; 
     end; 
    finally 
     sl.Free; 
     Doc := WebBrowser.Document as IHTMLDocument2; 
    end; 
    end; 
end; 

procedure TForm1.LoadHTMLBtnClick(Sender: TObject); 
begin 
WB_LoadHTML(Memo1.Text); 
end; 

procedure TForm1.LoadFileBtnClick(Sender: TObject); 
begin 
Memo1.Lines.LoadFromFile('G:\Programme\Apache Group\Apache\htdocs\bearbeiten1.html'); 
end; 

procedure TForm1.EditText(CONST HTMLPath: string); 
begin 
TempFile := HTMLPath; 
xLoaded := False; 
WebBrowser.Navigate(TempFile); 
if onlyOnce then WebBrowser.Navigate(TempFile); 
onlyOnce := False; 
Doc := WebBrowser.Document as IHTMLDocument2; 
if Doc <> nil then xLoaded := True; 
end; 

procedure TForm1.EditTextBtnClick(Sender: TObject); 
begin 
    EditText('G:\Programme\Apache Group\Apache\htdocs\bearbeiten1.html'); 
end; 

procedure TForm1.createlinkBtnClick(Sender: TObject); 
begin 
Doc.execCommand('createlink', false,'bearbeiten3.html'); 
Memo1.Text := Doc.body.innerHTML; 
end; 

procedure TForm1.WebBrowserNavigateComplete2(Sender: TObject; 
    const pDisp: IDispatch; var URL: OleVariant); 
begin 
if xLoaded then begin 
    xBody := Doc.Get_body; 
    if xBody <> nil then begin 
     xBody.SetAttribute('contentEditable', 'true', 0); 
     Memo1.Text := Doc.body.innerHTML; 
     xLoaded := False; 
    end; 
end; 
label2.Caption := URL; 
end; 

procedure TForm1.innerHTMLBtnClick(Sender: TObject); 
begin 
Memo1.Text := Doc.body.innerHTML; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
onlyOnce := True; 
end; 
end. 

UPDATE:
我忘了在代码中设置(复制粘贴错误)的将它视为路径。
另外FormCreate添加。
并且只有一次加载TempFile两次! (见代码)

重要在临时文件的标签必须为链接

bearbeiten1.html一样bearbeiten3.html只alert ("bearbeiten3.html");必须适应!

bearbeiten1.html

<head> 
<link href="file:///G:\Programme\Apache Group\Apache\htdocs\maor.css" rel="stylesheet" media="screen"> 
</head> 
<body leftmargin="0" marginheight="0" marginwidth="0" topmargin="0" bgcolor="#1F2E53"> 
<script type="text/javascript"> 
    alert ("bearbeiten1.html");   
</script> 
    <table width="100%" border="0" cellspacing="0" cellpadding="0" > 
     <tr height="211"> 
     <td width="2%" height="211"></td> 
     <td valign="top" width="36%" height="211"> 
      <table width="448" border="0" cellspacing="0" cellpadding="0"> 
      <tr height="21"> 
       <td width="8" height="21"></td> 
       <td class="FormControlrechts" width="150" height="21"></td> 
       <td width="23" height="21"></td> 
       <td class="FormControl" width="213" height="21"> 
       <p unselectable="on">Select any portion of the following blue text</p> 
       <p id="p1" style="color= #3366CC">My favorite Web site. Don't forget to click the button! createlink</p> 
       </td> 
      </tr> 
      </table> 
    </table> 
</body> 

maor.css

body {} 
p {} 
td {} 
h1 { color: #f5c391; font-weight: normal; font-size: 20px; font-family: verdana, serif; margin-bottom: 0.2em } 
h2 { color: #eaeaea; font-weight: normal; font-size: 16px; margin-top: 0; margin-bottom: 0 } 
form { margin-top: 0px } 
a:link { font-weight:bold; color:#36f; text-decoration:none; } 
a:visited { font-weight:bold; color:silver; text-decoration:none; } 
a:focus { font-weight:bold; color:#d4d4d4; text-decoration:underline; } 
a:hover { font-weight:bold; color:#c0c0c0; text-decoration:none; } 
a:active { font-weight:bold; color:lime; text-decoration:underline; } 
textarea, input { font-size: 8pt } 
select, option { font-size: 9pt } 
td { color: #333; font-size: 9pt; font-family: verdana, sans-serif } 
td.FormControl { color: #ffe78b; font-size: small; padding-top: 5px; padding-bottom: 5px; border-right: 1px solid #5dafb0; border-bottom: 1px solid #5dafb0 } 
td.FormControlrechts { color: #a88664; font-size: 8pt; text-align: right; padding-top: 5px; padding-bottom: 5px; border-top: #5dafb0; border-right: #5dafb0; border-bottom: 1px solid #5dafb0; border-left: #5dafb0 } 
.class { } 
+0

Dankeschönmoskito。一个非常完整的答案。我会马上尝试。 – Ampere

+0

“我不知道你想做什么” - 我不想显示完整的HTML页面。我想让用户按下一些按钮来输入一些基本的HTML项目(链接,表格,格式化文本)并查看TWebBrowser为这些项目生成的代码。之后,用户应该能够加载之前生成的HTML代码(再次,不是完整的HTML页面)。 – Ampere

+0

我认为你的代码显示了我描述的同样的问题:它会改变你输入的链接。我在这里再次粘贴到原始问题的链接:http://stackoverflow.com/questions/39745849/how-stop-twebbrowser-from-adding-file-in-front-of-my-links?noredirect=1#comment66824665_39745849 – Ampere

相关问题