Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.54 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls,
  8.   ActiveX, MSHTML, ComCtrls, ComObj;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     Button1: TButton;
  13.     WebBrowser1: TWebBrowser;
  14.     btn1: TButton;
  15.     mm1: TMemo;
  16.     procedure Button1Click(Sender: TObject);
  17.     procedure btn1Click(Sender: TObject);
  18.   private
  19.     procedure Button2Click(Sender: TObject);
  20.     function GetFrame(FrameNo: Integer): IWebBrowser2;
  21.     { Private declarations }
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32.  
  33. function GetBrowserForFrame(Doc: IHTMLDocument2; nFrame: Integer): IWebBrowser2;
  34. // Thanks to Rik Barker
  35. // returns an interface to the frame's browser
  36. var
  37.   pContainer: IOLEContainer;
  38.   enumerator: ActiveX.IEnumUnknown;
  39.   nFetched: PLongInt;
  40.   unkFrame: IUnknown;
  41.   hr: HRESULT;
  42. begin
  43.   Result := nil;
  44.   nFetched := nil;
  45.   // Cast the page as an OLE container
  46.   pContainer := Doc as IOLEContainer;
  47.   // Get an enumerator for the frames on the page
  48.   hr := pContainer.EnumObjects(OLECONTF_EMBEDDINGS or OLECONTF_OTHERS, enumerator);
  49.   if hr <> S_OK then
  50.   begin
  51.     pContainer._Release;
  52.     Exit;
  53.   end;
  54.   // Now skip to the frame we're interested in
  55.   enumerator.Skip(nFrame);
  56.   // and get the frame as IUnknown
  57.   enumerator.Next(1, unkFrame, nFetched);
  58.   // Now QI the frame for a WebBrowser Interface - I'm not  entirely
  59.   // sure this is necessary, but COM never ceases to surprise me
  60.   unkFrame.QueryInterface(IID_IWebBrowser2, Result);
  61. end;
  62.  
  63. function GetFrameSource(WebDoc: IHTMLDocument2): string;
  64. // returns frame HTML and scripts as a text string
  65. var
  66.   re: Integer;
  67.   HTMLel: iHTMLElement;
  68.   HTMLcol: iHTMLElementCollection;
  69.   HTMLlen: Integer;
  70.   ScriptEL: IHTMLScriptElement;
  71. begin
  72.   Result := '';
  73.   if Assigned(WebDoc) then
  74.   begin
  75.     HTMLcol := WebDoc.Get_all;
  76.     HTMLlen := HTMLcol.Length;
  77.     for re := 0 to HTMLlen - 1 do
  78.     begin
  79.       HTMLel := HTMLcol.Item(re, 0) as iHTMLElement;
  80.       if HTMLel.tagName = 'HTML' then
  81.         Result := Result + HTMLel.outerHTML;
  82.     end;
  83.   end;
  84. end;
  85.  
  86. function WB_SaveFrameToFile(HTMLDocument: IHTMLDocument2; const FileName: TFileName): Boolean;
  87. // Save IHTMLDocument2 to a file
  88. var
  89.   PersistFile: IPersistFile;
  90. begin
  91.   PersistFile := HTMLDocument as IPersistFile;
  92.   PersistFile.Save(StringToOleStr(FileName), System.True);
  93. end;
  94.  
  95. function SaveWBFrames(WebBrowser1: TWebBrowser): string;
  96. // return the source for all frames in the browser
  97. var
  98.   WebDoc, HTMLDoc: IHTMLDocument2;
  99.   framesCol: iHTMLFramesCollection2;
  100.   FramesLen: Integer;
  101.   pickFrame: olevariant;
  102.   p: Integer;
  103. begin
  104.   try
  105.     WebDoc := WebBrowser1.Document as IHTMLDocument2;
  106.     Result := GetFrameSource(WebDoc);
  107.     // §§§ Hier kann Result in eine Datei gespeichert werden §§§§  oder  mit
  108.     // WB_SaveFrameToFile(WebDoc,'c:\MainPage.html');
  109.     // Handle multiple or single frames
  110.     framesCol := WebDoc.Get_frames;
  111.     FramesLen := framesCol.Get_length;
  112.     if FramesLen > 0 then
  113.       for p := 0 to FramesLen - 1 do
  114.       begin
  115.         if p = 0 then
  116.         begin
  117.           pickFrame := p;
  118.           HTMLDoc := WebBrowser1.Document as IHTMLDocument2;
  119.  
  120.           WebDoc := GetBrowserForFrame(HTMLDoc, pickFrame).Document as IHTMLDocument2;
  121.           if WebDoc <> nil then
  122.           begin
  123.             Result := GetFrameSource(WebDoc);
  124.             Form1.mm1.Lines.Text := WebDoc.body.innerHTML;
  125.  
  126.             // WB_SaveFrameToFile(WebDoc, 'c:\Frame' + IntToStr(p) + '.html');
  127.             // ShowMessage(HTMLDoc.Get_parentWindow.Get_name);
  128.             // ShowMessage(HTMLDoc.Get_parentWindow.Parent.Get_document.nameProp);
  129.  
  130.           end;
  131.         end;
  132.       end;
  133.   except
  134.     Result := 'No Source Available';
  135.   end;
  136. end;
  137.  
  138. // Test:
  139.  
  140. procedure TForm1.btn1Click(Sender: TObject);
  141. begin
  142.   WebBrowser1.Silent := True;
  143.   WebBrowser1.Navigate('http://webmail.iol.pt/');
  144. end;
  145.  
  146. procedure TForm1.Button1Click(Sender: TObject);
  147. begin
  148.   SaveWBFrames(WebBrowser1);
  149. end;
  150.  
  151. function TForm1.GetFrame(FrameNo: Integer): IWebBrowser2;
  152. var
  153.   OleContainer: IOLEContainer;
  154.   enum: ActiveX.IEnumUnknown;
  155.   unk: IUnknown;
  156.   Fetched: PLongInt;
  157. begin
  158.   while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
  159.     Application.ProcessMessages;
  160.   if Assigned(WebBrowser1.Document) then
  161.   begin
  162.     Fetched := nil;
  163.     OleContainer := WebBrowser1.Document as IOLEContainer;
  164.     OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, enum);
  165.     enum.Skip(FrameNo);
  166.     enum.Next(1, unk, Fetched);
  167.     Result := unk as IWebBrowser2;
  168.   end
  169.   else
  170.     Result := nil;
  171. end;
  172.  
  173. // Save all frames in single files
  174. // Alle Frameseiten in einzelne Dateien speichern
  175. procedure TForm1.Button2Click(Sender: TObject);
  176. var
  177.   IpStream: IPersistStreamInit;
  178.   AStream: TMemoryStream;
  179.   iw: IWebBrowser2;
  180.   i: Integer;
  181.   sl: TStringList;
  182. begin
  183.   for i := 0 to WebBrowser1.OleObject.Document.frames.Length - 1 do
  184.   begin
  185.     iw := GetFrame(i);
  186.     AStream := TMemoryStream.Create;
  187.     try
  188.       IpStream := iw.Document as IPersistStreamInit;
  189.       if Succeeded(IpStream.Save(TStreamadapter.Create(AStream), True)) then
  190.       begin
  191.         AStream.Seek(0, 0);
  192.         sl := TStringList.Create;
  193.         sl.LoadFromStream(AStream);
  194.         sl.SaveToFile('c:\frame' + IntToStr(i) + '.txt');
  195.         // memo1.Lines.LoadFromStream(AStream);
  196.         sl.Free;
  197.       end;
  198.     except
  199.     end;
  200.     AStream.Free;
  201.   end;
  202. end;
  203.  
  204. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement