Выбор папки для сохранения файла c

Обновлено: 07.07.2024

Для вызова стандартного диалога выбора файла или папки Windows в 1С существует специальный объект ДиалогВыбораФайла. У него существует три режима работы:

  • выбор каталога;
  • открытие файла;
  • сохранение файла.

Рассмотрим эти режимы.

Во всех режимах для того, чтобы определить, выбрал ли пользователь файл или каталог (не нажал ли он кнопку Отмена) используется функция Выбрать(). Если была нажата кнопка Отмена, эта функция возвращает Ложь. Эта же функция вызывает появление окна выбора у пользователя.

Диалог выбора каталога в 1С

Следует помнить, что путь к каталогу записывается без последнего слэша. Например, так: c:Папка1Папка2

Диалог открытия файла в 1С

В режиме открытия появляются дополнительные параметры работы диалога:

    Фильтр состоит из двух частей, разделенных символом «|»: строки представления, которая отображается в окне выбора файла, и строки маски. В маске могу использоваться стандартные символы: ? — любой символ, * — любые символы. Можно последовательно перечислить несколько фильтров, разделенных символом «|». Например:

Итак, код вызова диалога открытия одного файла будет выглядеть так:

Код вызова диалога открытия нескольких файлов будет выглядеть так:

Диалог сохранения файла в 1С

Диалог сохранения отличается от диалога открытия тем, что если выбранный файл существует, при сохранении будет задан вопрос, хочет ли пользователь его перезаписать. Также при сохранении не работает возможность множественного выбора файлов. В остальном все работает точно так же:

Рассмотрим как асинхронно (а в управляемых формах необходимо только так) программно обработать выбор пользователем пути к файлу.

Постановка задачи

Предположим, что на форме создан реквизит ПутьКФайлу. Этот реквизит имеет тип Строка и выведен на форму. Пользователь должен указывать в этом поле путь к файлу Excel.

Решение

Для удобства свойство КнопкаВыбора элемента формы установим в значение Да и будем обрабатывать событие НачалоВыбора этого элемента.

В процедуре начала выбора элемента ПутьКФайлу необходимо написать код:

// Отказываемся от стандартной обработки процедуры
СтандартнаяОбработка = Ложь;

Диалог . Показать ( ОповещениеЗавершения );

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

  • ВыбранныеФайлы — массив выбранных имен файлов. Если пользователь отказался от выбора файла, то в параметре будет содержаться Неопределено;
  • ДополнительныеПараметры — произвольное значение, которое указано при создании объекта ОписаниеОповещения в третьем параметре (в нашем примере не задано).

Пример процедуры, которая будет вызвана после закрытия окна выбора файла:

Если ВыбранныеФайлы <> Неопределено Тогда

ПутьКФайлу = ВыбранныеФайлы [ 0 ];

Внимание!

Процедура, указанная в объекте ОписаниеОповещения должна иметь ключевое слово Экспорт.

Приведенный пример можно немного усовершенствовать: передать в третий параметр конструктора ОписаниеОповещения переменную Диалог.

ОповещениеЗавершения = Новый ОписаниеОповещения ( «ВыборФайлаЗавершение» , ЭтотОбъект , Диалог );

Тогда в процедуре ВыборФайлаЗавершение будет доступно немного больше информации: из параметра ДополнительныеПараметры можно будет узнать каталог, в котором хранится выбранный файл, и фильтр, которому соответствует файл.

В конструкторе объекта ДиалогВыбораФайла в параметре указывается для чего будет открыт диалог. Возможные значения системного перечисления РежимДиалогаВыбораФайла:

Приведу еще несколько свойств объекта ДиалогВыбораФайла:

  • Каталог — текущий каталог;
  • ПолноеИмяФайла — начальное полное имя файла. После выбора файла содержит полное имя выбранного файла (кроме множественного выбора и выбора каталога);
  • МножественныйВыбор — флаг возможности выбора нескольких файлов;
  • ПредварительныйПросмотр — флаг необходимости показа окна предварительного просмотра файлов;
  • ПроверятьСуществованиеФайла — флаг необходимости проверки существования выбираемого файла.

Решение средствами БСП

В конфигурациях со втроенной Библиотекой стандартных подсистем можно использовать процедуру

ОбработчикВыбораФайла ( Объект , Знач ИмяСвойства , СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено ) Экспорт

общего модуля ОбменДаннымиКлиент. При помощи этого метода приведенную выше задачу можно решить так:

ОбменДаннымиКлиент . ОбработчикВыбораФайла ( ЭтотОбъект , «ПутьКФайлу» , СтандартнаяОбработка , НастройкиДиалога );

Остались вопросы?
Спросите в комментариях к статье.

Достаточно часто нам требуется получить от пользователя какую-либо информацию — имя файла или каталога, цвет или шрифт. Для всего этого в 1С существуют диалоги. Код, который требуется для вызова диалога, довольно стандартный и мало чем отличается из раза в раз. Собственно именно о том, как вызвать различные диалоги в 1С 8.2 и 8.3 и пойдет речь.

Отмечу, что приведенные ниже примеры подходят для любых конфигураций 1С 8.2, а также для конфигураций 1С 8.3 у которых свойство конфигурации «Режим использования модальности» установлено как «Использовать» либо «Использовать с предупреждениями». Если же Вы имеете дело с конфигурацией 1С 8.3 не использующей модальность, то рекомендую прочесть статью о модальности в 1С.

Выбор каталога в 1С

Выбор файла в 1С

Обращаю Ваше внимание, что несколько масок расширений в одном фильтре должны разделяться знаком — точка с запятой (в синтаксис-помощнике об этом по-моему не написано).

Я также хотел бы повторить, что я знаю о FolderBrowserDialog, но иногда мне не нравится его использовать, в дополнение к тому, что мне действительно интересно, как настроить диалог таким образом. Говоря мне просто использовать FolderBrowserDialog помогает мне поддерживать согласованный пользовательский интерфейс, но не удовлетворяет мой любопытство, так что это не будет считаться ответом.

Это не специфичная для Vista вещь; я видел этот диалог с VS .NET 2003, поэтому он выполним в Win2k и WinXP. Это меньше" я хочу знать правильный способ сделать это " вопрос и больше "мне было любопытно об этом, так как я впервые хотел сделать это в VS 2003" вопрос. Я понимаю, что диалог файла Vista имеет возможность сделать это, но он работает в XP, поэтому я знаю, что они сделали что-то получить это сработает. Конкретные ответы Vista не являются ответами, потому что Vista не существует в контексте вопроса.

У меня есть диалог, который я написал, называется диалогом OpenFileOrFolder, который позволяет вам открыть папку или файл.

Если значение AcceptFiles равно false,то он работает только в режиме accept folder.

существует пакет кода API Windows. У этого есть много связанных с оболочкой вещей, включая CommonOpenFileDialog класса (на Microsoft.WindowsAPICodePack.Dialogs пространство имен). Это идеальное решение-обычный открытый диалог с отображением только папок.

вот пример того, как его использовать:

к сожалению, Microsoft больше не отправляет этот пакет, но несколько человек неофициально загрузили двоичные файлы в NuGet. Один пример можно найти здесь. Этот пакет только материал, специфичный для оболочки. Если вам это нужно, у того же пользователя есть несколько других пакетов, которые предлагают больше функциональности в исходном пакете.

можно использовать FolderBrowserDialogEx - повторно используемая производная от встроенного FolderBrowserDialog. Это позволяет ввести путь, даже UNC-путь. С его помощью можно также искать компьютеры или принтеры. Работает так же, как встроенный FBD, но . лучше.

(EDIT: я должен был указать, что в этом диалоговом окне можно выбрать файлы или папки. )

код для его использования:

на Ookii.Диалоги пакет содержит управляемую оболочку вокруг нового (Vista-style) диалогового окна браузера папок. Он также изящно деградирует в старых операционных системах.

для этого лучше использовать FolderBrowserDialog.

после нескольких часов поиска я нашел ответ by leetNightShade to рабочий раствор.

есть три вещи, которые, я считаю, делают это решение намного лучше, чем все остальные.

  1. он прост в использовании. Это требует только включения двух файлов (которые могут быть объединены в один в любом случае) в ваш проект.
  2. он возвращается к стандартному FolderBrowserDialog когда используется на XP или более старых системах.
  3. автор дает разрешение использовать код для любых целей, которые вы считаете подходящими.

там нет лицензии, как таковой, как вы можете взять и сделать с кодом, что вы будете.

OK, позвольте мне попробовать подключить первую точку ;-) Воспроизведение немного с Spy++ или Winspector показывает, что текстовое поле папки в расположении VS Project является настройкой стандартного диалога. Это не то же самое поле, что текстовое поле filename в стандартном диалоговом окне файла, например в блокноте.

оттуда, я полагаю, VS скрывает имя файла и тип файла textboxes / comboboxes и использует пользовательский шаблон диалога, чтобы добавить свою собственную часть в нижней части диалог.

m_ofn-это структура OPENFILENAME, лежащая в основе диалогового окна файла. Добавить эти 2 строчки:

в этом случае настроенная часть - это только метка + гиперссылка, но это может быть любой диалог. Он может содержать кнопку OK, которая позволит нам проверять только выбор папки.

но как мы избавимся от некоторых элементов управления в стандартной части диалога, я не знаю.

Точная Аудио Копия работает таким образом в Windows XP. Стандартный диалог открытия файла отображается, но поле filename содержит текст "Filename будет проигнорирован".

просто угадать здесь, но я подозреваю, что строка вводится в поле со списком edit control каждый раз, когда в диалоговом окне вносятся значительные изменения. Если поле не пустое, а флаги диалогового окна установлены так, чтобы не проверять наличие файла, диалог можно закрыть обычно.

Edit: это намного проще, чем я думал. Вот код на C++ / MFC, вы можете перевести его в среду по вашему выбору.

Edit 3: наконец, посмотрел на фактический диалог, о котором идет речь, в Visual Studio 2005 (у меня не было доступа к нему ранее). это не стандартный диалог открытия файла! если вы проверите окна в Spy++ и сравните их со стандартным открытым файлом, вы увидите, что структура и имена классов не совпадают. При ближайшем рассмотрении можно также обнаружить некоторые различия между содержимым диалоговых окон. Мой вывод заключается в том, что Microsoft полностью заменила стандартный диалог в Visual Studio, чтобы дать ему эту возможность. Мое решение или что-то подобное будет настолько близко, насколько вы можете получить, если вы не хотите кодировать свой собственный с нуля.

мы сделали наш, используя поддержку класса WTL и настроили диалоговое окно файла, чтобы включить панель пользовательских мест и подключаемые представления COM.

вы можете использовать такой код

  • фильтр скрывает файлы
  • имя файла-Скрыть текст

для расширенного скрытия текстового поля для имени файла вам нужно посмотреть OpenFileDialogEx

Первый Вариант

Он используется так в форме Windows:

вы можете, конечно, играть с его параметрами и какие свойства он предоставляет. Например, это позволяет multiselect в диалоговом окне в стиле Vista.

Второй Вариант

попробуйте этот из Codeproject (кредит Нитрон):

Я думаю, что это тот же диалог, о котором вы говорите - может быть, это поможет, если вы добавите скриншот?

на Vista вы можете использовать методе ifiledialog с установленным параметром FOS_PICKFOLDERS. Это вызовет отображение OpenFileDialog-подобного окна, где вы можете выбрать папки:

для старых окон вы всегда можете прибегнуть к трюку с выбором любого файла в папке.

вы можете использовать такой код

фильтр является пустой строкой. Имя файла-AnyName, но не пустой

Я знаю, что вопрос был о конфигурации OpenFileDialog но, видя, что Google привел меня сюда, я могу также указать, что если вы ищете только папки, вы должны использовать FolderBrowserDialog вместо этого, как ответил другой вопрос SO ниже

на диалоги Ookii для WPF библиотека имеет класс, который предоставляет реализацию диалогового окна браузера папок для WPF.

Глава 1 Использование контролов OpenFileDialog и SaveFileDialog для работы с файлами

Для изучения работы с контролами OpenFileDialog и SaveFileDialog создадим новое решение (подробно о создании проекта решения было раказано в первом разделе книги) или изменим уже ипользованный проект (убрав коды обработчиков событий нажатия кнопок, изменив надписи и картиночки) и поместим на форму контролы RichTextBox, OpenFileDialog и SaveFileDialog. Контролы OpenFileDialog и SaveFileDialog не визуальные и, потому, разместились ниже формы. Проект решения с которым будем работать примет вид, показанный на Рис.1.

Рис.1 Проект решения для работы с OpenFileDialog и SaveFileDialog

Дважды кликнем на форме (вне контролов) и, таким образом, создадим обработчик Form1_Load, который будет вызываться при каждой загрузки формы и который в дальнейшем будем часто использовать для начальной инициализации параметров программы и переменных. В обработчике запишем код очистки RichTextBox:

Обработчик нажатия кнопки 3 оставим прежний:

Параграф 1 Ипользование контрола OpenFileDialog

Основные свойства OpenFileDialog

Свойство AddExtension разрешает или запрещает автоматическое добавление расширение, указанное в свойстве DefaultExt.

Свойство DefaultExt - расширение, принятое по умолчанию для автоматического добавления к имени файла при AddExtension=true.

На Рис.2 показано окно предупреждение при FileName=a.doc, CheckFileExists=true и нажатии кнопки "Oткрыть" при невыбранном файле.

Рис.2 Окно предупреждения при CheckFileExists=true

Свойство FileName - имя файла по умолчанию для выборки если была нажата кнопка OK и не выбрн кликом мышки файл в окне диалога.

Рис.3 Окно предупреждения при CheckPatchExists=true

Свойство DereferenceLinks - используется для указания контролу что именно возвращпть при выборе файла ссылки - файл по ссылке (true) или файл самой сылки (false).

Свойства Filter, FilterIndex - фильтр для выбираемых файлов и индекс строки, отображаемой в окошечке "Имя файла". Например значение свойства заданного строкой при FilterIndex=1.

позволит выбрать только текстовые файлы в формате rtf или txt. В окошечке "Тип файла" будет только две строки:

а в окошечке "Имя файла" будет отображена первая.

Свойство InitialDirectory - директория, которая выбирается при старте OpenFileDialog.

Свойство MultiSelect - при значении true позволяет выбрать мышкой при нажатой кнопке Shift или Ctrl несколько файлов и сохранить их имена в свойстве FileNames в виде массива строк.

Свойство ReadOnlyChecked - при значении true позволяет открывать команде OpenFile выбранные файлы только в режиме чтения.

Свойство RestoreDirectory - при true диалоговое окно восстанавливает текущий каталог к первоначальному значению если пользователь изменил каталог при поиске файлов, при false - нет.

Свойство работает только если закрыт поток Stream, созданный методом openFileDialog1.OpenFile().

Свойство ShowHelp - при значении true в окне диалога отображается кнопка "Справка".

Свойство ShowReadOnly - при значении true в окне диалога отображается переключатель "Только для чтения".

Свойство Title - заголовок диалогового окна.

Свойство ValidateNames - при true проверяет допустимость имени для файла применительно к Win32. Никакое заданное по умолчанию в этом случае не добавляется.

Отметим, что ве свойcтва могут быть заданы на этапе проектирования и программно - путем присвоения соответствующих значений.

Загрузка содержимого файла с использованием OpenFileDialog

Filter - rtf файлы (*.rtf)|*.rtf

Пометим в директорию C:\ какой либо файл в формате .rtf (например который был создан в первом разделе "a.tf") и загрузим его в RichTextBox. Для этого напишем в обработчике нажатия кнопки 1 следующий код:

Ели мы выбрали файл C:\a.rtf, то это имя отобразится в заглавии формы.

Если теперь в войстве FileName запишем a.rtf, то при открытии диалога буковка "a" появляется в окошечке "Имя файла" и можно выполнить загрузку не выбирая мышкой файл, а сразу нажав кнопочку "OK".

Дотаточно в войстве FileName записать a.doc и повторить то, что только что проделали выше, как получим предупреждение об отсутствии файла (см Рис.2) и файл уже придется выбирать кликом мышки (кстати, отетим еще раз, что если утановить войство CheckFileExists в false то получим возбуждение иключения).

Рассмотрим еще один способ, который позволяет загружать фйлы в формате .txt. Добавим на форму контрол TextBox и установим его свойство MultiLine в true, в обработчике Form1_Load допишем строку

а cвойству Filter присвоим значение

В обработчике события нажатия кнопки 1 напишем код для чтения текстовых файлов.

Ели прочитаем текстовый файл в формате .rtf, то увидим уже знакомое нам по первому разделу содержимое файла, а при чтении текстового файла в формате .txt именно текст (см Рис.4).

Рис.4 Чтение файлов в формате .rtf(сле) и.txt(спрва) в ткстовом режиме

Параграф 2 Ипользование контрола SaveFileDialog

Основные свойства SaveFileDialog

Следует отметить, что все свойства отображаемые в окне Proporties для SaveFileDialog аналогичны OpenFileDialog и имеют тоже назначение и тот же принцип использования, и, поэтому, в отдельном их расмотрении нет необходимости.

Сохранение информации в файл с использованием SaveFileDialog

Filter - rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt

Последнее актуально именно для SaveFileDialog и позволяет не задавать в окошечке "имя файла" полное имя если файл будет сохраняться как .rtf файл.

На этом шаге рассмотрим стандартное диалоговое окно выбора файлов.

Использование стандартных окон значительно ускоряет разработку тех приложений, в которых необходимо использовать диалоговые окна выбора файлов, шрифта, цвета и т. д. Вместо того чтобы тратить время на разработку своих собственных классов, можно воспользоваться готовыми классами библиотеки Qt. К достоинствам стандартных диалоговых окон можно отнести и целостность пользовательского интерфейса, т. к. вид окон во всех приложениях, их использующих, будет один и тот же.

Диалоговое окно выбора файлов предназначено для выбора одного или нескольких файлов, а также файлов, находящихся на удаленном компьютере, и поддерживает возможность переименования файлов и создания каталогов.

Класс QFileDialog предоставляет реализацию диалогового окна выбора файлов (рис. 1) и отвечает за создание и работоспособность сразу трех диалоговых окон. Одно из них позволяет осуществлять выбор файла для откры-тия, второе предназначено для выбора пути и имени файла для его сохранения, а третье — для выбора каталога.


Рис.1. Диалоговое окно выбора файлов

Класс QFileDialog унаследован от класса QDialog. Его определение находится в файле QFileDialog.

Этот класс предоставляет следующие статические методы:

  • getOpenFileName() — создает диалоговое окно выбора одного файла. Этот метод возвращает значение типа QString, содержащее имя и путь выбранного файла (см. рис. 1);
  • getOpenFileNames() — создает диалоговое окно выбора нескольких файлов. Возвращает список строк типа QStringList, содержащих пути и имена файлов;
  • getSaveFileName() — создает диалоговое окно сохранения файла. Возвращает имя и путь файла в строковой переменной типа QString;
  • getExistingDirectory() — создает окно выбора каталога. Этот метод возвращает значение типа QString, содержащее имя и путь выбранного каталога.

Первым параметром этих методов является указатель на объект-предок, вторым передается текст заголовка окна, третьим — строка, представляющая собой рабочий каталог.

Вызов метода getOpenFileName() запустит диалоговое окно открытия файла (см. рис. 1). Четвертый параметр, передаваемый в этот метод, представляет собой фильтр (или маску), задающий расширение файлов. Например:

Покажем, как можно использовать статический метод getSaveFileName(), предназначенный для диалогового окна записи файла.

Файлы приложения можно взять здесь.

При помощи метода getExistingDirectory() можно предоставить пользователю возможность выбора каталога (рис. 2). Например:


Рис.2. Диалоговое окно выбора папки

Файлы приложения можно взять здесь.

На следующем шаге рассмотрим cтандартное диалоговое окно настройки принтера.

Читайте также: