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ć?
Gdzieś w kodzie zrobiłeś jakiś błąd. Podajesz błędną ścieżkę lub nie podajesz jej wcale lub ...
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;
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;
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ł.
Dzięki,
nigdy z tego nie korzystałem. Zaraz sprawdzę i napiszę co i jak.
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.
olesio napisał(a)
opensavedlg.rar
WTF? Wstawka assemblerowa której celem jest skopiowanie nazwy pliku :|
(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 ....