2009年6月28日日曜日

[VC++2008] VC++ 2008 ExpressではApplicationSettingsは使えないらしい

VC++ 2008 ExpressnのIDEのフォームデザイナを使ってフォームを作成するとき、コンポーネントのプロパティにあるデータというカテゴリに「(ApplicationSettings)」という項目がある。ApplicationSettingsの詳細についてはドキュメントに譲るが、これを使うとフォームの位置などの情報を簡単に保存して、起動したときに前回の状態と同じように表示させることができる仕組みである。

まず、おもむろにこの「(ApplicationSettings)」にある「(Property Binding)」という項目をクリックすると、設定画面が表示できるボタンが現れる。このボタンを押すと、アプリケーション設定というダイアログが表示されるのだが、この中にはバインド可能なプロパティの一覧が表示されている。
そのプロパティのコンボボックスをドロップダウンさせると、アプリケーション設定を定義することができる。ここで「新規を」クリックするとアプリケーション設定が作成できるのだが、項目を埋めて「OK」ボタンを押すと「設定ファイルがプロジェクトに見つかりません。設定ファイルを追加して、再試行してください。」と表示されて追加することが出来ない。

ここで見つからないといわれているファイルは、「app.settings」である。このファイルもxmlで記述されていて、マイクロソフトでスキーマが定義されている。このファイルの空の状態は、おそらく以下の通り。

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="" GeneratedClassName="app">
</SettingsFile>

このapp.settingsファイルをプロジェクトに追加すれば、(Property Binding)にアプリケーション設定を定義することができる。また、このapp.settingsファイルを開くとアプリケーション設定用のビューが開き、そこで項目の追加や変更もできる。

ただし、この状態でビルドをすると「stdafx.h」に「app.h」がありませんというコンパイルエラーが発生する。どうやら、app.settingsから値をやりとりするためのクラスをapp.hに定義してあるものとしてビルドしているように思える。
実際にはアプリケーション設定を定義したフォームのコードをみると「::app::Default」という参照をしている。結局のところ、このクラスを定義しないとアプリケーション設定は利用できないということになる。

ここからは、試してないのでなんともいえないが、このapp.hを手で作成してみようとするのであれば、ドキュメントにある「アプリケーション設定アーキテクチャ 」というページをヒントにすれば、うまくいくと思われる。
おそらく、appというクラスを「ApplicationSettingsBase」から派生させて、その中には先ほどのアプリケーション設定のビューで定義した名前と型をプロパティを作成する。スコープがユーザーなら「UserScopedSetting()」アトリビュートで、アプリケーションなら「ApplicationScopedSetting()」アトリビュートとなる。デフォルト値は、「DefaultSettingValue()」のアトリビュートで設定すればよいだろう。
プロパティのget()とset()は、ApplicationSettingsBaseのインデクサの参照、代入となる。

あとは、フォームを閉じるときにファイルに保存する(ApplicationSettingsBase::Save()を呼ぶ)ようにすれば、状態が保存されるはず。
app.hの作成のところは、試してないので動作保障はいたしません。もし、試してうまくいったという人がいらしたら、お知らせしていただければうれしいですw。

2009年4月2日木曜日

【Windows】Eclipse3.4.2(Ganymede)+PDTでZendDebuggerを使う

WindowsでApache2.0でPHP5.2が動作して、Eclipse GanymedeにPDTが組み込まれているという環境で、ZendDebbuggerを組み込む方法についてです。Webサーバーとデバッグするマシンは同じである必要はありません。

ApacheにZendDebuggerを組み込む

ZendDebuggerの入手
http://downloads.zend.com/pdt/server-debugger/にいく。ZendDebugger-5.2.xx-cygwin_nt-i386.zipをダウンロードする(基本的には最新版でよいはず)。
インストール
Zipを展開すると?_?_x_compのようなフォルダがあるが、最初の2つの数がPHPのバージョンを意味しているので5_2_x_compか5_2_x_nts_compのいずれかのフォルダにあるDLLをどこかにコピーする(展開されたフォルダーごとどこかにおいてもよい)。
5_2_x_compと5_2_x_nts_compの違いは、スレッドセーフか非スレッドセーフであり、どちらを組み込むかは、PHPのビルドによって異なる。phpinfo();で出力された中に「Thread Safety」という項目が「enable」で「Debug Build」が「no」であれば、スレッドセーフであり、いずれかがそうでなければ非スレッドセーフということになる。PHPをバイナリでインストールした場合には、スレッドセーフになっているはず。
php.iniの設定
以下の設定をphp.iniに追加する。
zend_extension_ts=<コピーしたDLLのパス>ZendDebugger.dll
zend_debugger.allow_hosts=<アクセスを許可するIPアドレス>
zend_debugger.expose_remotely=always
もし非スレッドセーフなDLLを組み込むときは、「zend_extension_ts」は「zend_extension」となる。
IPアドレスの設定は、複数ある場合カンマ「,」で区切る。
dummy.phpのコピー
展開されたフォルダにあるdummy.phpをApacheのドキュメントルートにコピーする。このファイルは、PDTのデバッグの設定で「TestDebugger」で接続テストをするときにアクセスする。本質的には必須ではない。

設定完了後にApacheを開始または再起動し、エラーログをチェックする。

Eclipseの設定

Webサーバーの設定
Eclipseの設定ダイアログ(Preferencesで表示される)の「PHP」の「PHP Servers」の項目を表示して、デバッグのターゲットとなるWebサーバーを指定する。
または、「PHP」か「PHP Debug」のパースペクティブを表示にあるデバッグのダイアログ(Debug Configurationで表示される)を表示して、「PHP Server」をいう項目を変更または追加する(デフォルトはlocalhostになっている)。
接続の確認
上記のデバッグのダイアログで「Test Debugger」というボタンを押すと接続確認ができる。ただし、dummy.phpをドキュメントルートにコピーしておかないとテストはできない。
デバッグファイルの設定
デバッグのダイアログで、対象となるファイルを指定する。ここでは、ローカルなファイルを指定するので、普通はプロジェクトのフォルダからの相対パスとなる。
ドキュメントルートからのパスの関係がプロジェクトのパスと一致していれば、URLの設定は「Auto Generate」でデバッグできることになる。すなわちこれは、Apacheのドキュメントルート上にPHPのプロジェクトを作成したという状態を意味している。
デバッグの確認
あとは、デバッグのダイアログで「Debug」ボタン(Runの設定の場合「Run」ボタン)を押すとApache上で実行される。
このとき、表示をEclipse上ではなく別のブラウザ上に表示することができる。設定するには、PHPのパースペクティブで、「Window」のメニューで「Web Browser」で変更するか、設定ダイアログの「General」の「Web Browser」で変更することができる。