Pegar fonte html tudo bem, mas de um frame? como ajeita esse
Olá pessoal,
agora, eu to lutando em cima de um cód pra baixar os frames de uma page html pra um txt por exemplo, mas o cód q arranjei e ajeitei esta dando pau no seguinte, ele é:
Código:
precis de um webbrowser e 2 button com a função de clicks já... bem,
depois de executar, clica rno button1 e depois clicar no button2 dá um erro seguinte: ´... raised exception class EIntfCastError with msg Interface não suportada...´, depois de clicar no Ok da msg, ele seleciona a parte: IpStream := iw.document as IPersistStreamInit; e simplesmente não faz o q era pra fazer.. o q poderia ser, sabe me dizer?
Obs.: não me adiantaria simplesmente acessa uma página do frame pra pegar o cód fonte, pois a página seria o resultado da transmissão de dados via Post, e assim, impossivel supor de onde e como q veio á dar um resultado atual da página q esta entre outras dentro de uma com frames
Alguem sabe?
Valew
agora, eu to lutando em cima de um cód pra baixar os frames de uma page html pra um txt por exemplo, mas o cód q arranjei e ajeitei esta dando pau no seguinte, ele é:
Código:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, activex, OleCtrls, SHDocVw, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
WebBrowser1: TWebBrowser;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
function GetFrame(FrameNo: Integer): IWebbrowser2;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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.
precis de um webbrowser e 2 button com a função de clicks já... bem,
depois de executar, clica rno button1 e depois clicar no button2 dá um erro seguinte: ´... raised exception class EIntfCastError with msg Interface não suportada...´, depois de clicar no Ok da msg, ele seleciona a parte: IpStream := iw.document as IPersistStreamInit; e simplesmente não faz o q era pra fazer.. o q poderia ser, sabe me dizer?
Obs.: não me adiantaria simplesmente acessa uma página do frame pra pegar o cód fonte, pois a página seria o resultado da transmissão de dados via Post, e assim, impossivel supor de onde e como q veio á dar um resultado atual da página q esta entre outras dentro de uma com frames
Alguem sabe?
Valew
Lipsil
Curtidas 0
Respostas
Vinicius2k
02/04/2004
lipsil,
testei novamente seu código e volto a lhe dizer que não creio que exista problema com ele... funciona perfeitamente... uso Windows 2000 Pro SP4, com IE 6 SP1 e compilei no Delphi 6... acho q vc deve testar este código em O.S diferentes e/ou compilar com outra versão do Delphi, para tentar descobrir a razão do erro...
estes são os dois .txt que ele gera na raiz... não é isso que vc precisa?
T+
testei novamente seu código e volto a lhe dizer que não creio que exista problema com ele... funciona perfeitamente... uso Windows 2000 Pro SP4, com IE 6 SP1 e compilei no Delphi 6... acho q vc deve testar este código em O.S diferentes e/ou compilar com outra versão do Delphi, para tentar descobrir a razão do erro...
estes são os dois .txt que ele gera na raiz... não é isso que vc precisa?
<html> <head><title>Left Pane (frame1.htm)</title> </head> <body bgcolor="#FFFFFF" text="000000" link="000000" vlink="FF0000"> <h3>Page Contents</h3> <br> <h5> Link 1<br><br> Link 2<br><br> Link 3<br><br> Link 4<br><br> </h5> </body> </html>
<html> <head><title>Right Pane (frame2.htm)</title> </head> <body bgcolor="#FFFFFF" text="000000" link="000000" vlink="FF0000"> <h3 align="center">Information Page</h3> <br> <h5>Welcome. Here you can find....</h5> </body> </html>
T+
GOSTEI 0
Lipsil
02/04/2004
Kra...
eu to achando aqui q o problema esta pq eu uso o Internet Explorer 5.5 então...
kra, realmente aí faz sentido o tipo de problema dele....
Mas como a maioria dos usuários tem IEs infreiores á 6.0 será q teria um outro caminho de fazer isso q estou querendo?
Valew
eu to achando aqui q o problema esta pq eu uso o Internet Explorer 5.5 então...
kra, realmente aí faz sentido o tipo de problema dele....
Mas como a maioria dos usuários tem IEs infreiores á 6.0 será q teria um outro caminho de fazer isso q estou querendo?
Valew
GOSTEI 0
Vinicius2k
02/04/2004
lipsil,
o IE 5.5 eh o caos de bugado... tenta fazer um teste numa máquina com o 5.0...
honestamente não sei se influencia, mas não custa tentar...
T+
o IE 5.5 eh o caos de bugado... tenta fazer um teste numa máquina com o 5.0...
honestamente não sei se influencia, mas não custa tentar...
T+
GOSTEI 0
Lipsil
02/04/2004
Kra, impressionante isso...
o cód pega no I.E. 5.0 mas não pega no do Win2000Pro IE5.5...... mas nas vers~eos posteriores pegam :P hehehe
valew kra!!!
o cód pega no I.E. 5.0 mas não pega no do Win2000Pro IE5.5...... mas nas vers~eos posteriores pegam :P hehehe
valew kra!!!
GOSTEI 0
Vinicius2k
02/04/2004
Kra, impressionante isso...
o cód pega no I.E. 5.0 mas não pega no do Win2000Pro IE5.5...... mas nas vers~eos posteriores pegam :P hehehe
valew kra!!!
hehehe... num falei q o I.E 5.5 eh um horror... :D
Falow. T+
GOSTEI 0
Lipsil
02/04/2004
Instalei o Internet Explorer 6.0 SP1 e agora rodou blz o código!!
mas de primeira ao colocar no meu projeto, um trecho do cód acim deu erro.
Percebi q esse erro só da quando é declarado a uses Psock (usada para o TNMHTTP).
Pra mim não há outro jeito se não usar este componente, mas ele ta dando erro, q é o seguinte:
na hora de executar o aplicativo ele seleciona a linha e dá a msg no status:
Bem, eu percebi q é por causa desse PSock do TNHTTP... então, o q fazer pros dois não fazerem dar erro?
valew
mas de primeira ao colocar no meu projeto, um trecho do cód acim deu erro.
Percebi q esse erro só da quando é declarado a uses Psock (usada para o TNMHTTP).
Pra mim não há outro jeito se não usar este componente, mas ele ta dando erro, q é o seguinte:
na hora de executar o aplicativo ele seleciona a linha
Enum.Next(1, unk, fetched);
[Error] Unit1.pas(93): Incompatible types: ´Psock.Integer´ and ´System.Integer´ [Warning] Unit1.pas(310): For loop control variable must be simple local variable [Error] Unit1.pas(312): Operator not applicable to this operand type [Fatal Error] Project1.dpr(5): Could not compile used unit ´Unit1.pas´
Bem, eu percebi q é por causa desse PSock do TNHTTP... então, o q fazer pros dois não fazerem dar erro?
valew
GOSTEI 0
Lipsil
02/04/2004
Instalei o Internet Explorer 6.0 SP1 e agora rodou blz o código!!
mas de primeira ao colocar no meu projeto, um trecho do cód acim deu erro.
Percebi q esse erro só da quando é declarado a uses Psock (usada para o TNMHTTP).
Pra mim não há outro jeito se não usar este componente, mas ele ta dando erro, q é o seguinte:
na hora de executar o aplicativo ele seleciona a linha e dá a msg no status:
Bem, eu percebi q é por causa desse PSock do TNHTTP... então, o q fazer pros dois não fazerem dar erro?
valew
mas de primeira ao colocar no meu projeto, um trecho do cód acim deu erro.
Percebi q esse erro só da quando é declarado a uses Psock (usada para o TNMHTTP).
Pra mim não há outro jeito se não usar este componente, mas ele ta dando erro, q é o seguinte:
na hora de executar o aplicativo ele seleciona a linha
Enum.Next(1, unk, fetched);
[Error] Unit1.pas(93): Incompatible types: ´Psock.Integer´ and ´System.Integer´ [Warning] Unit1.pas(310): For loop control variable must be simple local variable [Error] Unit1.pas(312): Operator not applicable to this operand type [Fatal Error] Project1.dpr(5): Could not compile used unit ´Unit1.pas´
Bem, eu percebi q é por causa desse PSock do TNHTTP... então, o q fazer pros dois não fazerem dar erro?
valew
GOSTEI 0
Lipsil
02/04/2004
Instalei o Internet Explorer 6.0 SP1 e agora rodou blz o código!!
mas de primeira ao colocar no meu projeto, um trecho do cód acim deu erro.
Percebi q esse erro só da quando é declarado a uses Psock (usada para o TNMHTTP).
Pra mim não há outro jeito se não usar este componente, mas ele ta dando erro, q é o seguinte:
na hora de executar o aplicativo ele seleciona a linha e dá a msg no status:
Bem, eu percebi q é por causa desse PSock do TNHTTP... então, o q fazer pros dois não fazerem dar erro?
valew
Enum.Next(1, unk, fetched);
[Error] Unit1.pas(93): Incompatible types: ´Psock.Integer´ and ´System.Integer´ [Warning] Unit1.pas(310): For loop control variable must be simple local variable [Error] Unit1.pas(312): Operator not applicable to this operand type [Fatal Error] Project1.dpr(5): Could not compile used unit ´Unit1.pas´
Desculpem-me ressucitar este tópico, mas é q não consegui solucionar o problema, alguem saberia me dizer como corrigi-lo?
Valew
GOSTEI 0