Delphi3はTwebbrowserコンポーネントを持ち始めましたが、その時点でActiveXコントロールの形で表示され、その後の4.0と5.0で導入する必要がありました。コンポーネントパネルがオンになっています。私はしばしば、Delphiが非常に貧弱であることを聞きますもっと迷惑なことです。
Twebbrowserを使用してプログラムを作成し、インターネットから収集したいくつかの例を紹介します。
1。初期化と最終化
Twebbrowserの方法を実行してExecWBなどの目的の操作を実行すると、「未登録の欠落ターゲットをアクティブにしようとする」または「登録されていないOLEオブジェクト」などのエラーに遭遇した可能性があります。選択したWebページのコンテンツをクリップボードなどにコピーできないなど、目的の結果には行われていません。プログラムに使用したとき、ExecWBは機能しないことがわかりましたが、Delphiによって生成されたデフォルトのプロジェクトメインウィンドウを追加しても、実行中に「OLEオブジェクトが登録されていない」エラーが発生しません。また、OLEオブジェクトを初期化して終了する必要があることに気付いたのは偶発的な機会でもありました(理解するものが少なすぎます)。
以前の記事「Delphiプログラムウィンドウアニメーションと通常のアレンジメントタイルのソリューション」で説明した方法を使用しました。ついにそれを成し遂げました!その理由は、Twebbrowserが組み込まれたOLEオブジェクトであり、Delphiで書かれたVCLではないためだと思います。
初期化
oleinitialize(nil);
ファイナライゼーション
試す
oleunInitialize;
を除外する
終わり;
これらの文は、メインウィンドウのすべてのステートメントの後、「終了」の前に配置されます。
-------------------------------------------------------------- ------------------------------------------
2。emattyparam
Delphi 5では、Twebbrowserのナビゲート方法が複数回過負荷になります。
手順ナビゲート(const url:widestring);
手順ナビゲート(const url:widestring; var flags:
Olevariant);
手順ナビゲート(const url:widestring; var flags:
olevariant;
手順ナビゲート(const url:widestring; var flags:
olevariant;
Olevariant);
手順ナビゲート(const url:widestring; var flags:
olevariant;
olevariant:olevariant);
実際のアプリケーションでは、後者の方法を呼び出す場合、後者のパラメーターをめったに使用しないが、関数宣言には変数パラメーターが必要であるため、一般的な方法は次のとおりです。
var
T:Olevariant;
始める
webbrowser1.navigate(edit1.text、t、t、t、t);
終わり;
変数Tを定義するのは非常に厄介です(そして、それを使用する場所はまだたくさんあります)。実際、代わりにemptyparamを使用できます(emptyparamは一般的な変数の空の変数であり、値を割り当てないでください)、1つの文だけです。
webbrowser1.navigate(edit1.text、emptyparam、emptyparam、emptyparam、emptyparam);
もう少し長いですが、変数を毎回定義するよりもはるかに便利です。もちろん、最初の方法も使用できます。
webbrowser1.navigate(edit1.text)
-------------------------------------------------------------- ------------------------------------------
3。execWBメソッドを使用して、共通のコマンド操作を完了できます。
手順execWB(cmdid:olecmdid; cmdexecopt:
olecmdexecopt);
手順execWB(cmdid:olecmdid; cmdexecopt:olecmdexecopt;
var pvain:
Olevariant);
手順execWB(cmdid:rolecmdid; cmdexecopt:
olecmdexecopt;
olevariant;
オープン:[インターネットアドレスを開く]ダイアログボックスが表示され、CommandIDはOLECMDID_OPENです(ブラウザバージョンがIE5.0の場合、
このコマンドは利用できません)。
ASを保存します:ダイアログボックスとして保存を呼び出します。
execwb(olecmdid_saveas、olecmdexecopt_dodefault、
emathyparam、
emptyparam);
印刷、印刷プレビュー、ページ設定:「印刷」、「印刷プレビュー」、「ページ設定」ダイアログボックスを呼び出します(つまり、「タイプ」バージョンのみをサポートしています
プレビューを印刷するため、実装はこのコマンドが利用可能かどうかを確認する必要があります)。
execwb(olecmdid_print、olecmdexecopt_dodefault、
emathyparam、
emptyparam);
querystatuswb(olecmdid_printpreview)= 3の場合
execwb(olecmdid_printpreview、olecmdexecopt_dodefault、
emptyparam、emptyparam);
execwb(olecmdid_pagesetup、olecmdexecopt_dodefault、
emathyparam、
emptyparam);
カット、コピー、貼り付け、すべてを選択:関数について多くのことを言う必要はありません。カットと貼り付けは、フレームの編集にテキストだけでなく、Webページでの編集も提供することに注意することが重要です。
編集ボックスのテキストも効果的です。そのコマンドを取得しますステータスを有効にします
コマンドを実行するには2つの方法があります(コピーを例として使用する、すべてを切断、貼り付け、選択すると、それぞれのキーワードを置き換えます。
それを変更するだけです。つまり、それぞれカット、貼り付け、選択を選択します):
A. TwebbrowserのQueryStatUSWBメソッドを使用します。
if(querystatuswb(olecmdid_copy)= olecmdf_enabled)または
OLECMDF_SUPPORTED)次に
execwb(olecmdid_copy、olecmdexecopt_dodefault、
emathyparam、
emptyparam);
B. ihtmldocument2のquerycommandenabledメソッドを使用します。
var
doc:ihtmldocument2;
始める
doc:= webbrowser1.document as ihtmldocument2;
doc.querycommandenabled( 'copy')の場合
doc.execcommand( 'copy'、false、emptyparam);
終わり;
検索:9番目の「検索」関数を参照してください。
-------------------------------------------------------------- ------------------------------------------
4。フォントサイズ
「最大」から「フォント」メニューの「最小」から「最小」までの5つのアイテム(整数0〜4、最大などに対応して、5つのメニュー項目の名前が次のとおりであると仮定して、タグ
プロパティはそれぞれ0〜4に設定されています)。
A.現在のページのフォントサイズをお読みください。
var
T:Olevariant;
始める
webbrowser1.execwb(olecmdid_zoom、
OLECMDEXECOPT_DONTPROMPTUSER、
emptyparam、t);
のケースT
4:最大。チェック:= true;
3:ergare.checked:= true;
2:Middle.Checked:= true;
1:small.checked:= true;
0:smallest.checked:= true;
終わり;
終わり;
B.ページフォントサイズを設定します。
最大。チェック:= false;
大きい。チェック:= false;
Middle.checked:= false;
small.checked:= false;
最小。チェック:= false;
tmenuitem(sender).checked:= true;
t:= tmenuitem(sender).tag;
webbrowser1.execwb(olecmdid_zoom、
OLECMDEXECOPT_DONTPROMPTUSER、
t、t);
-------------------------------------------------------------- ------------------------------------------
5.お気に入りに追加し、お気に入りを整理します
const
clsid_shelluihelper:tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
var
P:手順(ハンドル:thandle; path:pchar);
手順tform1.organizefavorite(sender:tobject);
var
H:hwnd;
始める
h:= loadLibrary(pchar( 'shdocvw.dll'));
H <> 0の場合
始める
p:= getProcAddress(h、pchar( 'doorganizefavdlg'));
割り当てられた場合(p)、p(application.handle、
pchar(favfolder));
終わり;
Freelibrary(H);
終わり;
手順tform1.addfavorite(sender:tobject);
var
shelluihelper:ishelluihelper;
URL、タイトル:Olevariant;
始める
タイトル:= webbrowser1.locationname;
url:= webbrowser1.locetyurl;
url <> ''の場合
始める
shelluihelper:= createcomobject(clsid_shelluihelper)as
Ishelluihelper;
shelluihelper.addfavorite(url、title);
終わり;
終わり;
上記の方法を使用してIshelluihelperインターフェイスを介して[お気に入りに追加]ダイアログボックスを開く方法は比較的単純ですが、欠点があります。つまり、開くウィンドウはモードウィンドウではなく、アプリケーションとは無関係です。ダイアログを開くために整理されたお気に入りの手順と同じ方法を使用する場合、親ウィンドウのハンドルを指定できるため、モードウィンドウを自然に実装できると考えられます(効果は「お気に入りに追加」を開くのと同じです。 ExplorerとIEのダイアログ)。問題は明らかにこれです。上記の2つのプロセスの著者は、shdocvw.dllのdoorganizefavdlgのプロトタイプのみを知っていましたが、doaddtofavdlgのプロトタイプではないため、Ishelluihelperインターフェイスを使用して実装しなければなりませんそれがパターンウィンドウであるかどうかは関係ありませんか?
次のプロセスでは、doaddtofavdlgの関数プロトタイプがわかります。この方法で開かれたダイアログボックスは、「OK」が選択されているかどうかをアプリケーションユーザーに伝えるだけで、同時にユーザーの2番目のパラメーターを返すことに注意してください。 .urlファイルを作成するためのパスは、アプリケーション自体によって行われます。
手順tform1.addfavorite(ie:tembeddedwb);
手順createurl(aurlpath、aurl:pchar);
var
urlfile:Tinifile;
始める
urlfile:= tinifile.create(string(aurlpath));
rlfile.writestring( 'internetshortcut'、 'url'、
string(aurl));
rlfile.free;
終わり;
var
addfav:function(handle:thandle;
urlpath:pcharsize:枢機inal;
タイトル:PCHALSIZE:枢機inal;
favidlist:pitemidlist):bool;
fdoc:ihtmldocument2;
urlpath、url、title:array [0..max_path] of char;
H:hwnd;
PIDL:PiteMidlist;
FRETOK:BOOL;
始める
fdoc:= ihtmldocument2(ie.document);
fdoc = nilの場合、終了します。
strpcopy(title、fdoc.get_title);
strpcopy(url、fdoc.get_url);
url <> ''の場合
始める
h:= loadLibrary(pchar( 'shdocvw.dll'));
H <> 0の場合
始める
shgetspecialFolderlocation(0、csidl_favorites、pidl);
addfav:= getProcAddress(h、pchar( 'doaddtofavdlg'));
割り当てられている場合(addfav)
fretok:= addfav(handle、urlpath、sizeof(urlpath)、
タイトル、sizeof(title)、pidl)
終わり;
Freelibrary(H);
FRETOKの場合
createurl(urlpath、url);
終わり
終わり;
-------------------------------------------------------------- ------------------------------------------
6. Webbrowserフォーカスを作成します
Twebbrowserは非常に特別です。
Explorer自体にはショートカットキーがあり、ソリューションは次のとおりです。
手順tform1.setfocustodoc;
始める
WebBrowser1.Document <> nil thenの場合
ioleObjectが行うように、webbrowser1.applicationを使用します
doverb(oleiverb_uiactivate、nil、webbrowser1、0、handle、
getClientRect);
終わり;
それとは別に、私は簡単な方法も見つけました。これはここにリストされています。
WebBrowser1.Document <> nil thenの場合
ihtmlwindow2(ihtmldocument2(webbrowser1.document).parentwindow).focus
より簡単な方法を見つけたばかりで、おそらく最も簡単です:
WebBrowser1.Document <> nil thenの場合
ihtmlwindow4(webbrowser1.document).focus
また、ドキュメントが焦点を獲得したかどうかを判断する必要があります。
ihtmlwindow4(webbrowser1.document).hasfocus thenの場合
-------------------------------------------------------------- ------------------------------------------
7. [送信]ボタンをクリックします
プログラムの各フォームに「デフォルト」ボタンがあるように、Webページの各フォームには「デフォルト」ボタン、つまり、ユーザーがEnterキーを押すとボタンがありますマウスで「送信」をクリックするのと同等です。ただし、TwebbrowserはEnterキーに応答していないようであり、Twebbrowserを含むフォームのキープレビューがTrueに設定されていても、ユーザーからTwebbrowserに送信されたキーをフォームのキープレスイベントで傍受することはできません。
私の解決策は、ApplicAneventsコンポーネントを使用するか、自分でTapplicationオブジェクトのメッサージイベントを作成し、メッセージタイプを判断し、キーボードメッセージに応答することです。 「送信」ボタンをクリックすると、Webソースコードを分析することで実行できますが、最初のタイプは2つのタイプです。他の誰かがコードを書いています。
A. sendkeys関数を使用して、EnterキーをWebbrowserに送信します
デルフィで
5 sndkey32.pasファイルは、sendkeysとappactivateの2つの機能を含む情報/sendkeysディレクトリがあります。それは非常にシンプルです。ウェブブラウザーがフォーカスを取得するために含まれるドキュメントを必要としない場合、1つのステートメントを使用してください。
sendkeys( '〜'、true); // returnキーを押します
SendKeys関数などの詳細なパラメーター説明は、sndkey32.pasファイルに含まれています。
B.受信したキーボードメッセージを、オンメッサージイベントでWebbrowserに渡します。
手順tform1.applicationevents1message(var msg:tmsg;
var処理:boolean);
{Webbrowser内のいくつかのキーの誤動作を修正します
コントロール}
const
stdkeys = [vk_tab、vk_return];
extkeys = [vk_delete、vk_left、vk_right];
拡張キー}
fextended = $ 01000000;
始める
処理:= false;
MSGを使用してください
if((message> = wm_keyfirst)および(message <= wm_keylast)))
そして
((stdkeysのwparam)または
{$ ifdef ver120}(getKeyState(vk_control)<0)または{$ endif}
(extkeysのwparam)と
((lparam and fextended)= fextended))その後
試す
ischild(handle、hwnd)の場合、{すべてのブラウザーを処理します
関連メッセージ}
始める
{$ ifdef
ver120} application _ {$ else} application {$ endif} as
ioleinplaceactiveObject do
処理:= TranslateCcelerator(MSG)= S_OK;
処理されていない場合
始める
処理:= true;
TransMessage(MSG);
DispatchMessage(MSG);
終わり;
終わり;
を除外する
終わり;
終了; //メッセージハンドラー
(この方法はembeddedwb.pasに由来します)
-------------------------------------------------------------- ------------------------------------------
8.WebページソースコードとHTMLをTwebbrowserから直接入手してください
まず、TwebbrowserがアクセスしているWebページのソースコードを取得するための非常に簡単な方法を紹介しましょう。一般的な方法は、Twebbrowserコントロールのドキュメントオブジェクトによって提供されるImperStreamInitインターフェイスを使用して、webbrowser.documentオブジェクトが有効かどうかを確認し、IpersistStreaminitインターフェイスを取得し、 HTMLソースコードサイズ、グローバルヒープメモリブロックを割り当て、ストリームを作成してから、HTMLテキストをストリームに書き込みます。プログラムは複雑ではありませんが、より簡単な方法があるため、実装コードは与えられなくなりました。実際、基本的にすべてのIE関数Twebbrowserには、それらを実装する比較的簡単な方法が必要であり、Webページソースコードの取得にも同じことが当てはまります。次のコードには、MEMO1にWebページソースコードが表示されます。
memo1.lines.add(ihtmldocument2(webbrowser1.document).body.outerhtml);
同時に、Twebbrowserを閲覧するときにHTMLファイルをテキストファイルとして保存することは非常に簡単であり、Twebbrowserも次のように完了するため、構文解析ツールは必要ありません。
memo1.lines.add(ihtmldocument2(webbrowser1.document).body.outertext);
-------------------------------------------------------------- ------------------------------------------
9。「検索」関数
ドキュメントが焦点を合わせると、キーCtrl-Fを押すことで、検索ダイアログボックスを呼び出すことができます。それを作成するためのプログラム、つまり、自分で検索ダイアログボックスを設計できます。
var
doc:ihtmldocument2;
txtrange:ihtmltxtrange;
始める
doc:= webbrowser1.document as ihtmldocument2;
doc.selectall;
//この文は特に重要です。なぜなら、ihtmltxtrangeオブジェクトの方法は操作できるという前提は
//ドキュメントにはすでにテキスト選択領域があります。次のステートメントが実行されるため、そうではありません
//すべてのドキュメントを選択するプロセスを参照してください。
txtrange:= doc.selection.createrange as ihtmltxtrange;
txtrange.findtext( 'テキストを検索するテキスト'、0.0);
txtrange.select;
終わり;
また、TXT.GET_TEXTから現在選択されているテキストコンテンツを取得できます。これは、ある時点で役立ちます。
-------------------------------------------------------------- ------------------------------------------
10. Webページにすべてのリンクを抽出します
この方法は、自分で実験したかったモノポリーフォーラムホップフィールドフォーラムの友人から来ていますが、私は常に失敗しました。
var
doc:ihtmldocument2;
すべて:IHTMLELEMENTCOLLECTION;
レン、I:整数;
アイテム:Olevariant;
始める
doc:= webbrowser1 .document as ihtmldocument2;
すべて:= doc.get_links; //doc.linksも問題ありません
len:= all.length;
i:= 0からlen-1が始まります
item:= all.item(i、varmenty); // empryparamも大丈夫です
memo1.lines.add(item.href);
終わり;
終わり;
-------------------------------------------------------------- ------------------------------------------
11. Twebbrowserのエンコードを設定します
なぜ私はいつも多くの機会を逃すのですか?実際、私は長い間それを考えるべきでしたが、思考の違いはそれを違いの世界にします。私がそれについてもっと考えて、それをもっと試したなら、それは11位にランクされていなかったでしょう。ここに関数がありますが、これは想像を絶するほど簡単に解決できます。
手順SetCharset(Awebbrowser:Twebbrowser; Acharset:
弦);
var
リフレッシュレベル:olevariant;
始める
ihtmldocument2(awebbrowser.document).set_charset(acharset);
shleadlevel:= 7;
awebbrowser.refresh2(shleaslevel);
終わり;