none
Delphi6でのOpenDialogについて RRS feed

  • 質問

  • Delphi6(Win7環境)でOpenDialogを使用していますが

    前回のフォルダが開いてしまいます。

    同様の質問で、回答として

    InitialDirよりもFileNameの方が優先されてしまうのが原因みたいですね。

    FileNameを空にすればOKです。

    OpenDialog1.InitialDir = 'c:¥work";
    OpenDialog1.FileName := "";

    のようにすれば解決できたと書いてありましたが、

    私の環境では上手くいきません。

    解決方法をご教示いただければ幸いです。

    2017年6月29日 5: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

    2017年6月29日 11:12

すべての返信

  • すみません。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

    2017年6月29日 11:12
  • ご回答ありがとうございます。

    参考にさせていただきます。

    2017年7月4日 9:44