2012-12-20 13 views
6

czy możliwe jest zapisanie całego dokumentu załadowanego w Webbrowser (w Delphi) jako zwykłego pliku HTML z nowymi wartościami (mam na myśli wartości wprowadzane przez użytkownika w formularzach html tego dokumentu)? Potrzebuję tego do przeczytania tego dokumentu HTML z wszystkimi wartościami przy następnym użyciu aplikacji.Jak zapisać zawartość TWebBrowser, w tym wartości wprowadzone przez użytkownika?

+1

Jeśli było to możliwe , aplikacja Delphi może pobrać wartości pól formularza, nawet zanim użytkownik prześle formularz HTML. Uwzględnianie poufnych danych, takich jak hasła. – mjn

+1

@mjn, cóż, ale jest to możliwe. Możesz dość łatwo uzyskać oryginalne wartości wprowadzone przez użytkownika nawet z zamaskowanych pól wejściowych (takich jak hasła). Nie wiem, jak zapisać dokument, ale myślę, że będziesz musiał go zmodyfikować samodzielnie podczas zapisywania. – TLama

+1

Jeśli to działa z polami wprowadzania typu hasła, nie ufałbym żadnej aplikacji, która używa wbudowanej przeglądarki internetowej do komunikowania się z witrynami internetowymi, na przykład za pomocą logowania OAuth. – mjn

Odpowiedz

7

Pewnie, że to możliwe!

Małe demo aplikacji, złożyć nowy wniosek formularzy VCL, upuścić TWebBrowser, a TButton i TMemo na formularzu i użyć tego kodu (nie zapomnij, aby związać OnCreate za formę i OnClick dla przycisku)

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, OleCtrls, SHDocVw, StdCtrls,mshtml, ActiveX; 

type 
    TForm1 = class(TForm) 
    WebBrowser1: TWebBrowser; 
    Button1: TButton; 
    Memo1: TMemo; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

//code snagged from about.com 
procedure WBLoadHTML(WebBrowser: TWebBrowser; HTMLCode: string) ; 
var 
    sl: TStringList; 
    ms: TMemoryStream; 
begin 
    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; 
    end; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 

var 
    Doc : IHtmlDocument2; 

begin 
Doc := WebBrowser1.Document as IHtmlDocument2; 
Memo1.Lines.Text := Doc.body.innerHTML; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 

var 
    Html : String; 
begin 
Html := 'change value of input and press Button1 to changed DOM<br/><input id="myinput" type="text" value="orgval"></input>'; 
WBLoadHTML(WebBrowser1, Html); 
end; 

end. 

wyjściowa:

enter image description here

EDIT

Jako mjn wskazano, że wartości wejść nie będą wyświetlane. Można nadal można dostać swoją wartość mimo:

dodać te 2 linie do Button1.Click i zmienić HTML

onCreate:

Html := 'change value of input and press Button1 to changed DOM<br/><input id="myinput" type="password" value="orgval"></input>'; 

OnClick:

El := (Doc as IHtmlDocument3).getElementById('myinput') as IHtmlInputElement; 
    Memo1.Lines.Add(Format('value of password field = %s', [El.value])) 
+0

po prostu ciekawy: czy to działa nawet dla pól wejściowych typu hasła? – mjn

+0

Whosrdaddy - Dziękujemy! – Artik

+0

byłoby źle, jeśli IE pozwala tak łatwo odczytać hasła – mjn