2009年8月17日月曜日

[.NET] Windowsフォームでのダイアログの作成と終了処理について

Windowsフォームでダイアログを作成するには、普通にFormを作成してFormBorderStyleやMaximizeBoxやMinimizeBoxのプロパティを変更して、ダイアログの概観を持つフォームを作成します。またモーダルダイアログとして表示するには、ShowDialog();を呼び出します。

OKやキャンセルなどのいわゆるダイアログボタンは、普通にボタンを配置してDialogResultプロパティを設定し、それに合うような文字列をTextプロパティに設定します。DialogResultが設定されたボタンを押すと自動的にFormを閉じようとするので、Clickイベントハンドラでは、Close()を呼び出す記述してはいけません。

DialogResultが設定されたボタンとウィンドウクローズボタン(右上の×ボタン)を含めて、これらのボタンを押されたときに終了させないようにするには、FormClosingイベントハンドラを登録して、FormClosingEventArgsのCloseにfalseを設定します。この処理は、ShowDialog();で表示するFormに限らず、一般的なFormについても同様です。

プログラムからShowDialog();で表示したFormを閉じるには、Visibleプロパティをfalseにします。そうすると、ダイアログが非表示になり、ShowDialog();が復帰します。このときの戻り値は、FormのDialogResultプロパティに設定されているものになります。そのため、Visibleを設定するときにDialogResultを設定しておいたほうがよいでしょう。

2009年7月9日木曜日

[VC++] ミニメモ

自分で作ったnamespaceやclassの「名前空間が見つかりません」のエラーが出たときは、一番最後のエラーメッセージを見よ。

どこかでnamespaceを閉じ忘れているかも…。

2009年7月6日月曜日

[VC++2008] VC++ 2008 Expressでアセンブリに署名をする

VC++ 2008 Expressでアセンブリを遅延署名をしてから、署名する方法です。署名をするためのキーについては、ドキュメントの「公開キーと秘密キーのキー ペアを作成する 」や「厳密名ツール (Sn.exe) 」についてを参照してください。

遅延署名をする

assemblyInfo.cppに遅延署名をするアトリビュートを追加します。ここでは、「AssemblyKeyFileAttribute」の指定はしません。

[assembly:AssemblyDelaySignAttribute(true)];

リンカオプションでパブリックキーを設定する

要するに「/KEYFILE:」のオプションを設定するのですが、プロジェクトのプロパティで「リンカ」の中の「詳細」の一覧の中に「キーファイル」という項目があるので、そこに公開キーファイルを指定します。ファイルのありかによっては、マクロを使ってパスを設定する必要があるかもしれません。

ちゃんと署名をする

遅延署名のままだとデバッグすらできません。デバッグなら一時的に署名のチェックを外すこともできますが、リンクが終わった後に署名します。
カスタムビルドステップで、コマンド(sn.exe)を使って署名をします。基本的には以下のようにコマンドビルドステップのコマンドラインを設定すればよいでしょう。

"$(WindowsSdkDir)bin\sn" -R "$(TargetPath)" <キーペアファイル>

なお、キーペアファイルの指定でフルパスになるようでしたら、二重引用符「"」でくくる必要があります。

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」で変更することができる。