Fórum Pq deste erro? Avaliem o código #221279

21/03/2004

0

Olá,
arranjei um código q tem como função salvar frames de uma página html, bem, este código porém esta dando problemas comigo.

Pesso q testem ele aí pq pra dizer o erro fica dificil entender.
basta colocar um webbrowser1, um button1 e button2

uses 
  ActiveX; 

function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2; 
var 
  OleContainer: IOleContainer; 
  enum: IEnumUnknown; 
  unk: IUnknown; 
  Fetched: PLongint; 
begin 
  while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do 
    Application.ProcessMessages; 
  if Assigned(Webbrowser1.document) then 
  begin 
    Fetched := nil; 
    OleContainer := Webbrowser1.Document as IOleContainer; 
    OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum); 
    Enum.Skip(FrameNo); 
    Enum.Next(1, Unk, Fetched); 
    Result := Unk as IWebbrowser2; 
  end 
  else 
    Result := nil; 
end; 

// Load sample page 
// Testseite laden 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Webbrowser1.Navigate(´http://www.warebizprogramming.com/tutorials/html/framesEx1.htm´); 
end; 

// Save all frames in single files 
// Alle Frameseiten in einzelne Dateien speichern 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  IpStream: IPersistStreamInit; 
  AStream: TMemoryStream; 
  iw: IWebbrowser2; 
  i: Integer; 
  sl: TStringList; 
begin 
  for i := 0 to Webbrowser1.OleObject.Document.frames.Length - 1 do 
  begin 
    iw := GetFrame(i); 
    AStream := TMemoryStream.Create; 
    try 
      IpStream := iw.document as IPersistStreamInit; 
      if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then 
      begin 
        AStream.Seek(0, 0); 
        sl := TStringList.Create; 
        sl.LoadFromStream(AStream); 
        sl.SaveToFile(´c:\frame´ + IntToStr(i) + ´.txt´); 
        //  memo1.Lines.LoadFromStream(AStream); 
        sl.Free; 
      end; 
    except 
    end; 
    AStream.Free; 
  end; 
end; 

end. 


O erro esta dando como sendo aqui
AStream := TMemoryStream.Create;
mas na verdade o erro esta é aqui
iw := GetFrame(i);

então, o q fazer?


Lipsil

Lipsil

Responder

Posts

21/03/2004

Lucas Silva

qual o erro que tá dando..??


Responder

Gostei + 0

21/03/2004

Lipsil

Dá aqueles erros de Proect1.exe e pronto......

só seleciona AStream := TMemoryStream.Create; mas o erro não é aí e sim na linha acima dele q passa pra ele.. testa aí pra ver só


Responder

Gostei + 0

21/03/2004

Vinicius2k

Colega,

Comigo está funcionando perfeitamente... gera abre a página e gera dos dois .txt na raiz...
Qual a mensagem de erro ?
T+


Responder

Gostei + 0

22/03/2004

Lipsil

kra, o cód completo q estou usando é o seguinte colocando só 2 button e 1 webbrowser:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 uses 
  ActiveX;

function GetFrame(FrameNo: Integer): IWebbrowser2;
var 
  OleContainer: IOleContainer; 
  enum: IEnumUnknown; 
  unk: IUnknown; 
  Fetched: PLongint;
 WebBrowser1: TWebBrowser;begin
  while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
    Application.ProcessMessages; 
  if Assigned(Webbrowser1.document) then 
  begin 
    Fetched := nil; 
    OleContainer := Webbrowser1.Document as IOleContainer; 
    OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum); 
    Enum.Skip(FrameNo); 
    Enum.Next(1, Unk, Fetched); 
    Result := Unk as IWebbrowser2; 
  end 
  else 
    Result := nil; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin
  Webbrowser1.Navigate(´http://www.warebizprogramming.com/tutorials/html/framesEx1.htm´); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
  IpStream: IPersistStreamInit; 
  AStream: TMemoryStream; 
  iw: IWebbrowser2; 
  i: Integer; 
  sl: TStringList; 
begin 
  for i := 0 to Webbrowser1.OleObject.Document.frames.Length - 1 do
  begin 
    iw := GetFrame(i); 
    AStream := TMemoryStream.Create;
    try 
      IpStream := iw.document as IPersistStreamInit;
      if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then 
      begin
        AStream.Seek(0, 0);
        sl := TStringList.Create; 
        sl.LoadFromStream(AStream); 
        sl.SaveToFile(´c:\frame´ + IntToStr(i) + ´.txt´); 
        //  memo1.Lines.LoadFromStream(AStream); 
        sl.Free; 
      end; 
    except 
    end; 
    AStream.Free; 
  end; 
end; 
end.

bem alguem encontra algum erro aí?
Aí acima eu mudei o function TForm1.Getframe para function TForm1.Getframe pq estava dando erro.

mas agora esta dando erro ao clicar no button2: Violação de acesso 0041BCEC e Ler endereço 83EC8B75...

Bem, não entendi e não achei o pq..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar