WebBrowserで表示中の画面の文字列検索は?

解決


武田  2005-11-11 19:55:15  No: 18624

いつも皆様にお世話になっております。
WebBrowserの画面上で文字列の検索をするため挑戦していますが、いまだできません。
そのため検索ツールは、http://homepage1.nifty.com/bmonkey/delphi/delphi.html  のSeriesMatchTestという検索コンポーネントをインストールさせていただきました。
そのデモプログラムでは、Memoデータを検索する例があるので、
そのため、このQ&Aのhttps://www.petitmonte.com/bbs/answers?question_id=3366  でhtmlソースの取得を教えていただいて、表示中のhtmlソースをMemoに格納はできるようになったのですが、WebBrowser上で検索する方法を解決できません。。コンポーネントにかかわらず、WebBrowserで表示中の画面の文字列を検索できる手法をできましたら、ご教授お願いいたします。m(_ _)m


ママん  2005-11-11 23:15:51  No: 18625

http://delphi.about.com/od/adptips2004/a/bltip1004_3.htm
から引用。
リンクだけだと分からないといけないので実際の使用例。
//usesにmshtmlが追加されていることに注意してください。
Delphi7で確認

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, mshtml;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure WBLocateHighlight(WB: TWebBrowser; Text: string) ;
const
   prefix = '<span style="color:white; background-color: blue;">';
   suffix = '</span>';
var
   tr: IHTMLTxtRange;
begin
   if Assigned(WB.Document) then
   begin
     tr := ((wb.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
     while tr.findText(Text, 1, 0) do
     begin
       tr.pasteHTML(prefix + tr.htmlText + suffix) ;
       tr.scrollIntoView(True) ;
     end;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('https://www.petitmonte.com/bbs/answers?question_id=3405');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WBLocateHighlight(WebBrowser1,'武田') ;
end;

end.


武田  2005-11-12 02:42:51  No: 18626

ママんさま、いつも教えていただいて有り難うございます。
小生のレベルにあわせてご指導いただき有り難うございます。
コード自体はわかりましたが、uses節の mshtmlと SHDocVwで
mshtml.dcuが見つかりません
SHDocVw.dcuが見つかりません
とエラーで出ます。多分何かのコンポーネントが未インストだと思い、Borlandフォルダを検索しても見つかりませんでした。
何か他からインストールする必要があるのでしょうか。
それと、質問で書きませんでしたが
環境は、Win XP pro  Delphi6Personalです。失礼しました。
できましたら、教えていただければ幸いです。m(_ _)m


ママん  2005-11-12 03:29:38  No: 18627

実際にpersonalをインストールしていないので、未確認情報ですが、
googleで調べたら、2ちゃんねるの書き込みに
「ActiveXを取り込んで、SHDocVwとMSHTMLをそれぞれSHDocVw_TLB,MSHTML_TLBに書き替えればいけるはずです。」
というのがありました。
がんばってみてください。


ママん  2005-11-12 03:33:21  No: 18628

あっあと、テストだけなら
こっちの方が無難です。
procedure WBLocateHighlight(WB: TWebBrowser; Text: string) ;
const
   prefix = '<span style="color:white; background-color: blue;">';
   suffix = '</span>';
var
   tr: IHTMLTxtRange;
begin
   if Assigned(WB.Document) then
   begin
     tr := ((wb.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
     if tr.findText(Text, 1, 0) = True then
     begin
       tr.pasteHTML(prefix + tr.htmlText + suffix) ;
       tr.scrollIntoView(True) ;
     end;
     //while tr.findText(Text, 1, 0) do
     //begin
     //  tr.pasteHTML(prefix + tr.htmlText + suffix) ;
     //  tr.scrollIntoView(True) ;
     //end;
   end;
end;


Mr.XRAY  URL  2005-11-12 04:36:42  No: 18629

>uses節の mshtmlと SHDocVwでmshtml.dcuが見つかりません
>環境は、Win XP pro  Delphi6Personalです。失礼しました。

Personal版には該当ファイルはありません.
武田さんは,既にWebBrowserでURLの表示はできているわけですから.
usseにSHDocVw_TLB.pasというのがあるハズです.これがPro版以上の
SHDocVw.pasに相当します.

mshtmlの方は,以下の手順でインストールします.
(1) [プロジェクト][タイプライブラリの取込み]で
(2) [Microsoft HTML Object Library (Version4.0)]を選択
(3) [インストール]ボタンをクリック
(4) かなり時間がかかる
(5) IDE上で[パッケージ]のダイアログが表示されたら保存して終了
(6) [ActiveX]のタブに[Internae Explorer]が追加されている
(7) 本体は,C:\..... \Delphi6\Import\MSHTML_TLB.pas(11MB以上)

このMSHTML_TLBがpro版以上のmshtml.pasに相当します.
必要であれば,pro版以上と同じ名前にして使用できます.
名前の変更には注意が必要です.Unitの先頭も直す必要があります.
以下を参考にして下さい.

http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/B_UseD6Personal.htm


Mr.XRAY  URL  2005-11-12 04:57:45  No: 18630

というわけで,ママんさんのコードをDelphi Personlで試してみました.
残念,「未定義の...」がいくつかでてコンパイルできませんでした.

Delphi7 Proでは当然ながら動作しました.
ただし,WebBrowser1.Navigateはボタンクリックで起動しました.
(Form.Createではちょっとね...マズイ)

さて困りました.もうちょっと調べてみます.


Mr.XRAY  URL  2005-11-12 05:22:19  No: 18631

ゴメンなさい.
mshtmlのインストール方法が間違っていました.

(1) [コンポーネント][ActiveXコントロールの取込み]
(2) [Microsoft HTML Object Library (Version4.0)]を選択
(3) [インストール]

でした.上の手順で,WindowsXP + Delphi6 Personalで動作確認しました.


武田  2005-11-12 10:07:11  No: 18632

ママん様、Mr.XRAY様、詳細なご指導有り難うございました。
ママんさま、2チャンネルを参考に挑戦してみます。
Mr.XRAY様、SHDocVw_TLBはあります。mshtmlのインストールに挑戦していましたが、どうもうまくいかないのもので。エラーは、未定義の識別子。  カーソルがあるところが、procedure borderColor: Widesring dispid 247413058。(関係ないかも)。
再度ここを見てみましたら訂正がありましたので再度いまから挑戦します。

ぱっぱっとはいけませんので、しばらく時間をいただきます。
なお、Mr.XRAY様のホームページはいつも参考にさせていただいております。
小生には、少し高度ですが・・。
また、「Delphi6 Personal版での利用」は以前この件で投稿する前に見たことがありました。その時点ではまだ理解できませんでしたが、既存のコンポーネントに追加して、壊したことがあるので覚えています。今回どういうことの説明なのかわかりましたので、参考にさせていただきます。
また、以前IEDownLoadを紹介していただいて有り難うございました。
他のコンポーネントと比較して抜群の速さです。htmlソースを分析して保存フォルダをコントロールするのに苦労しました。おかげさまで拙作の「スクラップブック機能付きタブブラウザ」もほぼ完成に近づき文字列検索を残すのみになりました。
有り難うございました。m(_ _)m


武田  2005-11-12 10:22:34  No: 18633

すみません、自己レスです。肝心な質問を忘れました。
Mr.XRAY様の(1) [コンポーネント][ActiveXコントロールの取込み]ですが、Microsoft ActiveX Data Objects 2.8Libraryまでバージョンがありますが2.8でいいのでしょうか?
こんなこともわからず、申し訳ありません。
よけいなことをする前に教えていただければありがたいです。
お願いいたします。m(_ _)m


Mr.XRAY  URL  2005-11-12 20:26:22  No: 18634

>Microsoft ActiveX Data Objects 2.8Library

私のDelphi6 Personal(UP2)が入ったPC(on VMWare)は,Data Objectsは
入れていませんのであしからず.
今回インストールすべきは,
[Microsoft HTML Object Library (Version4.0)]
ですね.参考までに私がテストしたコードです.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,mshtml_TLB, StdCtrls, OleCtrls, SHDocVw_TLB;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WBLocateHighlight(WB: TWebBrowser; Text: string) ;
const
   prefix = '<span style="color:white; background-color: blue;">';
   suffix = '</span>';
var
   tr: IHTMLTxtRange;
begin
   if Assigned(WB.Document) then
   begin
     tr := ((wb.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
     while tr.findText(Text, 1, 0) do
     begin
       tr.pasteHTML(prefix + tr.htmlText + suffix) ;
       tr.scrollIntoView(True) ;
     end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('https://www.petitmonte.com/bbs/answers?question_id=3405');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WBLocateHighlight(WebBrowser1,'武田'); 
end;

end.


武田  2005-11-12 23:21:59  No: 18635

さんざんお世話になります。
msHTMLコンポーネントのインストールに挑戦していますが、未だに成功していません。
作業経過をご報告させていただき、何かアドバイスかヒントがございましたらご指導をよろしくお願いいたします。
1_\lib\mshtmlフォルダを作成しました。ここに入れようとして。
2_[プロジェクト][タイプライブラリの取込][Microsoft HTML Object Library (Version4.0)]を選択
3_検索パス窓で作成したmshtmlフォルダを登録
4_インストールボタン(コンポーネントラッパーの作成はチェック入り{意味不明})
5_インストールダイアログで新規パッケージに追加を選択
6_ファイル名にフルパスでmsHTML.dpk  と名前を付けて、説明に  msHTMLとつけて「OK」
7_しばらくしてから  確認ダイアログに  インストールするにはコンパイルしなければ・・・・で「はい」
9_メッセージダイアログに、数個の
[警告]MSHTML_TLB.pas  ’className ’の生鮮源のため基本クラスのメンバーが遮蔽されました。と
[エラー]MSHTML_TLB.PAS  未定義の識別子  'fonts',同じく'FlockFormats','Count',もう一個'count'の4個のエラーが表示されます。’color’が出たこともあります。
エラー4,警告70、ヒント0、致命的エラー1  です。
画面には自動的にMSHTML_TLB.PASのユニットが表示されます。
毎回?  5003行37文字でカーソルが止まりますが、偶然かどうかはわかりませんが。
「property borderColor: WideString dispid -2147413058;」、
10_パッケージダイアログには
        Containsに      MSHTML_TLB.dcr、MSHTML_TLB.pas、Requiresにrtl.dcp、vcl.dcpがあります。
11_\imports\には     MSHTML_TLB.pas、MSHTML_TLB.dcr、MSHTML_TLB.dcuなどがありpasは11MB以上です。
12_\Borland\Lib\MsHTMLにはmsHTML.res、msHTML.cfg、msHTML.dof、msHTML.dpkができています。
13_結果、コンポーネントはインストールされていません。
以上の状況ですが、アドバイスがございましたら、お願いいたします。m(_ _)m


Mr.XRAY  URL  2005-11-13 00:37:48  No: 18636

その手順は,先に私がレスした間違った方法です.また武田さんの方法
ですと,別にパスなどの設定が必要となってしまいます.

インストールしたdpk,dplを削除し,該当ファィルも削除して下さい.
そして新たに,後でレスした手順でインストールして下さい.
改めて詳しく書きます.

(1) [コンポーネント][ActiveXコントロールの取込み]
(2) [Microsoft HTML Object Library (Version4.0)]を選択
(3) [インストール]ボタンをクリック
(4) [インストール]ダイアログで,[既存のパッケージに追加]タブ
(5) [参照]欄が
    C:\Program Files\Borland\Delphi6\Lib\dclusr.dpk
    となっていることを確認.そうでなければこれにする.
(6) [OK]ボタンクリック
(7) 再構築,保存して終了

以上です.


武田  2005-11-14 04:09:35  No: 18637

Mr.XRAY様、成功しました。
長々と、ドジにつきあっていただきお手間を取らせて申し訳ありませんでした。
当初、○○があるから読み込めません。の様なエラーが出て、何か先にインストールしてあるものと相性が悪いのかなと、考えていました。
ある時、うまくいったような気がして、dclusr.dpkにインストールとしたら、
過去のコンポーネントが破壊されました。
新規ならいいのではとやっていましたが、やはり○○があるから読み込めないと出るので、Delphiを削除して再インストールしましたら、成功しました。
これから、過去にインストールしたコンポーネントを思い出しながら、再登録していきます。
大変お手数をおかけしてすみませんでした。
いい勉強になりました。
また、ご指導ください。m(_ _)m。


Mr.XRAY  URL  2005-11-14 04:58:32  No: 18638

>当初、○○があるから読み込めません。

これは,主にすでに登録されているファイルなどが存在する場合に
現れます.今回の場合,前に別の名前でdpkを作成したことも原因の
ひとつかも知れません(削除がうまくいっていない).

たとえ別のパッケージであっても,他のパッケージにあるファイルは
登録できません.

教訓.
まだ慣れないうちは,デフォルトのままで登録や作業をすることです.
そうすれば,うまくいかなかった時の対応もデフォルトでできます.

とにもかくご苦労様でした.


武田  2005-11-15 01:47:55  No: 18639

Mr.XRAY様、ママん様、今回は本当に有り難うございました。
駆け出しが少しずつなれてくるとコンポーネントの取込という問題が出てきますが、正直他のコンポーネントを取り込んで利用する仕組みの概念は理解していません。コンポーネントのインストール、アンインストールについての解説サイトは滅多にお目にかかりませんのでMr.XRAY様のサイトの解説はよく利用させていただいております。
今回、合計4回のDelphiの再インストールを行いましたが、(#理解していないからぐちゃぐちゃになったら修復する能力がないため最初からやり直そうとデリートします)過去にインストールしたコンポーネントを再インストールするのはどこから何のため取得したのか思い出すのが大変苦労しますが、コンポーネントの構成をバックアップしておいて、さっさっと貼り付けておしまいとできれば助かるのだがと考えております。コンポーネントの管理をきちんとしておこうと反省しております。
今回は有り難うございました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加