トップ回答者
Delphi6でのOpenDialogについて

質問
回答
-
すみません。Delphi のプログラムは組んだことがありませんが、OpenDialog が Win32API の OPENFILENAME構造体 と GetOpenFileName関数 を使っていると仮定して回答いたします。
Windows 7 以降の OS では、プログラムで初めて GetOpenFileName関数 によってファイルが指定されたときに、 GetOpenFileName関数 の引数として渡された初期ディレクトリ(lpstrInitialDir)がレジストリに記録されます。それ以降、同じ初期ディレクトリを引数として GetOpenFileName関数 が呼び出された場合、その初期ディレクトリの値を無視し、最後に開かれたファイルのディレクトリが初期ディレクトリとなります。
レジストリに登録さている初期ディレクトリとは別のパスを引数として指定することで、初期ディレクトリを設定できるようです。例えば、プログラムで
OpenDialog1.InitialDir = "c:¥work";
として、初めてファイルを指定した場合は、上記のパスがレジストリに登録されるので、次回には
OpenDialog1.InitialDir = "c:¥work¥.¥"; // ¥.¥ を追加した
というパスを指定することで、別のパスを指定したという判定になるようです。
開くパスはどちらも同じ c:¥work となります。レジストリに記録されている初期ディレクトリと別の値を指定して GetOpenFileName関数 を呼び出すと、レジストリから初期ディレクトリは消えるので、それ以降は、初期ディレクトリとして、"c:¥work"を指定しても"c:¥work¥.¥"を指定しても最後に開かれたファイルのディレクトリが初期ディレクトリとなることはないようです。(複数の初期ディレクトリを持つプログラムについては、パスの保持をしないみたい?)
※ GetOpenFileName関数 について書いていますが、GetSaveFileName関数 についても同様です。
※ Windows 7 と Windows 10 で動作を確認しましたが、今後の OS の仕様変更で動作しなくなる可能性があります。参考サイト:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=67556&KLOG=115
https://msdn.microsoft.com/ja-jp/library/ms646839.aspx- 編集済み kenjinoteMVP 2017年6月29日 11:50
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月7日 0:11
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月11日 6:49
すべての返信
-
すみません。Delphi のプログラムは組んだことがありませんが、OpenDialog が Win32API の OPENFILENAME構造体 と GetOpenFileName関数 を使っていると仮定して回答いたします。
Windows 7 以降の OS では、プログラムで初めて GetOpenFileName関数 によってファイルが指定されたときに、 GetOpenFileName関数 の引数として渡された初期ディレクトリ(lpstrInitialDir)がレジストリに記録されます。それ以降、同じ初期ディレクトリを引数として GetOpenFileName関数 が呼び出された場合、その初期ディレクトリの値を無視し、最後に開かれたファイルのディレクトリが初期ディレクトリとなります。
レジストリに登録さている初期ディレクトリとは別のパスを引数として指定することで、初期ディレクトリを設定できるようです。例えば、プログラムで
OpenDialog1.InitialDir = "c:¥work";
として、初めてファイルを指定した場合は、上記のパスがレジストリに登録されるので、次回には
OpenDialog1.InitialDir = "c:¥work¥.¥"; // ¥.¥ を追加した
というパスを指定することで、別のパスを指定したという判定になるようです。
開くパスはどちらも同じ c:¥work となります。レジストリに記録されている初期ディレクトリと別の値を指定して GetOpenFileName関数 を呼び出すと、レジストリから初期ディレクトリは消えるので、それ以降は、初期ディレクトリとして、"c:¥work"を指定しても"c:¥work¥.¥"を指定しても最後に開かれたファイルのディレクトリが初期ディレクトリとなることはないようです。(複数の初期ディレクトリを持つプログラムについては、パスの保持をしないみたい?)
※ GetOpenFileName関数 について書いていますが、GetSaveFileName関数 についても同様です。
※ Windows 7 と Windows 10 で動作を確認しましたが、今後の OS の仕様変更で動作しなくなる可能性があります。参考サイト:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=67556&KLOG=115
https://msdn.microsoft.com/ja-jp/library/ms646839.aspx- 編集済み kenjinoteMVP 2017年6月29日 11:50
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年7月7日 0:11
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年7月11日 6:49