Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.09.04;
Скачать: CL | DM;

Вниз

Недопустимые символы в названии файла   Найти похожие ветки 

 
Омлет ©   (2011-05-18 13:39) [0]

Вероятно, это давно известная проблема со стандартным диалогом, но я только сейчас напоролся:

procedure TForm1.btnSaveClick(Sender: TObject);
begin
 dlgSave.FileName := edtProjectName.Text;
 if dlgSave.Execute then
 begin
   // save project
 end;
end;


Если в edtProjectName ввести недопустимый в имени файла символ, то диалог просто не появится, без каких-либо сообщений об ошибках.
И вот попробуй, догадайся, в чем же проблема, когда пользователь из другого города звонит и говорит, что иногда не срабатывает кнопка сохранения...
Это, как минимум, в D5/D7 + XP/7.

P.S.
fail_chars = ["<", ">", "?", "|", ":", "*", "/", "\", """]


 
Leon-Z ©   (2011-05-18 14:03) [1]


try
 if dlgSave.Execute then
 begin
   ...
 end;
except
 // научитесь давать правильные имена файлам
end;


 
Dennis I. Komarov ©   (2011-05-18 14:03) [2]

т.е. dlgSave.Execute возвращает true?


 
Dennis I. Komarov ©   (2011-05-18 14:06) [3]


> Leon-Z ©   (18.05.11 14:03) [1]

дык

> то диалог просто не появится, без каких-либо сообщений об
> ошибках.

т.е. я понял что нет эксепшена...

Логично предположить что должен вернуть false, а далее GetLastError или подобное...


 
И. Павел ©   (2011-05-18 14:15) [4]

Это что за штука? Может как раз тут и должно было фикситься, да забыли? :) (Delphi 7, Dialogs.pas)
function FixFileName(const FileName: string): string;
begin
 Result := FileName;
end;


 
И. Павел ©   (2011-05-18 14:17) [5]

> [4] И. Павел ©   (18.05.11 14:15)

Извиняюсь, недоглядел. Это для совместимости с линуксом.


 
Омлет ©   (2011-05-18 15:10) [6]

> Leon-Z ©   (18.05.11 14:03) [1]

Execute возвращает false, как если бы диалог был показан, а пользователь нажал "Отмена". Никаких ошибок ни Windows, ни Delphi не генерируют.


 
Юрий Зотов ©   (2011-05-18 15:46) [7]

Решение "в лоб":

const
 Fail_Chars = ["<", ">", "?", "|", ":", "*", "/", "\", """];

procedure TForm1.btnSaveClick(Sender: TObject);
var
 i: integer;
begin
 for i := 1 to Length(edtProjectName.Text) do
   if edtProjectName.Text[i] in Fail_Chars then
     raise EMyException.Create
       ("В имени файла недопустимый символ " + edtProjectName.Text[i]);
 dlgSave.FileName := edtProjectName.Text;
if dlgSave.Execute then
begin
  // save project
end;
end;


 
Омлет ©   (2011-05-18 15:53) [8]

> Юрий Зотов ©   (18.05.11 15:46) [7]

Решить-то не проблема, когда знаешь причину. А вот найти её, да руками сильно удаленного пользователя - весёленькое занятие.
И подобное, думаю, лучше вообще перенести в сеттер свойства FileName для TOpenDialog.


 
Медвежонок Пятачок ©   (2011-05-18 16:11) [9]

а если файл создается на томе новелла 3.12?
приведенное fail_chars будет слишком коротким


 
Игорь Шевченко ©   (2011-05-18 16:34) [10]

Юрий Зотов ©   (18.05.11 15:46) [7]

LastDelimiter проще


 
SergeyIT ©   (2011-05-18 18:16) [11]

> Омлет ©
Когда работаешь с файловой и т.п. системами всегда предохраняться надо...



Страницы: 1 вся ветка

Текущий архив: 2011.09.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
2-1305711102
volkafff
2011-05-18 13:31
2011.09.04
Блокировка доступа к интернету


15-1303279486
Inovet
2011-04-20 10:04
2011.09.04
Фильм "Generation П" кто-нибудь уже видел?


15-1305439433
P
2011-05-15 10:03
2011.09.04
Цифровая подпись драйвера


15-1305711559
Омлет
2011-05-18 13:39
2011.09.04
Недопустимые символы в названии файла


3-1263635532
victor
2010-01-16 12:52
2011.09.04
обновление данных в ADODataSet