Шаг 191.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Компонент SaveFileDialog

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

    Компонент находится в списке All Windows Forms (Все формы Windows Forms) палитры компонентов. С помощью этого компонента можно сохранять файл в нужном месте файловой структуры (так же как это делается в Windows). Но файл сам по себе не сохраняется, т. к. компонент дает только путь к будущему месту расположения файла. На пользователе лежит обязанность самому написать участок программы для сохранения файла. Как и в OpenFileDialog, в этом компоненте применяется метод ShowDialog() для открытия диалогового окна в режме исполнения. Файл можно открыть в режиме чтения/записи, используя метод OpenFile().

    Компонент при добавлении его в форму появляется не в самой форме, а на поддоне, расположенном в нижней части окна дизайнера форм.

    Перечень свойств SaveFileDialog приведен на рисунке 1.


Рис.1. Свойства компонента SaveFileDialog

    Почти все свойства компонента совпадают со свойствами OpenFileDialog. Отметим только свойство OverwritePrompt, которое (если оно установлено в True), вызывает появление диалогового окна Save As (Сохранить как).

    Когда пользователь выбирает имя файла и нажимает на кнопку Save (Сохранить) в диалоговом окне, метод ShowDialog() заносит в свойство FileName компонента имя файла и путь к нему. Никакой перезаписи файла при этом не происходит. Отсюда следует, что для записи файла в необходимое место файловой структуры нужно применять методы сохранения файла. Приведем пример приложения, которое читает строковый файл (текстовый файл в кодировке UTF-8, в котором каждая строка отделена от другой символом "/") и переписывает в другое место под именем, которое мы выбираем в диалоговом окне. Затем файл с целью проверки читается в другое окно. Вид формы приложения в режиме дизайна и исполнения показан на рисунке 2, в режиме выполнения - на рисунке 3. Текст заголовочного файла представлен ниже.

#pragma once

namespace My191_1 {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	using namespace System::IO;  //для ввода/вывода 
	using namespace System::Text;
.   .   .   .   .   .
	private:
		/// <summary>
		/// Требуется переменная конструктора.
		// ===========================================
		void LoadFromFile(String^ File, ListBox^ lb)
		{
			// Этот метод открывает текстовый файл, 
                        // читает все его строки в
			// строку String^ и закрывает файл. 
                        // Строки должны отделяться 
			// друг от друга разделителем "/"
			String^ d, ^b = File::ReadAllText(File); 
			//(надо будет выделять по разделителю "/")
			lb->Items->Clear();
			// Разборка длинной строки на строки, отделенные 
			// друг от друга разделителями
			// Поиск 1-го вхождения подстроки в строку
			int i = b->IndexOf("/");  
			while ( i != -1 )
			{
				d = b->Substring(0, i); 
				lb->Items->Add(d); 
				b = b->Substring( i + 1, b->Length - d->Length - 1);
				i = b->IndexOf("/");  
			}
		}
		// -------------------------------------------
		void SaveToFile(String^ File, ListBox^ lb)
		{
			String^ a, ^b;
			int j = lb->Items->Count; 
			File::Delete(File); 
			for( int i = 0; i < j; i++ )
			{
				// Чтение строк ChekedListBox в а и 
				// формирование длинной строки в b
				a = lb->Items[i]->ToString();
				//добавка разделителя строк
				b += a->Concat(a,"/");  
				// Этот метод открьшает файл, добавляет к нему строку 
				// типа String^, закрывает файл. Если файл не 
				// существует, он создается
			} //for 
			File::AppendAllText(File, b);
		}
		// ===========================================
		/// </summary>
		System::ComponentModel::Container ^components;
.   .   .   .   .   .
// Кнопка "Выход"
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
	 Close();
 }
// Кнопка "Копировать"
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	 // ShowDialog() возвращает имя файла в FileName
	 openFileDialog1->ShowDialog();
	 String ^a = openFileDialog1->FileName;
	 LoadFromFile(a, listBox1);  //Загрузка файла в ListBox1
	 // Выбор имени и пути для выходного файла
	 // с помощью SaveFileDialog
	 // Имя файла будет в FileName
	 saveFileDialog1->ShowDialog();
	 a = saveFileDialog1->FileName;
	 //сохранение файла из Listbox1
	 SaveToFile(a, listBox1);  
	 //чтение сохраненного файла в ListBox2 
	 openFileDialog1->ShowDialog(); 
	 a=openFileDialog1->FileName; 
	 LoadFromFile(a, listBox2);
 }
Архив проекта вместе с файлом примера можно взять здесь.


Рис.3. Результат работы приложения

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




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