« MacBook Air を買いました。 | トップページ | ☆2つのListViewを同期させる(その2) »

TOpenDialogのInitialDir

「ユーザーが設定したフォルダーリストからファイルを開く」という機能を実装していましたが、XPユーザーから一度ファイルを選択してしまうと、次回からはそのフォルダーしか開かないと報告がありました。 シンプルなテストプログラムを作成して確認したところ、Windows 7 と Windows XP では挙動が違っていました。

20120420104642

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 を選択します。

1_3

次に Button2 を押します。期待通り、c:\bbbフォルダが表示されています。ファイル名には前回選択したものがフルパスで表記されています。

2_2



Windows XPの場合
同じくButton1 を押して、 c:\aaa\test.txt を選択します。

3_2

次に Button2 を押します。OpenDialog1.InitialDirの設定にかかわらず、先ほどオープンした c:\aaa\が開かれています。

4_2



で、対策はこちらです。次のようにファイル名をクリアすることにより、期待通りに動作するようになりました。 わかってしまえば、どうしてファイル名をクリアしていなかったんだと思うのですけど(^-^)
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;

|

« MacBook Air を買いました。 | トップページ | ☆2つのListViewを同期させる(その2) »