2013年5月24日金曜日

ぷろぐらみんぐTips

最近VB.NETでGUIなプログラムを作成している。
作っている最中に躓いた点で、ググっても有益な情報になかなかめぐり合えなかったことを書き出しておく。(ただしググった範囲は日本語w)

【ドロップダウンリスト(ComboBoxコントロール) のフォーカス位置】
ドロップダウンリスト(以下DDL)のリスト部分にマウスカーソルをあてたりカーソルキー押下でフォーカスを移動した際にTooltipを該当位置に表示させるため、該当項目がフォーカスされているか否かを判定する。(勿論他にも使い方はあるけど)
あくまでフォーカス有無の判定であって、選択されているかの判定ではない。
・該当DDLをオーナードローにする。
・DrawItemイベントハンドラ 内で、リスト項目を描画しつつ e.State And DrawItemState.Focus <> 0
を判定する。
・Trueならこのイベントはフォーカス位置の項目のイベントなので、適当な位置にTooltipを表示させる。

 e.Stateの項目に気付かなかったのでかなり探した。項目に気づいてからはすぐに検索ヒットしたのが悔しいw


【ファイル名の付与制限】
最近はあまり使われないので若い人は知らないかもしれないが、DOS~Windowsではデバイスファイル名というものがあり、コレに一致する文字列は通常のファイル名として使用できない。
unix系の /dev みたいに特定のフォルダにまとめて置けばなんら問題はなかったんだけど、 歴史あるDOSの伝統(わらい)によってどのフォルダをカレントにしようともこの文字列のファイル名はデバイスファイル名であるという認識になっちゃう。
どういう文字列がデバイスファイル名なのかはWikipediaの説明に譲るが、デバイスファイル名に「一致」するというのが曲者で、完全一致でなくても影響を受ける場合がある。さらにエクスプローラとコマンドプロンプトで「一致」の認識に違いがあることに気付いた。
デバイスファイル名である文字列「CON」(コンソールのデバイスファイル名)でファイルを作成する場合の例を挙げる。

#ファイル名エクスプローラコマンドプロンプトプログラム
1CONエラー1コンソール出力エラー
2CON.txtエラー1コンソール出力エラー
3CON.a.txtエラー1コンソール出力エラー
4▵▵CONエラー1ファイル作成正常
5▵▵CON.txtエラー1ファイル作成正常
6CON▵▵エラー1コンソール出力エラー
7CON▵▵.txtエラー1コンソール出力エラー
8CON▵a▵.txt正常ファイル作成正常
9CON▵▵.a.txtエラー2コンソール出力エラー
10▵▵CON▵▵エラー1ファイル作成
(ファイル名は▵▵conになる)
正常
(ファイル名は▵▵conになる)
11▵▵CON▵.a.txtエラー2ファイル作成正常
・ 「▵」は半角スペース。スペースの有無が問題なので連続の個数は関係ない。
・エクスプローラのエラーについて
  エラー1:指定されたデバイス名は無効です
  エラー2:ファイルまたはフォルダーは存在しません
・コマンドプロンプトの項目は懐かしの「copy CON "ファイル名"」で実施。
・プログラムの項目は .NET Frameworkの System.IO.File.Create() で試行。
・プログラムのエラー(例外だけど)は System.ArgumentException 。

網羅的ではないけどだいたいこんな感じ。コマンドプロンプトとプログラムは意味合いとしては一致しているようで、エクスプローラだけは#4、#5、#10、#11で異なる結果となった。
拡張子区切り文字まで(無ければファイル名全体)の文字列を抜き出した後のTrimチェックがおかしいようだ。ファイルシステムが許容するファイル名を扱えないファイラーって…。
他にも「COM0」や「LPT0」もエクスプローラはデバイスファイル名として扱うけど、コマンドプロンプトやプログラムは通常ファイルとして扱う。
もしどうしてもデバイスファイル名の通常ファイルを作りたい場合はコマンドプロンプトからファイル名をUNC書式で指定すると作れるらしい。プログラムからも、UNC書式を許容できるファイル操作メソッドで作れるのかな?(メンドかったので試していない)
デフォルトのデバイスファイル名についてMicrosoftとしてはここに説明があるみたいだけど、実際に試してみると少なくともWindows7ではCOM/LPTの5~9もデバイスファイルとなっているようで、どうも説明自体が信用できない。

いつのバージョンからこうなっているのか分からないが、エクスプローラはやっぱり残念な子。

0 件のコメント :

コメントを投稿