Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebbrowser: Text aus Frames finden (https://www.delphipraxis.net/60500-twebbrowser-text-aus-frames-finden.html)

Moyyer 7. Jan 2006 20:16


TWebbrowser: Text aus Frames finden
 
Hallo alle Deplhifreunde.

Ich suche eine Möglichkeit einen Text von einer Seite, welche Frames besitzt, auszulesen.
Habe nur eine Möglichlkeit ohne Frames gefunden.

Delphi-Quellcode:
procedure TForm1.SearchAndHighlightText(aText: string);
var
  tr: IHTMLTxtRange; //TextRange Object
begin
  if not WebBrowser1.Busy then
  begin
    tr := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;
    //Get a body with IHTMLDocument2 Interface and then a TextRang obj. with IHTMLBodyElement Intf.

    while tr.findText(aText, 1, 0) do //while we have result
    begin
     ... // Ausgabe
    end;
  end;
end;
Ich habe keine Ahnung, was ich umändern muss.

Suche außerdem eine Befehlsrefernz über "Webbrowser.Documents" und "Webbrowser.OleObject", da mein Delphi (bei dieser Funktion) kein Drop-Down Menü mit Befehlen einzeigt.

Gruß Moyyer

toms 7. Jan 2006 20:56

Re: TWebbrowser: Text aus Frames finden
 
Hallo,


Probiers mal damit:
Delphi-Quellcode:
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;


// 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;

Moyyer 7. Jan 2006 21:27

Re: TWebbrowser: Text aus Frames finden
 
Hallo hab es ausgetestet nur leider legt er weder dateien an noch schreibt er irgendwas in das memo (die ausgeklammerte zeile)

der nachfolgende code ist zum ausfüllen von frame formularen gedacht und müsste vllt nur umgeschrieben werden, nur leider kenne ich die befehle nicht (brauche befehlsreferenz)

Delphi-Quellcode:
WebBrowser1.OleObject.Document.Frames.item('Name des Frames').Document.Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas'
P.S. code ist aus diesem Beitrag (Link)

toms 8. Jan 2006 00:00

Re: TWebbrowser: Text aus Frames finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Moyyer
Hallo hab es ausgetestet nur leider legt er weder dateien an noch schreibt er irgendwas in das memo (die ausgeklammerte zeile)

Was fuer eine Delphi Version/IE Version verwendest du denn?
Hab's mit D6/IE 6 probiert. Funktioniert problemlos.

WebBrowser1.OleObject.Document.Frames.item('mainFr ame').Document.Forms.item(0).Elements.item('firstn ame').value := 'firstname!';

Anbei noch ein kleines Beispiel, wie man Formulare in Frames ausfuellen kann.
(alles entpacken, da noch html Testdateien dabei sind)

marabu 8. Jan 2006 09:35

Re: TWebbrowser: Text aus Frames finden
 
Hallo.

Zitat:

Zitat von Moyyer
brauche befehlsreferenz

Da sollte dir das entsprechende Kapitel aus dem Windows Platform SDK weiterhelfen: klick

Hier noch ein Beispiel, wie du mit early binding auf den Inhalt eines frame zugreifen kannst:

Delphi-Quellcode:
procedure TWebForm.DemoButtonClick(Sender: TObject);
var
  doc: IHTMLDocument2;
  win: IHTMLWindow2;
  fc: IHTMLFramesCollection2;
  u: IUnknown;
  i: Integer;
  v: OleVariant;
begin
  doc := WebBrowser.Document as IHTMLDocument2;
  fc := doc.frames;
  ShowMessage(Format('frames detected: %d', [fc.Length]));
  for i := 0 to Pred(fc.length) do
  begin
    v := i;
    u := fc.item(v);
    if u.QueryInterface(IHTMLWindow2, win) = 0 then
      ShowMessage(win.document.body.innerHTML)
  end;
end;
Manchmal ist es unnötig oder sogar unerwünscht, dass der HTML-Code durch den WebBrowser gerendert wird. Dann hilft dir vielleicht die Demo zu den MSHTML markup services aus diesem thread weiter: klick

Grüße vom marabu

Moyyer 8. Jan 2006 11:06

Re: TWebbrowser: Text aus Frames finden
 
Hi marabu

Dein Code hat funktioniert :mrgreen:
Vielen Dank

Zitat:

Zitat:

Moyyer hat folgendes geschrieben:
brauche befehlsreferenz
Da sollte dir das entsprechende Kapitel aus dem Windows Platform SDK weiterhelfen: klick
Stimmt, auf der MSDN Website habe ich auch noch nicht gesucht :wall: :evil:

Gruß Moyyer


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz