![]() |
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. |
Re: Problem mit MSHTMLTxtRange
Halli Hallo, weiß hier niemand Rat?
:| |
Re: Problem mit MSHTMLTxtRange
Zitat:
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:
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.
// if not FrmMultisearch.WBMultiSearch.Busy then
while FrmMultisearch.WBMultiSearch.Busy {and not UserCancel} do // ApplicationProcessMessages;
Delphi-Quellcode:
Grüße vom marabu
// 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; |
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 |
Re: Problem mit MSHTMLTxtRange
Zitat:
|
Re: Problem mit MSHTMLTxtRange
|
Re: Problem mit MSHTMLTxtRange
Zitat:
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 09:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz