いつもお世話になっております。表記の件について質問させてください。
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 := ''
とする、というものであって、今回はそれを含めてもだめな感じでした。
今のところ、有力な手段らしきものが全く思いついておりません。
Opendialog1.InitialDir := 'D:\Delphi\Projects\ME10a\';
では?
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" が初期フォルダになります。
ご回答どうもありがとうございます。
先ほど、DEKO様にご提示いただいたコードを試してみたのですが、うまく
行きそうです。
ただ、ちょっと気になったのが、今までと同じコードであるにも拘わらず、
同じソフトを何度も機動していると、やがてXPと同様、意図した通りの
初期フォルダで開くようになることがありました。
(1度意図したとおりの動きを見せると、その後はずっと意図した通りの
動きがずっと続きます。)
何か法則性があるのかはわかりませんが、もうしばらく様子を見た方が
よさそうです。解決マークはもうしばらく待たせてください。
古い Delphi かつ Vista 以降だと、初期フォルダ (最後に開いたフォルダ) は
レジストリに保存され、これが TOpenDialog.InitialDir よりも優先されてしまいます。
TOpenDialog.FileName がフルパスファイル名で指定されていると (FileName が残っていると)、
TOpenDialog.InitialDir や、レジストリの所期フォルダ (最後に開いたフォルダ) は無視されます。
ですが、TOpenDialog.FileName にはパスのみを指定できません。
# 最近の Delphi とは挙動も対処方法も異なるのが厄介ですね。
古い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.
更なる情報をいただき、本当にありがとうございます。
詳細な動きがわかって、すっきりしました。すっかり忘れていましたが、
一度パスでレジストリを検索しておけばもっと早く解決できていたかも
しれません。
詳細情報を記したURLまでご提示いただき、ありがとうございます。
通りすがり様
サンプルまでお書きいただき、ありがとうございます。ただ、今回のソフト
は自分用ではなく、他人様に使っていただくためのものですので、
他の履歴等については消さないほうがよいという判断にさせていただきました。
ですが、個人的には貴重な情報だと感じておりますので、折を見て、
大事に利用させていただきます。ご親切に、どうもありがとうございました。
ツイート | ![]() |