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?
6
A
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:
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]))
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
@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
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