TPicture.SaveToFile and FileExt<>''

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TPicture.SaveToFile and FileExt<>''

Сообщение Maxizar » 06.09.2010 15:41:29

Вот пришлось работать с процедурой TPicture.SaveToFile.. ее обьявление:
TPicture.SaveToFile(const Filename: string; const FileExt: string = '');
Видно что можно параметр FileExt не задавать по умолчанию он пуст. И вроде бы все ок. Но вот если я принудительно его задаю, то при сохранении файла это расширение к имени файла не прибавляеться.
Т.е. SaveToFile('C:\1.jpg') Сохранит картинку в файл C:\1.jpg,
а вот SaveToFile('C:\1','jpg') Сохранит картинку в файл C:\1 , а как же расширение?? jpg.
При рассмотрении процедуры:
Код: Выделить всё
procedure TPicture.SaveToFile(const Filename: string; const FileExt: string = '');
var
  Ext: string;
  Stream: TStream;
begin
  if FileExt <> '' then
    Ext := AnsiLowerCase(FileExt)
  else
    Ext := AnsiLowerCase(ExtractFileExt(Filename));
   
  if (Ext <> '') and (Ext[1] = '.') then System.Delete(Ext, 1, 1); // delete '.'

  Stream := TFileStream.Create(UTF8ToSys(Filename), fmCreate); //Забыли про расширение если оно задано
  try
    SaveToStreamWithFileExt(Stream, Ext);
  finally
    Stream.Free;
  end;
end; 


Переписал вот так:
Код: Выделить всё
procedure TPicture.SaveToFile(const Filename: string; const FileExt: string = '');
var
  Ext,Name: string;
  Stream: TStream;
begin

  if FileExt <> '' then
    begin
      Ext := AnsiLowerCase(FileExt);
      Name:= Filename+'.'+Ext;
    end
  else
     begin
       Ext := AnsiLowerCase(ExtractFileExt(Filename));
       if (Ext <> '') and (Ext[1] = '.') then System.Delete(Ext, 1, 1); // delete '.'
       Name:= Filename;
     end;

  Stream := TFileStream.Create(UTF8ToSys(Name), fmCreate);

  try
    SaveToStreamWithFileExt(Stream, Ext);
  finally
    Stream.Free;
  end;
end;

Теперь в обоих случаях расширение прописываеться... Но может быть я не прав и оно не должно прописываться. Подскажите.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: TPicture.SaveToFile and FileExt<>''

Сообщение Odyssey » 06.09.2010 19:50:17

То что вы не поленились разобраться в исходниках и поправить, да ещё и выложили изменения -- это отлично. Но в данном случае я бы постарался решить проблему вне LCL. Дело в том, что в документации по этому параметру нет никаких комментариев, т.е. кто и зачем его ввёл, неизвестно. Скорее всего у этого человека была/есть какая-то далеко идущая мысль, но по коду она неочевидна. Поэтому, имхо, хороших вариантов только два:
1) Спросить у разработчиков в рассылке;
2) Не использовать этот параметр, пока не появится внятной документации. В качестве альтернативы:
Код: Выделить всё
// было так:
MyPicture.SaveToFile(MyFileName, MyFileExt);
// стало так:
MyPicture.SaveToFile(MyFileName + MyFileExt);
// или так:
MyPicture.SaveToFile(ChangeFileExt(MyFileName, MyFileExt));
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TPicture.SaveToFile and FileExt<>''

Сообщение hinst » 06.09.2010 21:36:09

тут я вижу два варианта.
:arrow: наверное, во втором аргументе указывается не расширение, которое надо приписать к имени файла, а формат, который надо использовать
:arrow: просто: не доделали ещё
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

Рейтинг@Mail.ru