真魚2.183

掲示板にあった件。
置換ダイアログで、文字色を黒で決め撃ちしていた件は、今となってはいつからなものか。
少しずつ手直ししていってはいるけれども、最初の最初の使い始めたのはTEditor時代だし。
しかもどうして二つある入力欄の片方だけ違ってるのか。
たまたま黒い背景で使ってる人が見つけてくれなきゃ、今後も見つからない物。
ま、そっちは気がついたらすぐに直せるので良いのだが。



深刻なのは、一定以上古いファイルが開けない件。
そんな意味不明な処理をした覚えはないので、自分で書いていないソースを追いかけてみたら、
Delphi自体があまり好ましくないコードを書いていた。
試しに、ウチのPCに入ってる古いDelphi製ソフトで試したら、やはりいくつかのソフトでは開けない。
どんな処理をしているとファイルが開けないのかというと、
「ファイルを開く前にファイルが存在するか確認する、古いDelphi製ソフト」が、バグで全滅。
ちなみに、新しいDelphiでは既にこの問題は解決されている。

もっと詳しく追いかけよう。
DelphiにはFileExists()という、ファイルが存在するかどうかを調べる便利な関数がある。
この関数はユニコードに対応していないので、真魚は独自関数を使っているのだが、
その独自関数は、Delphiのソースコードをコピペして、ユニコード用に修正した物だ。
たとえユニコード版に置き換えてもバグまでコピペしている事になる。
そのFileExists()という関数はかつて、FileAge()関数が成功するかどうかを返すものだった。
FileAge()関数は、ファイルのタイムスタンプを取得するだけの関数である。
別に、タイムスタンプが取得できるかどうかを基準にしているのではない。
FileAge()関数は、タイムスタンプ取得前にファイルの有無を確認しているから、
本当はそのファイルの有無確認の所だけ必要なのに、関数を使い回している。
で、使い回したその関数は、1980年1月1日以降のファイルじゃないとエラーになる。

古いバージョンのDelphiで、FileExists()関数を使っているアプリは全てこのバグの影響を受ける。
真魚は、ユニコード化したのが結構前なので、本家がバグ修正したのに追いついてなかった。

よその人が書いたソースに手を入れて使うと、よその人がバグを修正したとき、
どこを修正したかチェックして自分も修正しないといけない。
Delphiがいつまでも95/98/Meを引きずってるせいで、そんな事も自前でやらなきゃいけない。

たぶん関連のある記事:

コメントは終了しています。