SaveDialog nie zmienia InitialDir

0

Witam,
na formie mam dwa przyciski. Po naciśnięciu 1-go właściwość InitialDir komponentu SaveDialog ma wartość np. C:\dokumenty.
Chcę żeby po naciśnięciu 2-go przycisku InitialDir tego komponentu (SaveDialog) miał inną wartość np. D:\pliki. Niestety komponent cały czas pamięta wartość InitialDir. Czy możecie mi coś poradzić?

0

Gdzieś w kodzie zrobiłeś jakiś błąd. Podajesz błędną ścieżkę lub nie podajesz jej wcale lub ...

0
xeo545x39 napisał(a)

http://4programmers.net/Forum/Delphi_Pascal/132508-OpenDialog1.InitialDir_problem

Zanim napisałem pytanie, szukałem na forum odpowiedzi. Post, który wskazujesz czytałem ale z niego nic nie wynika.
Poniżej kod programu:
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.InitialDir:='C:';
if SaveDialog1.Execute then
begin
AssignFile(plikTest,SaveDialog1.InitialDir+'WSX.txt');
Rewrite(plikTest);
CloseFile(plikTest);

end;
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
SaveDialog1.InitialDir:='D:';
if SaveDialog1.Execute then
begin
AssignFile(plikTest,SaveDialog1.InitialDir+'QAZ.txt');
Rewrite(plikTest);
CloseFile(plikTest);

end;
end;

0

Ja nigdy nie kładę na formularz tego komponentu; Zwykle tworzę własne okna dialogowe do takich celów, ale jeśli robię jakiś mały programik korzystający klasy TSaveDialog, jego utworzenie, obsługę oraz usunięcie z pamięci realizuję ręcznie w kodzie np. w ten sposób:

procedure TForm1.Button2Click(Sender: TObject);
var
  SaveDlg: TSaveDialog;
begin
  SaveDlg := TSaveDialog.Create(Self);

  try
    with SaveDlg do
      begin
        Name := 'SaveDlg';
        Filter := 'Wszystkie pliki (*.*)|*.*';
        InitialDir := 'C:\Windows\';
        FileName := '*.*';
        Title := 'Wybierz dowolny plik';

        if Execute() then
          Application.MessageBox(PChar('Nazwa pliku: ' + FileName),
                                 'Zapisywanie pliku', MB_ICONINFORMATION)
        else
          Application.MessageBox('Zapisywanie pliku anulowane przez użytkownika!  ',
                                 'Zapisywanie pliku', MB_ICONWARNING);
      end;
  finally
    FreeAndNil(SaveDlg);
  end;
end;

Dzięki temu nie mam żadnych problemów, ponadto komponent jest tworzony tylko i wyłącznie w momencie, kiedy go potrzebuję a nie przez cały czas działania formularza;

Jeśli nie musisz mieć cały czas utworzonego komponentu z tej klasy to polecam ręczne tworzenie i usuwanie go z pamięci;


By nie powiększać zbytnio ilości linii programu dobrze jest napisać sobie funkcję, która jako argument przyjmie wartości dla interesujących właściwości komponentu; Funkcja ta jeśli wykona się poprawnie zwróci nazwę wybranego pliku; Jeżeli użytkownik nie wybierze pliku (zamknie okienko krzyżykiem) funkcja zwróci pusty łańcuch; Może wyglądać np. tak:

{...}

  public
    function SaveFile(sTitle, sFileName, sInitialDir, sFilter: String): TFileName;
  end;

{...}

function TForm1.SaveFile(sTitle, sFileName, sInitialDir, sFilter: String): TFileName;
var
  SaveDlg: TSaveDialog;
begin
  Result := '';
  SaveDlg := TSaveDialog.Create(Self);

  try
    with SaveDlg do
      begin
        Title := sTitle;
        FileName := sFileName;
        InitialDir := sInitialDir;
        Filter := sFilter;

        if Execute() then
          Result := FileName;
      end;
  finally
    FreeAndNil(SaveDlg);
  end;
end;

a za wywołanie i pobranie nazwy pliku odpowiada np. taki kod:

procedure TForm1.Button2Click(Sender: TObject);
var
  sFileName: TFileName;
begin
  sFileName := SaveFile('Zapisywanie pliku', '*.txt', 'C:\',
                        'Pliki tekstowe (*.txt)|*.txt');

  if sFileName = '' then
    Application.MessageBox('Zapisywanie anulowane przez użytkownika!',
                           'Zapisywanie pliku', MB_ICONWARNING)
  else
    Application.MessageBox(PChar('Nazwa pliku: ' + sFileName),
                           'Zapisywanie pliku', MB_ICONINFORMATION);
end;

Podobnie można napisać otwieranie pliku(ów), można też go dowolnie modyfikować pod własne potrzeby;

0
xeo545x39 napisał(a)

http://4programmers.net/Forum/Delphi_Pascal/132508-OpenDialog1.InitialDir_problem
Jeszcze tego nie poprawili?

Jeśli to jest przyczyną rozwiązanie jest banalne - tworzyć TSaveDialog dynamicznie za każdym razem, tak jak Furious Programming pokazał.

0

Dzięki,
nigdy z tego nie korzystałem. Zaraz sprawdzę i napiszę co i jak.

0

Ja polecę, to co dołączyłęm do tego posta. Ten moduł można smiało używać także w aplikacjach WinAPI bez zbędnego efektu "puchnięcia" pliku wykonywalnego aplikacji.

0
olesio napisał(a)

opensavedlg.rar
WTF? Wstawka assemblerowa której celem jest skopiowanie nazwy pliku :|

0

(Widze ze temat byl poruszany wzglednie niedawno wiec dopisze co mi wyszlo)

Faktycznie, działa to co xeo545x39 dodał drobnym druczkiem przy jednym z postów :)
Czyli najpierw czyszczenie FileName
SaveDialog1.FileName:='';
SaveDialog1.InitialDir:=OpenDialog1.InitialDir; //zeby mi zapisywalo tam gdzie otwierałem
a potem już normalnie
if savedialog1.Execute then ....

1 użytkowników online, w tym zalogowanych: 0, gości: 1