uses
ActiveX, MSHTML_TLB, ComCtrls, ComObj;
function GetBrowserForFrame(Doc: IHTMLDocument2; nFrame: Integer): IWebBrowser2;
//Thanks to Rik Barker
//returns an interface to the frame's browser
var
pContainer: IOLEContainer;
enumerator:
ActiveX.IEnumUnknown;
nFetched: PLongInt;
unkFrame: IUnknown;
hr: HRESULT;
begin
Result :=
nil;
nFetched :=
nil;
// Cast the page as an OLE container
pContainer := Doc
as IOleContainer;
// Get an enumerator for the frames on the page
hr := pContainer.EnumObjects(OLECONTF_EMBEDDINGS
or OLECONTF_OTHERS, enumerator);
if hr <> S_OK
then
begin
pContainer._Release;
Exit;
end;
// Now skip to the frame we're interested in
enumerator.Skip(nFrame);
// and get the frame as IUnknown
enumerator.Next(1,unkFrame, nFetched);
// Now QI the frame for a WebBrowser Interface - I'm not entirely
// sure this is necessary, but COM never ceases to surprise me
unkframe.QueryInterface(IID_IWebBrowser2, Result);
end;
function GetFrameSource(WebDoc: iHTMLDocument2):
string;
//returns frame HTML and scripts as a text string
var
re: integer;
HTMLel: iHTMLElement;
HTMLcol: iHTMLElementCollection;
HTMLlen: Integer;
ScriptEL: IHTMLScriptElement;
begin
Result := '
';
if Assigned(WebDoc)
then
begin
HTMLcol := WebDoc.Get_all;
HTMLlen := HTMLcol.Length;
for re := 0
to HTMLlen - 1
do
begin
HTMLel := HTMLcol.Item(re, 0)
as iHTMLElement;
if HTMLEl.tagName = '
HTML'
then
Result := Result + HTMLEl.outerHTML;
end;
end;
end;
function WB_SaveFrameToFile(HTMLDocument: IHTMLDocument2;
const FileName: TFileName): Boolean;
// Save IHTMLDocument2 to a file
var
PersistFile: IPersistFile;
begin
PersistFile := HTMLDocument
as IPersistFile;
PersistFile.Save(StringToOleStr(FileName), System.True);
end;
function SaveWBFrames(WebBrowser1: TWebBrowser):
string;
// return the source for all frames in the browser
var
Webdoc, HTMLDoc: ihtmldocument2;
framesCol: iHTMLFramesCollection2;
FramesLen: integer;
pickFrame: olevariant;
p: integer;
begin
try
WebDoc := WebBrowser1.Document
as IHTMLDocument2;
Result := GetFrameSource(WebDoc);
// §§§ Hier kann Result in eine Datei gespeichert werden §§§§ oder mit
// WB_SaveFrameToFile(WebDoc,'c:\MainPage.html');
//Handle multiple or single frames
FramesCol := WebDoc.Get_frames;
FramesLen := FramesCol.Get_length;
if FramesLen > 0
then
for p := 0
to FramesLen - 1
do
begin
pickframe := p;
HTMLDoc := WebBrowser1.Document
as iHTMLDocument2;
WebDoc := GetBrowserForFrame(HTMLDoc, pickframe).document
as iHTMLDocument2;
if WebDoc <>
nil then
begin
Result := GetFrameSource(WebDoc);
// §§§ Hier kann Result in eine Datei gespeichert werden §§§§ oder mit
// WB_SaveFrameToFile(WebDoc, 'c:\Frame' + IntToStr(p) + '.html');
// Wie bekommt man den Namen für ein Frame ??
// so?
// ShowMessage(HTMLDoc.Get_parentWindow.Get_name);
// ShowMessage(HTMLDoc.Get_parentWindow.Parent.Get_document.nameProp);
end;
end;
except
Result := '
No Source Available';
end;
end;
// Testen:
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveWBFrames(Webbrowser1);
end;