« アプリケーション固有のデータ格納先 | トップページ | リテラル定数の記述 »

2010年9月18日 (土)

OpenFileDialog/SaveFileDialogとWin32API

ファイルを開く/名前を付けて保存のダイアログは、それぞれ OpenFileDialog,SaveFileDialog を使用する事は周知の事である。しかし、微妙にWin32APIベースで表示したコモンダイアログと違う事は御存じだろうか。

この事は、既にこのブログで詳しく述べられている。

このブログ内容の補足としてダイアログから実際に表示されるエラーメッセージボックスの違いをまとめてみた。

プロパティWin32API.Netコントロール
ValidateName 同左
CheckPathExists 同左
CheckFileExists
CreatePrompt(*)
OverwritePrompt

(*)CreatePrompt Win32APIは、「ファイルを開く」側のダイアログでしか表示しない。.NETはSaveFileDialogでしか設定出来ないので、こちらで表示している。

ValidateName,CheckPathExists を除き、メッセージ内容が違っているのが判ります。

CheckFileExists これは言っている意味は一緒ですが、実際に示しているのがファイル名かパス名かの違いがあり、判りやすさから言ったら、.NETの勝ちですね。
先程紹介したブログで述べられてる通りAPIでは無効となる SaveFileDialog でも使えるようですが、それがメリットになるのかは疑問。
CreatePrompt はっきり言ってこれは、APIの勝ち。.NETではOpenFileDialogで指定できず、SaveFileDialogで指定可能なのは意味不明です。推測ですが、仕様を書いた人が誤ってOpenFileDialogでなく、SaveFileDialogに実装するようにしてしまい、それが後のチェックでもミスに気が付かなかったのではないでしょうか。そしてプログラマは、その誤った仕様通りに実装したのではないでしょうか。
OverwritePrompt これはよく見ないとメッセージの違いに気がつかない。意味は一緒なので、どちらでもいいでしょう。しかし、デフォルトボタン(フォーカスのあるボタン)が、「はい」か「いいえ」の違いがあるのが大きいといれば大きい違いではないでしょうか。
デフォルトボタンは、間違えて指示した時に代償の小さな方にすべきでしょう。その意味では、APIの勝ち。

OpenFileDialog/SaveFileDialogも、中身はWin32APIベースで実現していると思うのですが、まったく何故こんな違いが出るのでしょうね。わざわざメッセージ内容を変える必要性があるのか疑問です。

« アプリケーション固有のデータ格納先 | トップページ | リテラル定数の記述 »

.NET情報」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: OpenFileDialog/SaveFileDialogとWin32API:

« アプリケーション固有のデータ格納先 | トップページ | リテラル定数の記述 »