Zapamiętywanie ostatnio użytej lokalizacji i tak będzie wykonywane, bez względu na przestawianie właściwości InitialDir
; Wszystko dlatego, że klasa TOpenDialog
przed pokazaniem okna sprawdza, czy właściwość FileName
jest wypełniona i jeśli tak - używa ścieżki ostatnio wybranego pliku, ignorując InitialDir
;
Rozwiązaniem jest wyczyszczenie tej właściwości, jeśli jakikolwiek plik zostanie wybrany:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.InitialDir := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'Picture\';
if OpenDialog1.Execute then
begin
{ tu operacje wykorzystujące OpenDialog1.FileName }
OpenDialog1.FileName := '';
end;
end;
Wystarczyło trochę poeksperymentować; Przy okazji:
grzegorz_so
@furious programming: strasznie się trzeba opisać z IncludeTrailingPathDelimiter
, chyba ponad 30 znaków :) prościej dopisać do ścieżki jeden znak \
Niekoniecznie - IncludeTrailingPathDelimiter może zwrócić ścieżkę zakończoną znakiem \
, np. C:\
, jeśli plik znajduje się bezpośrednio na danej partycji; W takim przypadku dodany zostanie drugi znak separatora i wyjdzie C:\\Picture\
- choć to raczej nie powinno w niczym przeszkadzać, chyba że używamy własnych funkcji parsujących ścieżki, które podwójnych separatorów nie przewidują;
Jeśli chodzi o długaśną nazwę funkcji - nie problem ją skrócić :]
{$MACRO ON}
{$DEFINE AddPathDelim := IncludeTrailingPathDelimiter}
{$DEFINE GetPath := ExtractFilePath}
{$DEFINE AppPath := ParamStr(0)}
i wyjdzie nam znacznie krótsza linijka, nie wpływająca na kod wynikowy programu:
OpenDialog1.InitialDir := AddPathDelim(GetPath(AppPath)) + 'Pictures\';
Ale to jako ciekawostka.