Pegar fonte html tudo bem, mas de um frame? como ajeita esse

Delphi

02/04/2004

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:
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

Lipsil

Curtidas 0

Respostas

Vinicius2k

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?

<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

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


GOSTEI 0
Vinicius2k

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+


GOSTEI 0
Lipsil

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!!!


GOSTEI 0
Vinicius2k

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

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
 Enum.Next(1, unk, fetched);
e dá a msg no status:
[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

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
 Enum.Next(1, unk, fetched);
e dá a msg no status:
[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

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
 Enum.Next(1, unk, fetched);
e dá a msg no status:
[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


Desculpem-me ressucitar este tópico, mas é q não consegui solucionar o problema, alguem saberia me dizer como corrigi-lo?


Valew


GOSTEI 0
POSTAR