Pq deste erro? Avaliem o código
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
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?
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
Curtidas 0
Respostas
Lucas Silva
21/03/2004
qual o erro que tá dando..??
GOSTEI 0
Lipsil
21/03/2004
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ó
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ó
GOSTEI 0
Vinicius2k
21/03/2004
Colega,
Comigo está funcionando perfeitamente... gera abre a página e gera dos dois .txt na raiz...
Qual a mensagem de erro ?
T+
Comigo está funcionando perfeitamente... gera abre a página e gera dos dois .txt na raiz...
Qual a mensagem de erro ?
T+
GOSTEI 0
Lipsil
21/03/2004
kra, o cód completo q estou usando é o seguinte colocando só 2 button e 1 webbrowser:
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..
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..
GOSTEI 0