OZの部屋

なんでも日記です

TWebBrowser のポップアップメニューを入れ替える

2006-11-13 18:09:35 | プログラム
TWebBrowser を使ってポップアップメニューをカスタマイズする方法がわからなかった。
popupmenuプロパティに設定しても何の変化もなし。


やっぱり探せばあるもんだ。
ちゃんと解決方法を公開しているのがありました。
http://www.delphidabbler.com/articles?article=18&part=1

ここのPart6の中ほどにDownload the demo codeがあるので、サンプルを落として
Phase2 フォルダのなかの
IntfDocHostUIHandler.pas
UContainer.pas
IntfDocHostUIHandler.pas
を自分のコンパイルしたいプロジェクトにおいて
UsesにUContainerを追加


適当にpopupmenu を作る。(あとでこの中身が問題になるけど)
TWebBrowser のプロパティ
popupMenu に作成したpopupmenu を指定する。

フォームクラスの private に
fWBContainer: TWBContainer;

FormCreateで
procedure TForm1.FormCreate(Sender: TObject);
begin
fWBContainer := TWBContainer.Create(WebBrowser1);
fWBContainer.UseCustomCtxMenu := True; // use our popup menu
fWBContainer.Show3DBorder := False; // no border
fWBContainer.ShowScrollBars := False; // no scroll bars
fWBContainer.AllowTextSelection := False; // no text selection (**)
// fWBContainer.CSS := FmtCSS; // CSS to be used
サンプルではCSS使っているが。


FormDestroyでは
procedure TForm1.FormDestroy(Sender: TObject);
begin
fWBContainer.Free; // free the container pbject


これでコンパイル、実行。
WebBrowser上で右クリックするとポップアップが入れ替わっている。


TWebBrowser イベントを拾う方法

2006-11-12 23:40:18 | プログラム
TWebBrowser には OnMouseUpやOnMouseDownなどのイベントがない。

HTML内ではイベントを拾っていろいろ出来るのに
Delphiからではお手上げ、
コンポーネントは出来るだけ標準のものを使いたいけれども
embeddedWBを使うしかないかと思っていたら、
いいのを見つけました。
http://delphi.about.com/od/vclusing/a/wbsinkevents.htm

サンプルはmouseover でmouseup ,mousedownではないが、
これでHTMLのイベントをDelphiから使える

mouseup,mousedownを横取りすると
リンク先にジャンプしないので自分でURLを設定してやるか、
なにかもうひとつうまい方法をみつけなければ。

それと、HTML内のスクリプトでイベントトラップしている場合どうなるか。
まだ未検証。

今日はこれまでっ

TwebBrowserメモ

2006-11-12 11:43:12 | プログラム
空のドキュメントを開く
WebBrowser1.Navigate('about:blank');

TWebBrowser の Document を使う
参考:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects.asp

最初に
  wbdoc:OLEVariant;
  wbdoc:=WebBrowser1.OleObject.Document;
  または
  wbdoc:=WebBrowser1.Document as IHTMLDocument2;

全体のHTMLソースを取得
  wbdoc.documentElement.innerHTML;//ReadOnly
全体のHTMLタグを抜いたテキストのみを取得
  wbdoc.documentElement.innerText;//ReadOnly

  body.innerHTML  <body>abc</body> ならば abc
  body.outerHTML  <body>abc</body> タグ自身を含む

WebBrowserにHTMLソースを流し込む
  wbdoc.Write('<html><head></head><body>abc</body></html>');

HEAD部のHTMLを取得
  wbdoc.all.tags('Head').item(0).innerHtml
  タグ名はcaseignore

BodyにHTMLソースを書き込む
  wbdoc.body.innerHTML:='<font color="#ff0055">abcxyz</font>';

デザインモードにする・解除する
  wbdoc.designMode:='on';// 'off'    または Inherit の値あり

選択範囲のHTMLを取得・設定
  wbdoc.selection.createRange.htmlText
選択範囲のテキストを取得・設定
  wbdoc.selection.createRange.Text

表示倍率設定
  wbdoc.body.Style.Zoom:=0.5;  // 1.0=100%

Delphi TWebBrowser

2006-11-08 22:48:45 | プログラム
Delphi v7
TwebBrowser を今日はじめて使ってみた。
フォームにボタンとwebbrowserを貼り付けて
ボタンのOnClickで
procedure TForm1.Button1Click(Sender: TObject);
begin
  webbrowser1.Navigate('http://www.goo.ne.jp/');
end;


これでボタンを押すと簡単にIEと同じみたい。  と思ったら、システムのブラウザで表示しているということだからIEそのものじゃないか。

でもこれをプログラムで使うには一山ふた山大変そう。
まず。表示したHTMLソースをMemoに表示してみたい。

プロパティのDocument ありゃ これは 
property Document: IDispatch;

んーー これの使い方さっぱり と思ったら

http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_oleobject.htm

こんなの見つけました。
やはりこの方も参っている?

MSのサイトを見てもさっぱりどうしたらいいのやら。

とりあえず。
Memoとボタンをもうひとつ付けて
procedure TForm1.Button2Click(Sender: TObject);
begin
  memo1.Lines.Text:=WebBrowser1.OleObject.Document.documentElement.innerHTML;
end;


なんとかソースはとれた。UTF8のはずなんだけどMemoでは化けずにちゃんと日本語が表示されている。
ちなみに、GooブログはEUCなんだけれども、これもEUC変換しないでMemoに表示されている。
ある意味楽チン。。。

URLにローカルファイルを指定すればもちろん表示される。

しかし、
WebBrowser1.OleObject.Document.documentElement.innerHTML:=string;

なんてしたいけど、ダメでした。

もうちょっと探ってみよう。

Delphi + BregExp m//s うまくいかない

2006-11-04 23:56:59 | プログラム
GooのトップページをGETすると
ヘッダ部分は

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>goo</title>
<link rel="shortcut icon" href="gooicon.ico">
<meta name="content-language" content="ja">
<meta name="description" content="NTTレゾナントが運営する安心・安全のポータルサイトです。検索、辞書、地図、乗り換え、ニュース、ショッピングなど生活に便利な機能が充実。あなたの行動を支援するメディアとして様々なサービスを展開しています。">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<link rel="stylesheet" href="/css/top_4.css" media="all">
</head>


日本語はもちろんUTF-8ではいっている。
このなかの"UTF-8"というキーワードを見つけるためには
meta , Content-Type, charset と言う順に探さなければならない。
この場合はこのMetaタグが1行でまとまっているからいいのだが、
HTMLはどこに改行をいれてもよい。
改行が入ることを前提に考えなければならない。

Delphi + BregExp では、 m// のオプションでsをつけても うまく nが '.' にマッチしてくれない。
仕方がないので、文字列全体の \\n をスペースに置き換えて大きな1行にして
マッチさせようとしたら、m//の途中でエラーになってしまう。
多分UTFが入っているためだと思う。

もう一度頭を空っぽにして考え直す必要がある。

今日は仕事でExcel VBAなんか久しぶりにやってみたけど
VBAってデコレーションたっぷりなケーキを食う様で
おなかいっぱいな感じ。

今日はこれまでっ