Главная страница
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.008 c
15-1305577799
Юрий
2011-05-17 00:29
2011.09.04
С днем рождения ! 17 мая 2011 вторник


15-1304872083
HF-Trade
2011-05-08 20:28
2011.09.04
Капча javascript


4-1248422295
Dmitriy
2009-07-24 11:58
2011.09.04
как определить соединение


3-1263808915
fford
2010-01-18 13:01
2011.09.04
не работает Append


15-1305098229
young_dev
2011-05-11 11:17
2011.09.04
обращение к объекту