2016-09-29 81 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

相關問題