2012-04-10 10 views

Odpowiedz

18

Można użyć interfejsu IPersistStreamInit i metody save do przechowywania zawartości przeglądarki w strumieniu.

Uses 
    ActiveX; 

function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String; 
var 
    LStream: TStringStream; 
    Stream : IStream; 
    LPersistStreamInit : IPersistStreamInit; 
begin 
    if not Assigned(WebBrowser.Document) then exit; 
    LStream := TStringStream.Create(''); 
    try 
    LPersistStreamInit := WebBrowser.Document as IPersistStreamInit; 
    Stream := TStreamAdapter.Create(LStream,soReference); 
    LPersistStreamInit.Save(Stream,true); 
    result := LStream.DataString; 
    finally 
    LStream.Free(); 
    end; 
end; 
+0

to działa. Dziękuję Ci bardzo. – Leadri

+0

W jaki sposób możemy sprawić, by działało ono w sposób REVERSE: SetWebBrowserHTML, ponownie wstrzykując poprzednio wyodrębniony kod z powrotem do WebBrowser (lub TEmbeddedWebBrowser). Wyobrażam sobie następującą sytuację: Komponent memo pobiera kod źródłowy HTML za pomocą GetWebBrowserHTML, następnie użytkownik wprowadza pewne zmiany w kodzie źródłowym, a następnie zmieniony kod źródłowy jest ponownie wprowadzany z powrotem do WebBrowser. To sprawi, że ładny edytor HTML z podglądem w czasie rzeczywistym w przeglądarce! – user1580348

+1

Lepiej: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348

3

Zostało to zadane i wiele razy udzielane na forach Embarcadero, gdzie zamieszczono mnóstwo przykładów kodu. Przeszukaj archiwa.

Istotą jest to, że ty Navigate() do żądanego adresu URL i czekać na zdarzenie OnDocumentComplete na ogień, potem QueryInterface() właściwość Document dla interfejsu IPersistStreamInit i wywołać jego metodę save(). Utwórz instancję obiektu TStream, taką jak TMemoryStream, umieść ją w obiekcie TStreamAdapter, a następnie przekaż adapter do save(). Następnie można załadować TStream do TMemo w razie potrzeby.

4

To działa zbyt dobrze:

function GetHTML(w: TWebBrowser): String; 
Var 
    e: IHTMLElement; 
begin 
    Result := ''; 
    if Assigned(w.Document) then 
    begin 
    e := (w.Document as IHTMLDocument2).body; 

    while e.parentElement <> nil do 
    begin 
     e := e.parentElement; 
    end; 

    Result := e.outerHTML; 
    end; 
end; 
+0

Niepoprawnie. dzięki temu uzyskasz reprezentację DOM elementu 'document'. To nie będzie kod źródłowy HTML. – kobik

+0

Tak, masz rację, używałam go tylko do parsowania niektórych danych dostępnych na źródle html i użycie reprezentacji DOM było w porządku. –

+1

Przygotuję twoją odpowiedź, w każdym razie jest przydatna. Używam również podobnej metody w naszym pająku do manipulowania/parsowania HTML z zagranicznej strony internetowej. – kobik

Powiązane problemy