TOpenDialogのInitialDir
「ユーザーが設定したフォルダーリストからファイルを開く」という機能を実装していましたが、XPユーザーから一度ファイルを選択してしまうと、次回からはそのフォルダーしか開かないと報告がありました。
シンプルなテストプログラムを作成して確認したところ、Windows 7 と Windows XP では挙動が違っていました。
Windows 7 の場合
Button1 を押して、 c:\aaa\test.txt を選択します。 次に Button2 を押します。期待通り、c:\bbbフォルダが表示されています。ファイル名には前回選択したものがフルパスで表記されています。
Windows XPの場合
同じくButton1 を押して、 c:\aaa\test.txt を選択します。 次に Button2 を押します。OpenDialog1.InitialDirの設定にかかわらず、先ほどオープンした c:\aaa\が開かれています。
で、対策はこちらです。次のようにファイル名をクリアすることにより、期待通りに動作するようになりました。 わかってしまえば、どうしてファイル名をクリアしていなかったんだと思うのですけど(^-^)
procedure TForm1.FormCreate(Sender: TObject); procedure MakeSampleDir; const ADir = 'c:\aaa'; BDir = 'c:\bbb'; var SL: TStringList; begin ForceDirectories(ADir); ForceDirectories(BDir); // ファイルの作成 SL := TStringList.Create; try SL.SaveToFile(ADir + '\' + 'test.txt'); SL.SaveToFile(BDir + '\' + 'test.txt'); finally FreeAndNil(SL); end; Edit1.Text := ADir; Edit2.Text := BDir; end; begin MakeSampleDir; end; procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.InitialDir := Edit1.Text; OpenDialog1.Execute; end; procedure TForm1.Button2Click(Sender: TObject); begin OpenDialog1.InitialDir := Edit2.Text; OpenDialog1.Execute; end;
1.Button1 を押して c:\aaa\test.txt を選択します。 2.c:\bbb.test.txt を開くために Button2 を押します。 問題点: Button2を押しても XP では c:\aaa が表示されます。
Windows 7 の場合
Button1 を押して、 c:\aaa\test.txt を選択します。 次に Button2 を押します。期待通り、c:\bbbフォルダが表示されています。ファイル名には前回選択したものがフルパスで表記されています。
Windows XPの場合
同じくButton1 を押して、 c:\aaa\test.txt を選択します。 次に Button2 を押します。OpenDialog1.InitialDirの設定にかかわらず、先ほどオープンした c:\aaa\が開かれています。
で、対策はこちらです。次のようにファイル名をクリアすることにより、期待通りに動作するようになりました。 わかってしまえば、どうしてファイル名をクリアしていなかったんだと思うのですけど(^-^)
procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.FileName := ''; // ファイル名もクリアする OpenDialog1.InitialDir := Edit1.Text; OpenDialog1.Execute; end; procedure TForm1.Button2Click(Sender: TObject); begin OpenDialog1.FileName := ''; // ファイル名もクリアする OpenDialog1.InitialDir := Edit2.Text; OpenDialog1.Execute; end;
| 固定リンク