TOpendialogのInitialDirを設定しても無視されるのを防ぐには?


ax  2012-11-30 06:29:55  No: 43435

いつもお世話になっております。表記の件について質問させてください。

1  環境
  Delphi6 Personal + Windows 7 Pro 64bit

2  記述したコード
procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.FileName := '';
  Opendialog1.InitialDir := 'D:\Delphi\Projects\ME10a';
  OpenDialog1.Execute;
end;

※OpenDialog1は、TOpenDialog。
  複数のファイルを選択できるよう、ofAllowMultiSelectをTrueに設定
  している。

3  上記コードの問題点
  Windows XPの端末であれば、OpenDialog1の初期フォルダは、常に
  ME10aとなるが、Windows 7の端末では期待通りの結果とならない。
  →このアプリで最後に開いたフォルダが初期フォルダとなる。

4  やりたいこと
  OpenDialog1の初期フォルダを指定して開きたい。
  どうすればInitialDirを指定して開けるようになるか?

5  今まで自分で調べた状況
  ほかの方にも同じ悩みを持っている方はいたようで、解決方法らしき
  ものをご提示いただいている方はいました。
  しかし、それらの方々の解決方法は、Opendialog1.Filename := ''
  とする、というものであって、今回はそれを含めてもだめな感じでした。
  今のところ、有力な手段らしきものが全く思いついておりません。


Nov  2012-11-30 09:10:37  No: 43436

Opendialog1.InitialDir := 'D:\Delphi\Projects\ME10a\';
では?


DEKO  2012-11-30 11:30:54  No: 43437

OS が Vista 以降で発生する現象のようです。
(Delphi 7 で確認)

Delphi 2007 でも試しましたが、流石に Vista 対応なので、
この問題は発生しないようです。

# 2005 / 2006 は試していません。

var
  Dir: string;
begin
  Dir := 'D:\Delphi\Projects\ME10a';
  Dir := IncludeTrailingPathDelimiter(Dir);
  OpenDialog1.FileName := Dir + '*.*';
  OpenDialog1.InitialDir := Dir;
  if OpenDialog1.Execute then
    ;
end;

お望みの挙動とは違うかもしれませんが、
上記コードだと "D:\Delphi\Projects\ME10a" が初期フォルダになります。


ax  2012-12-03 04:54:17  No: 43438

ご回答どうもありがとうございます。
先ほど、DEKO様にご提示いただいたコードを試してみたのですが、うまく
行きそうです。

ただ、ちょっと気になったのが、今までと同じコードであるにも拘わらず、
同じソフトを何度も機動していると、やがてXPと同様、意図した通りの
初期フォルダで開くようになることがありました。
(1度意図したとおりの動きを見せると、その後はずっと意図した通りの
動きがずっと続きます。)

何か法則性があるのかはわかりませんが、もうしばらく様子を見た方が
よさそうです。解決マークはもうしばらく待たせてください。


DEKO  2012-12-03 12:41:51  No: 43439

古い Delphi かつ Vista 以降だと、初期フォルダ (最後に開いたフォルダ) は
レジストリに保存され、これが TOpenDialog.InitialDir よりも優先されてしまいます。

http://www.winhelponline.com/articles/195/1/How-to-clear-the-file-names-MRU-in-Common-Dialog-boxes-in-Windows-Vista.html

TOpenDialog.FileName がフルパスファイル名で指定されていると (FileName が残っていると)、
TOpenDialog.InitialDir や、レジストリの所期フォルダ (最後に開いたフォルダ) は無視されます。
ですが、TOpenDialog.FileName にはパスのみを指定できません。

# 最近の Delphi とは挙動も対処方法も異なるのが厄介ですね。


通りすがり  2012-12-03 18:45:01  No: 43440

古いDelphi使いなもので、イカで消しまくって誤魔化してますw
ほかの履歴も消しますが、大きなお世話な機能としか思えないので、問題なし。

program HogeHoge;

uses
  Windows,
  SysUtils,
  Registry;

{$R *.RES}

const
  ROOT_PATH  = 'Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32';
var
  reg  :TRegistry;
begin
    reg := TRegistry.Create(KEY_WRITE);
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKey(ROOT_PATH, False) then begin
      if reg.KeyExists('LastVisitedPidlMRU') then Reg.DeleteKey('LastVisitedPidlMRU');
      if reg.KeyExists('LastVisitedPidlMRULegacy') then Reg.DeleteKey('LastVisitedPidlMRULegacy');
      if reg.KeyExists('OpenSavePidlMRU') then Reg.DeleteKey('OpenSavePidlMRU');
      reg.CloseKey;
    end;
    reg.Free;
end.


ax  2012-12-05 08:11:17  No: 43441

更なる情報をいただき、本当にありがとうございます。
詳細な動きがわかって、すっきりしました。すっかり忘れていましたが、
一度パスでレジストリを検索しておけばもっと早く解決できていたかも
しれません。
詳細情報を記したURLまでご提示いただき、ありがとうございます。

通りすがり様
サンプルまでお書きいただき、ありがとうございます。ただ、今回のソフト
は自分用ではなく、他人様に使っていただくためのものですので、
他の履歴等については消さないほうがよいという判断にさせていただきました。
ですが、個人的には貴重な情報だと感じておりますので、折を見て、
大事に利用させていただきます。ご親切に、どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加