MS-Access の話。
Windows のアプリケーションを使っていると必ず出てくる、ファイルを開く/名前を付けて保存のダイアログ。 あれは、Access97 で直接扱えるオブジェクトになってないので、Win32 API を使う。 「ファイルを開く」 には GetOpenFileName を、 「名前を付けて保存」 には GetSaveFileName を使う。 引数は、両方とも同じ OPENFILENAME 型の構造体を指定する。 この API は、Windows98/NT ともにサポートしているはずだ。 が、Windows98 ではちゃんと動くのに、WindowsNT では動かない。 何でだろう? と、ソースコードを眺めていた。
.lpstrFile = String$(256, 0)
.nMaxFile = 256
.lpstrFileTitle = String$(256, 0)
.nMaxFileTitle = 256
引数構造体のこの部分が、256じゃなくて512になっていた。 これを256にしたら、NT でもちゃんと動くようになった。 つまり、Windows98 よりも WindowsNT の方が、チェックが厳しいのだな。 これに限らず、どの API に対してもそうなんだろう。 ま、ちゃんと使えと言われればそれまでなのだが、同じものなら、そのチェックや動作も同じにして欲しいものだ。
標準でついてくる ActiveX Control にカレンダーもあって、これを使う。 フォームの日付入力欄をダブルクリックするとカレンダーが出てきて、カレンダーの日付をダブルクリックすると、日付入力欄にその日付が設定され、カレンダーは閉じる。 はずなのだが、カレンダーを閉じるときに、エラーが発生する。 「オブジェクトが無いか、Withブロックが無い」 とのこと。 そんな訳は無いだろう。 と、デバッガでステップ実行すると、エラーにならずにちゃんと動く。 なんともお粗末な、そして恐ろしい、VisualBasic の問題点、 処理速度が速すぎるとパラメータの設定などで失敗することがある に引っ掛かっているらしい。
こーゆーとき、普通は DoEvent を使うのだろうが、それはまた別の問題が出そう。 ということで、単に遅延するだけにする。 Win32 API の Sleep を使って 100ms 待たせたら、ちゃんと動くようになった。
なんか疲れた。