Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit MSHTMLTxtRange (https://www.delphipraxis.net/43069-problem-mit-mshtmltxtrange.html)

Benjin 28. Mär 2005 16:48


Problem mit MSHTMLTxtRange
 
Hallo,

ich möchte mit Hilfe eines IHTMLTxtRange Objekts einen bestimmten Term in 4 verschiedenen HtmlSeiten suchen.
Dazu lasse ich in einer Schleife zunächst die entsprechende Seite aufrufen, um dann das TxtRange Objekt zu benutzen. Leider wird bei meiner Implementierung stets eine EAccessViolation aufgerufen, obwohl die Funktion ohne entsprechende Schleife, also bei der Suche in nur einem Dokument einwandfrei funktioniert.

Delphi-Quellcode:
procedure MultiSearch(Term: String);
var
   tr: IHTMLTxtRange;
   i: Integer;
begin

if Term <> '' then
 begin
for i:= 0 to 3 do
 begin

 FrmMultisearch.WBMultiSearch.Navigate(AdrArticles + IntToStr(i) +     
 '.html');


 if not FrmMultisearch.WBMultiSearch.Busy then
   begin


      tr := ((FrmMultisearch.WBMultiSearch.Document as  
                  IHTMLDocument2).body as
      IHTMLBodyElement).createTextRange;
    {Get a body with IHTMLDocument2 Interface and then a
      TextRang obj. with IHTMLBodyElement Intf.}

    while tr.findText(Term, 1, 0) do //while we have result
      begin

      inc(hitcounts[i]);
      end;
    end;

  end;
 end;
end;

Leider werd ich aus der MSHTML Referenz auch nicht schlauer, wodurch diese Exception geworfen werden könnte.

Benjin 27. Apr 2005 19:50

Re: Problem mit MSHTMLTxtRange
 
Halli Hallo, weiß hier niemand Rat?

:|

marabu 28. Apr 2005 13:12

Re: Problem mit MSHTMLTxtRange
 
Zitat:

Zitat von Benjin
Leider wird bei meiner Implementierung stets eine EAccessViolation aufgerufen, obwohl die Funktion ohne entsprechende Schleife, also bei der Suche in nur einem Dokument einwandfrei funktioniert.

Beides ist kaum zu glauben.

Mit diesem Busy-Test hat der nachfolgende Code keine Chance je ausgeführt zu werden. Ich schlage vor du wartest, bis das Dokument geladen worden ist.

Delphi-Quellcode:
// if not FrmMultisearch.WBMultiSearch.Busy then
while FrmMultisearch.WBMultiSearch.Busy {and not UserCancel} do //
  ApplicationProcessMessages;
Und mit dieser Parameterversorgung arbeitet findText() auf einem 1 Zeichen großen Bereich. Sehr effizient, aber wenig informativ. Lass den Wert besser auf 0. Und wenn du nicht ab und zu den Suchbereich verschiebst, dann machst du den ganzen Geschwindigkeitsvorteil von oben wieder zunichte, weil immer wieder an der selben Stelle gesucht wird.

Delphi-Quellcode:
// while tr.findText(Term, 1, 0) do begin // Siehe Anmerkung 2
while tr.findText(Term, 0, 0) do begin // Suchen bis zum Ende des Textes
  inc(hitcounts[i]);
  tr.collapse(false); // Suchbereich neu festlegen
end;
Grüße vom marabu

Benjin 28. Apr 2005 15:20

Re: Problem mit MSHTMLTxtRange
 
Also,

ich habe mich mit diesem Problem wirklich ewig herumgeschlagen.

Nun, wie es so oft ist. Die Lösung war eine naheliegende und doch so abwegige.

Operationen, die auf einen TWebBrowser angewandt werden, funktionieren teilweise nur wenn dieser
auch "visible" ist.


Meine Implementierung beinhaltete aber eine Suche im Hintergrund, d.h. ich habe eine unsichtbare Form,
auf der TWebBrowser Elemente plaziert sind, in denen die Suche nach dem gesuchten term stattfindet.

Die Ergebnisse werden in eine Html Datei geschrieben, die Verlinkgungen a la:

"6 Treffer auf Seite y" enthält,

diese Treffereinträge kann man klicken, dann wird die entsprechende Seite in einem Hauptbrowser angezeigt.


Nun stellt sich mir ein neues Problem:

Wie kann ich die Form verbergen, ohne dass "visible" auf false gestellt wird?


Grüße,

jan

toms 28. Apr 2005 15:24

Re: Problem mit MSHTMLTxtRange
 
Zitat:

Zitat von Benjin
Wie kann ich die Form verbergen, ohne dass "visible" auf false gestellt wird?

Indem du die Form ins Nirvana befoerderst. FormX.Left := -MaxInt;

marabu 28. Apr 2005 15:45

Re: Problem mit MSHTMLTxtRange
 
Zitat:

Zitat von Benjin
Nun, wie es so oft ist. Die Lösung war eine naheliegende und doch so abwegige.

Abwegig trifft es ganz gut. Normalerweise nimmst du einen Parser (z.B. diesen oder jenen), solange du den HTML Code nicht visualisieren willst.

Grüße vom marabu

Benjin 28. Apr 2005 15:53

Re: Problem mit MSHTMLTxtRange
 
Zitat:

Zitat von marabu
Zitat:

Zitat von Benjin
Nun, wie es so oft ist. Die Lösung war eine naheliegende und doch so abwegige.

Abwegig trifft es ganz gut. Normalerweise nimmst du einen Parser (z.B. diesen oder jenen), solange du den HTML Code nicht visualisieren willst.

Grüße vom marabu


Das wäre die Notlösung gewesen, mit der implementierten Markierfunktion von TWebBrowser ist es einfacher und komfortabler umzusetzen.

Dass sich mein Programm dadurch ein wenig aufbläht, fällt nicht sehr ins gewicht, da es insgesamt sehr kompakt ist.


Danke für deine Hilfe.


jan


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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