2012-12-20 13 views
6

ist es möglich, das gesamte in Webbrowser geladene Dokument (in Delphi) als normale HTML-Datei mit neuen Werten zu speichern (ich meine Werte, die vom Benutzer in den HTML-Formularen in diesem Dokument eingegeben wurden)? Ich brauche dies zum Lesen dieses HTML-Dokuments mit allen Werten beim nächsten Mal, wenn die Anwendung verwendet wird.Wie speichere ich den Inhalt von TWebBrowser, einschließlich der vom Benutzer eingegebenen Formularwerte?

+1

Wenn dies möglich war , konnte die Delphi-App die Formularfeldwerte abrufen, noch bevor der Benutzer das HTML-Formular übermittelte. Einschließlich sensibler Daten wie Passwörter. – mjn

+1

@mjn, naja, aber es ist möglich. Sie können ziemlich einfach Originalwerte erhalten, die der Benutzer selbst aus maskierten Eingabefeldern (wie Passwörtern) eingegeben hat. Ich weiß nichts über das Speichern im Dokument, aber ich denke, Sie müssen es beim Speichern selbst ändern. – TLama

+1

Wenn dies mit Passwort-Eingabefeldern funktioniert, würde ich keiner App trauen, die einen eingebetteten Webbrowser verwendet, um mit Internet-Sites zu kommunizieren, zum Beispiel mit einem OAuth-Login. – mjn

Antwort

7

Sicher ist das möglich!

Kleine Demo App, eine neue VCL-Formularanwendung machen, fällt ein TWebBrowser, ein TButton und TMemo auf dem Formular und diesen Code verwenden (nicht vergessen OnCreate für die Form und OnClick für das Button zu binden)

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. 

Ausgang:

enter image description here

EDIT

Wie mjn wies darauf hin, die Werte von Passwort Typ Eingänge werden nicht angezeigt. Sie können immer noch ihren Wert erhalten, obwohl:

diese 2 Zeilen zu Button1.Click hinzufügen und html

OnCreate ändern:

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

nur neugierig: Funktioniert das sogar für Passworttyp Eingabefelder? – mjn

+0

Whosrdaddy - Danke! – Artik

+0

wäre es schlecht, wenn IE erlaubt, Passwörter so leicht zu lesen – mjn