Fórum Pegar fonte html tudo bem, mas de um frame? como ajeita esse #224144
02/04/2004
0
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
Curtir tópico
+ 0Posts
02/04/2004
Vinicius2k
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
02/04/2004
Lipsil
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
03/04/2004
Vinicius2k
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
03/04/2004
Lipsil
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
03/04/2004
Vinicius2k
hehehe... num falei q o I.E 5.5 eh um horror... :D
Falow. T+
Gostei + 0
04/04/2004
Lipsil
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
04/04/2004
Lipsil
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
05/04/2004
Lipsil
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
Clique aqui para fazer login e interagir na Comunidade :)