Wywoływanie SaveDialog

0

Witam.

Mam wyjątkowo prosty kod, który spędza mi sen z powiek:

  if not (SaveDialog1.Execute) or (SaveDialog1.FileName = '') then
  begin
    Result:=False;
    exit;
  end;

Który po wywołaniu uruchamia komunikat "Wkładanie dysku": Proszę włożyć dysk do stacji E:\ (DVD-ROM). Taki napęd mam, ale nie korzystam z niego. Katalog, który jest otwarty w SaveDialog to Pulpit... Ktoś ma pomysł jak pozbyć się tego komunikatu?

0

Już Tobie odpisałem na unit1, bo najpierw przeglądam zawsze tamto forum. Także tam sobie przeczytasz jak poprawić kod tej funkcji, ale ktoś inny może zgadnie dlaczego masz taka teakcje systemu, bo nie powinno to mieć miejsca, ja mam CD ROM jako literkę Z: i mimo że większośc czasu napęd jest pusty to nigdy w Open czy Save Dialogu nie otrzymałem takiego komunikatu ani jeszcze mając Windowx XP, ani teraz pod Windoes 7 64 bit. Ale może ktoś coś Ci lepszego doradzi.

0

1.if (NOT SaveDialog1.Execute) or (SaveDialog1.FileName = ) then'' - przenieś to not, bo nie wiadomo jak ma być, a kolejności operatorów na pamięć jeszcze nie pamiętam.
2. Szkoda że nie powiedziałeś co zmieniałeś w ustawieniach tego komponentu.
3. Zrób mały teścik z prostym savedialogiem - jest tak samo?
4. Skąd wiesz że to ta linia? Debuggerem patrzyłeś?
5. (losowane zgadywanie błędów) czy twoja aplikacja jest wielowątkowa?
6. Czy tylko mnie irytuje to że pyta się na wielu forach, a ew. rozwiązań nie podaje, tematy porzuca itd. - oczywiście generuje to (za przeproszeniem) dezinformacje i całą gamę innych pozytywnych zjawisk. Chyba zacznę sprawdzać inne fora tylko po to żeby wiedzieć komu nie odpowiadać. Bo patrzę na forum, i widzę same powtórki z tego. Chyba tylko jeszcze ja nie pytam na konkurencyjnych forach (bo może otrzymam odpowiedź szybciej?).

0

if (NOT SaveDialog1.Execute) or (SaveDialog1.FileName = '') then

Racja, poprawiłem, dzięki, ale problemu nie zlikwidowało.

123: Są to jedyne dwie linijki w całej funkcji (reszta jest zakomentowana); Ad.5: Zgadłeś, aplikacja jest wielowątkowa, ale w żadnym z wątków nie dokonuje się żadnych operacji na plikach (jeśli ma to coś z tym wspólnego)

Tak jak radziliście, zrobiłem nową aplikację z czystym SaveDialogiem, problem nie występuje. Skopiowałem właściwości tamtego pierwszego i problem też nie występuje. Jeśli chodzi o to, co zmieniałem to tylko: DefaultExt, Filter, FilterIndex i Title; Natomiast, gdy postawię nowy SaveDialog w tej aplikacji pierwszej, po wywołaniu również jest ten komunikat.

olesio, użytkownik może kliknąć anuluj, dlatego jest sprawdzanie czy nazwa pliku nie jest pusta; result zwraca false dla całej funkcji, dlatego musi być w tym warunku.

A piszę na kilku forach, ponieważ na różnych siedzą różni ludzie, tylko nielicznym chce się wędrować po wszystkich stronach.

0

DefaultExt miesza wyniki dla twojego if'a

  Result := SaveDialog1.Execute;

  if not Result then
    Exit;

  // dalsza część kodu
0

W jakim sensie miesza?

Btw. ten Result:= False ma być w tamtym miejscu, bo to jest funkcja zapisz(...):boolean; która zwraca True, gdy nastąpi zapisanie, lub False kiedy stanie się cokolwiek innego, tudzież ktoś kliknie anuluj, plik będzie istniał, plik będzie niezapisywalny lub nie zostanie zapisany. To jest jedynie wycinek kodu.

0

To jest jedynie wycinek kodu.

No a wiesz że nam z tego wycinka nic nie wychodzi? Daj więcej kodu.

Zgadłeś, aplikacja jest wielowątkowa, ale w żadnym z wątków nie dokonuje się żadnych operacji na plikach (jeśli ma to coś z tym wspólnego)

A masz wszystko threadsafe? Bo różne magiczne sztuczki się robią jak nie jest...

Btw. Odpowiedz na moje pytanie nr. 4 i 2. Bo dalej nie podałeś skąd wiesz że to ta linia, ani nie powiedziałeś co zmieniałeś na komponencie (nie chodzi tylko co, ale też na co.)

A piszę na kilku forach, ponieważ na różnych siedzą różni ludzie, tylko nielicznym chce się wędrować po wszystkich stronach.

I dlatego uznajesz że wolno powodować dezinformacje i porzucać wątki?
Skoro zakładasz wiele tematów na różnych forach, to twoim obowiązkiem jest przynajmniej poinformować na innych o rozwiązaniu gdy już je znajdziesz. Mnie osobiście irytuje takie zakładanie wielu wątków, bo zrozumiałbym, gdybyś gdzieś zapytał i nie znaliby odpowiedzi, ale po co zakładać wiele w tym samym momencie? Będziesz łaskaw więcej tego nie robić? Dziękuję -.-'

0

Proszę, oto cały kod funkcji. Tłumaczę, że tylko te linijki się wykonują, bo reszta jest zakomentowana.


//zapisuje plik z zapytaniem o jego nazwe i pozycje (SaveDialog1) (Plik > Zapisz Jako)
function Tglowna.SaveFileWithDialog: Boolean;
begin
{  if (ram_.PageCount = 0) then
  begin
    Result:=False;
    exit;
  end;
}
  if (not SaveDialog1.Execute) or (SaveDialog1.FileName = '') then
  begin
    Result:=False;
    exit;
  end;
         
{
  if FileExists(SaveDialog1.FileName) then
  if Application.MessageBox(PChar(ParamKomunikat(70, ExtractFileName(SaveDialog1.FileName))), PChar(Application.Title), MB_YESNO or MB_ICONWARNING or MB_SYSTEMMODAL) = idNo then
  begin
    Result:= False;
    exit;
  end;

  if AFramePoint.Encoding = ecUTF8_NonBoom then
  begin
    if ZapiszDoPlikuUTF(KonANSIToUtf( FArray[AFrameID].Ramka.html.Text), FArray[AFrameID].FileName ) = False then
    begin
      Result:= False;
      exit;
    end;
  end else
  if AFramePoint.Encoding = ecISO_8859_2 then
  begin
    if ZapiszDoPlikuANSI(KonfAnsiToIso( AFramePoint.Ramka.html.Text), AFramePoint.FileName ) = False then
    begin
        Result:= False;
        exit;
    end;
  end else
    if ZapiszDoPlikuANSI( AFramePoint.Ramka.html.Text, AFramePoint.FileName ) = False then
    begin
      Result:= False;
      exit;
    end;

  FArray[AFrameID].FileName:= SaveDialog1.FileName;
  FArray[AFrameID].Saved:= True;

  UpdateStatusBar;

  manager.insert(FArray[AFrameID].FileName);
  Result:= True; }
end;

DFM:

  object SaveDialog1: TSaveDialog
    DefaultExt = 'html'
    Filter = 
      'Strona HTML (*.html, *.htm)|*.html;*.htm|Strona PHP (*.php)|*.ph' +
      'p|Arkusz styl'#243'w (*.css)|*.css|Python (*.py)|*.py|JavaScript (*.j' +
      's)|*.js|Baza danych (*.sql)|*sql|Wszystkie typy (*.*)|*.*'
    Title = 'Zapisywanie dokumentu'
    Left = 620
    Top = 170
  end

Skąd wiem, że akurat te linijki? Bo są jedyne, które się wykonują. Gdy je zakomentuje alert nie wyskakuje.

Co to znaczy, że aplikacja jest threadsafe? Tworzę je, działają w pętli, odwołują się do swoich obiektów w środku, potem zwalniam jak są niepotrzebne.

0

Skąd wiem, że akurat te linijki? Bo są jedyne, które się wykonują. Gdy je zakomentuje alert nie wyskakuje.

A o debuggerze słyszałeś? No to go użyj, żeby określić jak najdokładniej miejsce błędu. A jak nie słyszałeś to poszukaj z czym to się je i też go użyj. A najlepiej sprawdź podczas jakiego calla do systemu powstaje ten błąd (jak możesz, bo to takie łatwe nie jest do sprawdzenia).

I powiedz nam czy po kliknięciu wyboru to się dzieje, czy może jeszcze w czasie przechodzenia do katalogu. Sprawdź też program na innym komputerze, być może masz dziwną windę.

Spróbuj też pobawić się ustawieniami komponentu, może coś konkretnego powoduje błąd.

Co to znaczy, że aplikacja jest threadsafe? Tworzę je, działają w pętli, odwołują się do swoich obiektów w środku, potem zwalniam jak są niepotrzebne.

To znaczy że używasz sekcji krytycznych do odwoływania się do pamięci która jest używana w wielu wątkach. (Ew. zmiennych typu threadsafe czy innych kombinacji).

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