∵ なぜならば

映画とかネットとかパソコンとかコミックとか音楽とか……

const の呪縛

2022-07-07 20:58:07 | Delphi
function OpenFile(const Path: TFileName):Boolean;
という関数がオリジナルの時から存在する(中身は結構肥大化させてしまった)
おいらは普段(邪魔くさいので)const はつけないんだけどまあついてるモノをわざわざ外したりはしない

FFileName は現在開いているファイル名が入っているグローバル変数(FFileName: TFileName;)
これもまたオリジナルソースからある

OpenFile(FFileName);で現在開いているファイルを開き直す

これだけなら問題は無いんだけれど
多重起動で同じファイルを開く + 上書き禁止にする などの諸条件が加わった時アプリケーションエラーとなる
ソースを追っていくと
CompareText 関数→の中で使われている UpperCase や LowerCase の基本関数で例外が出てて Delphi がヘニョヘニョ状態になってる
もうここだけで二週間くらい悩んでた

んでタイトルの通り const が問題だったようで
OpenFile 関数の中でグローバル変数 FFileName を空にしたり開くことが確定した時にファイル名を代入していたため
静かなアクセス違反が溜まっていく
const は「Path」にかかってるので
Path:= とか直接さわるときだけの制限だと思っていたが
Path として渡された中身が実は FFileName だと気づいてしまう時に不整合を起こしてしまうのか
まるで AI がアンビバレンツで機能停止してしまう話みたいだ

一旦他の変数に入れて呼び出すか
S:=FFileName;
OpenFile(S);

引数の const を外せば問題ない
function OpenFile(Path: TFileName):Boolean;

まあそんな感じの制限もあるのかなという結果ではある

それでも
OpenFile(FFileName);
この関数を単体で呼び出すだけではエラーが起きなかったのが最後までわからない
そっちでも不具合あったのならもっと早く解決してたのに