OZの部屋

なんでも日記です

TInterfacedObject freeしちゃだめ?

2006-11-15 18:15:46 | プログラム
先の 「TWebBrowser イベントを拾う方法 」のなかで

htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch) ;
としてマウスオーバーのイベントハンドラを作っているけれども、
CreateしたものをFreeしていない。
おかしい、とおもって、Freeしてやったら、エラー
おやおや。


http://www.kcat.zaq.ne.jp/takao/diary/diary.200203.html#3
2002/3/3 の記事

なるほどそういうわけなんですね。

賢い人いるんですね。
Delphi は難しい。



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ってデコレーションたっぷりなケーキを食う様で
おなかいっぱいな感じ。

今日はこれまでっ

このブログの編集ツール 改

2006-11-03 15:28:32 | プログラム
先日 このブログを編集していたら
  HTMLタグを記述しようとしたら< >を入力したとき、うまくいかなかったので、ツールを作ってみました。
ところが、けさ、編集していたら、先頭スペースが無視されることが分かりました。
それで、今度のは、
先頭スペースがあったら、 に書き換えるようしました。
また、タブも2このスペースに変換するようにしました。
(先頭からの場合のみ)
それで
  <html>
    <head>
    xxxxx
    </head>
    <body>
      <a href="xxxx">aaaa</a>
    </body>
  </html>

なんてのも楽にできるようになりました。

Gooブログ編集ツール OhMyGoo.zip

↑をダウンロード 217Kb 

今度はDelphi Indy を使ってみる

2006-11-03 07:46:28 | プログラム
delphi でHTTPを使うには
Indyが楽、以前会社のシステムで少し使ったことがある。
使っているDelphiは ちと古くなったけれど Delpi7

そこで、小手調べ。

新規アプリケーションを作成して
フォームにMemoをひとつ、Indy Clientsの中にあるIdHTTPをひとつ、
それと、Buttonをひとつ
以上3個のコンポをフォームに置く。
なまえはデフォルトで使う。

ボタンをダブルクリックして、ちょっとコードをかく
procedure TForm1.Button1Click(Sender: TObject);
const
  url='http://www.google.co.jp/';
begin
  Memo1.Lines.Text:=IdHttp1.Get(url);
end;

これでRun ちゃんとGetできているみたい。
ちょー簡単だ。
ちなみに、MemoのScrollBarsはssBothにしておいたほうがよさそう。

さて、こんどはURLをGooのトップページにしてみる

const
  url='http://www.google.co.jp/';

これだけ変えて、Runすると、
一応とってきてはいるが、日本語が化けている。
GooはUTF-8のコーデックだ。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


それでは、

procedure TForm1.Button1Click(Sender: TObject);
const
  url='http://www.goo.ne.jp';
begin
  Memo1.Lines.Text:=UTF8Decode(IdHttp1.Get(url));
end;


でOK でもさきほどのURLでUTF8Decode()してしまうと
まったく表示されなくなってしまう。
HTMLヘッダ内のMetaタグでhttp-equiv属性にcharsetを設定しているところを調べてけっていしなければならない。
正規表現だ。
が、delphiには正規表現はない。

でも世の中には必要に応じて用意してくれる人がいるんですね。

BRegExp この話は次回につづく。

それと、いまこの文章書いてて気がついたんですが、
先頭スペースは無視されるんですね。convmetaを直さなくちゃ。