Пользователи программного обеспечения, написанного на Win32 Delphi, иногда сталкиваются с неожиданным поведением диалогов сохранения файлов. В частности, операционная система может запомнить последний использованный путь, который может быть неактуален или недоступен, что приводит к зависаниям приложения. В данной статье мы рассмотрим, как операционная система выбирает и запоминает путь сохранения файлов, и предложим решение проблемы, не изменяя исходный код приложения.
Проблема
При использовании диалога сохранения файлов TSaveDialog с флагом ofNoChangeDir в Win32 Delphi приложении, операционная система может запомнить путь, который при следующем запуске приложения будет предложен пользователю в качестве начального. Это может привести к проблемам, если предыдущий путь был некорректен или недоступен, что вызывает зависание приложения.
Описание диалога сохранения файла
В коде приложения используется следующий диалог для сохранения файла в формате PDF:
Как операционная система выбирает и запоминает путь
ОС запоминает последний выбранный путь для сохранения файлов, даже если приложение не сохраняет эту информацию. Это связано с тем, что Windows использует внутренние механизмы для хранения этих данных.
Подтвержденный ответ
Проблема заключается в том, что Windows сохраняет информацию о последнем использованном пути сохранения файла в ключе реестра HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\CIDSizeMRU. Эти данные сохраняются в двоичном формате и связаны с конкретным приложением.
Альтернативный ответ
Для решения проблемы можно использовать более новые диалоги сохранения файлов, такие как TFileSaveDialog, которые предоставляют больше контроля над поведением диалога и его сохраненными настройками. Также можно использовать методы SetClientGuid и ClearClientData интерфейса IFileDialog, чтобы сбросить сохраненные настройки диалога.
Решение проблемы
Чтобы сбросить запомненный путь, можно удалить соответствующие записи в реестре или использовать методы SetClientGuid и ClearClientData для сброса данных диалога. Однако, стоит отметить, что прямое удаление ключа реестра может быть рискованным, так как в нем могут храниться данные других приложений. Лучше всего использовать методы IFileDialog, предоставляемые более новыми диалогами сохранения файлов.
Использование TFileSaveDialog и его методов позволяет более гибко управлять диалогом сохранения файлов в современных версиях Windows. Сброс сохраненных настроек позволяет избежать проблем с зависанием и неправильным выбором пути сохранения файлов.
Комментарии к решению
Не рекомендуется удалять весь ключ HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\CIDSizeMRU, так как это может повлиять на работу других приложений.
Использование TFileSaveDialog и его методов SetClientGuid и ClearClientData является предпочтительным решением для управления сохраненными настройками диалога.
Обновление программного обеспечения до более современных библиотек и интерфейсов может помочь избежать подобных проблем, особенно при работе на операционных системах, значительно отличающихся от тех, для которых разрабатывалось исходное ПО.
Проблема заключается в том, что операционная система Windows сохраняет информацию о последнем использованном пути для сохранения файлов, что может привести к ошибкам, если путь является некорректным или недоступным, и требует коррекции поведения диалогов
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS