Вопрос, поставленный пользователем, связан с необходимостью автоматически изменять расширение файла при смене типа файла в диалоге сохранения файла в операционных системах Vista и Windows 7. Разработчик использует компонент TSaveDialog и хочет поддерживать работу в среде XP, а также в Vista/7 с использованием Delphi 2007.
Решение проблемы
Для решения этой задачи можно использовать обработчик события TypeChange компонента TSaveDialog. Важно установить свойство UseLatestCommonDialogs в False, чтобы использовать старые диалоги, совместимые с XP. Вот пример кода, который автоматически изменяет расширение файла в зависимости от выбранного типа файла:
procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
var
FName, Ext: string;
begin
with TSaveDialog(Sender) do
begin
if DirectoryExists(FileName) then // Проверка, что имя файла не пустое
exit;
case FilterIndex of
1: Ext := '.png';
2: Ext := '.bmp';
3: Ext := '.jpg';
end;
FName := ChangeFileExt(ExtractFileName(FileName), Ext);
SendMessage(Windows.GetParent(Handle), CDM_SETCONTROLTEXT, 1152, LongInt(PChar(FName)));
end;
end;
Для поддержки операционных систем, начиная с Vista, можно использовать TFileSaveDialog, но это потребует работы с COM-интерфейсами, что может быть сложно. Однако, есть информация, что TFileSaveDialog вызовет исключение на XP, так что для поддержки различных версий Windows может потребоваться динамическое переключение между TSaveDialog и TFileSaveDialog в зависимости от версии операционной системы.
Альтернативное решение
В качестве альтернативного решения можно использовать класс-помощник для изменения расширения файла в обработчике события OnTypeChangeEvent компонента TSaveDialogWrapper. Это решение будет работать начиная с Delphi 2009, так как в Delphi 2007 класс-помощники не могут обращаться к приватным полям.
procedure TForm1.DialogTypeChange(Sender: TObject);
var
xFN: WideString;
xFileName: PWideChar;
xFD: TFileDialogWrapper;
xFilterIndex: UINT;
begin
if Sender is TOpenDialog then
with TOpenDialog(Sender) do begin
xFD := GetInternalWrapper;
if (xFD <> nil) and (xFD.FFileDialog <> nil) then begin
// Код для Vista диалога сохранения файла
// ...
end else begin
// Код для старых диалогов
// ...
end;
end;
end;
Также стоит отметить, что если установить свойство DefaultExt компонента TSaveDialog, Delphi и Windows автоматически позаботятся об изменении расширения файла, и дополнительные действия в обработчике события OnTypeChange не потребуются.
Заключение
Для реализации автоматической смены расширения файла в диалоге сохранения в Delphi 2007 можно использовать обработчик события TypeChange компонента TSaveDialog или TFileSaveDialog с учетом версий операционной системы. Важно также рассмотреть возможность использования класса-помощника для работы с приватными полями и установки свойства DefaultExt для автоматического управления расширением файла.
Пользователь столкнулся с задачей автоматизации изменения расширения файла в диалоге сохранения в среде Delphi 2007 для различных версий Windows, включая XP, Vista и Windows 7.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.