Шаг 47.
Microsoft Visual C++ 2010. Начала.
Базовые компоненты. Компонент SaveFileDialog

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

    Компонент SaveFileDialog (рисунок 1) представляет собой стандартное диалоговое окно Сохранить.


Рис.1. Компонент SaveFileDialog

    Свойства компонента приведены в таблице 1.

Таблица 1. Свойства компонента SaveFileDialog
Свойство Описание
Title Текст в заголовке окна. Если значение свойства не задано, то в заголовке отображается текст Сохранить как
FileNane Полное имя файла, которое задал пользователь. В общем случае оно образуется из имени каталога, содержимое которого отображается в диалоговом окне, имени файла, которое пользователь ввел в поле Имя файла, и расширения, заданного значением свойства DefaultExt
DefaultExt Расширение файла по умолчанию. Если пользователь в поле Имя файла не укажет расширение, то к имени файла будет добавлено расширение (при условии, что значение свойства AddExtension равно True), заданное значением этого свойства
InitialDirectory Каталог, содержимое которого отображается при появлении диалога на экране
RestoreDirectory Признак необходимости отображать содержимое каталога, указанного в свойстве InitialDirectory, при каждом появлении окна. Если значение свойства равно False, то при следующем появлении окна отображается содержимое каталога, выбранного пользователем в предыдущий раз
CheckPathExists Признак необходимости проверки существования каталога, в котором следует сохранить файл. Если указанного каталога нет, то выводится информационное сообщение
CheckFileExists Признак необходимости проверки существования файла с заданным именем. Если значение свойства равно True и файл с указанным именем уже существует, появляется окно запроса, в котором пользователь может подтвердить необходимость замены (перезаписи) существующего файла
Filter Свойство задает один или несколько фильтров файлов. В окне отображаются только те файлы, имена которых соответствуют выбранному фильтру. Фильтр задается строкой вида Описание|Маска. Например, фильтр Текст|*.txt задает, что в окне диалога следует отображать только текстовые файлы. Фильтр может состоять из нескольких элементов, например: Текст|*.txt|Все файлы|*.*
FilterIndex Если фильтр состоит из нескольких элементов, например, Текст|*.txt|Все файлы|*.*, то значение свойства задает фильтр, который будет использоваться в момент появления диалога на экране

    Отображение диалога Сохранить обеспечивает метод ShowDialog. Его значением является код клавиши, нажатием которой пользователь завершил диалог (закрыл окно).

    В качестве примера ниже приведен фрагмент программы MEdit - функция SaveText, которая записывает в файл текст, находящийся в поле редактирования.

// изменился текст в поле компонента textBox
private: System::Void textBox1_TextChanged(System::Object^  sender, 
		System::EventArgs^  e) {
 	textChanged = true; // текст изменен
 }

// Записывает текст в файл.
// Возвращает 0 или -1, если пользователь
// в окне Сохранить нажмет кнопку Отмена 
private: int TextToFile()
{
	System::Windows::Forms::DialogResult dr;
	int r = 0;
    
	if (fn == String::Empty)
{
		// это новый документ
		// запросить у пользователя имя файла

		// отобразить диалог Сохранить
		dr = saveFileDialog1->ShowDialog();
		if (dr == System::Windows::Forms::DialogResult::OK)
		{
		
			fn = saveFileDialog1->FileName;
			r = 0;
		}
		else
			// в окне Сохранить пользователь
			// сделал щелчок на кнопке Отмена
			r = -1;			
	}

     // сохранить файл
	if ( r == 0)
	{
		try
		{
			// получим информацию о файле fn
			System::IO::FileInfo^ fi =
				gcnew System::IO::FileInfo(fn);

			// поток для записи
			System::IO::StreamWriter^ sw =
			fi->CreateText();
			sw->Write(textBox1->Text);

			sw->Close(); // закрываем поток
			textChanged = false;
			r = 0;
		}
		catch ( System::IO::IOException^ e)
		{
			MessageBox::Show(e->ToString(),
				"NkEdit",
				MessageBoxButtons::OK,
				MessageBoxIcon::Error);
		}
	}
	return r;
}

// Проверяет, есть ли изменения в тексте и
// сохраняет текст в файле.
// Возвращает:
//   0 или -1, если пользователь
//   отказался от выполнения операции (нажал Cancel)
private: int SaveText()
{
	System::Windows::Forms::DialogResult dr;
		
	int r;
	
	r = 0;
	if (textChanged)
	{		
		dr = MessageBox::Show( 
		"В текст внесены изменения. Сохранить измененный текст?", "NkEdit",
			MessageBoxButtons::YesNoCancel,
			MessageBoxIcon::Warning);
		switch (dr)
		{
			case System::Windows::Forms::DialogResult::Yes:
				r = TextToFile();
				break;
		
			case System::Windows::Forms::DialogResult::No:
				r = 0;
				break;
		
			case System::Windows::Forms::DialogResult::Cancel:
				r = -1;
				break;
		};
	}
	return r;
}
Архив проекта можно взять здесь.

    Обратите внимание, в модуль формы надо вставить ссылку на пространство имен System::IO.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг