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

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

    Компонент находится в списке All Windows Forms (Все формы Windows Forms) палитры компонентов Он предназначен для выбора файлов, выводит на экран стандартное окно Windows для выбора и открытия файлов.

    Чтобы начать диалог по поиску файла, надо использовать метод ShowDialog(). Если установить свойство MultiSelect в True, to можно выбрать группу файлов. Можно воспользоваться свойством ShowReadOnly, которое дает возможность появиться галочке рядом с файлом, если он имеет тип "только для чтения".

    Свойство Filter задает условие фильтрации файлов (чтобы выбирались только те, которые указаны в фильтре).

    Компонент при добавлении в форму не появляется в форме, а помещается в специальный поддон, расположенный в нижней части окна дизайнера форм (как и многие другие компонеты: ImageList, Timer и др.). Кстати, если требуется открыть папку вместо файла, то следует воспользоваться классом FolderBrowserDialog.

    Диалоговое окно для выбора файла появляется в режиме исполнения приложения в момент выполнения метода ShowDialog(). Когда пользователь закрывает это диалоговое окно, метод ShowDialog() возвращает значение DialogResult, по которому можно определить, каким образом произошло это закрытие. Если пользователь воспользовался кнопкой OK, то сравнивая его с соответствующем значением, определяем, что пользователь выбрал нужный файл. Имя выбранного файла поместится в свойство компонента FileName, откуда его можно в дальнейшем брать и использовать по назначению.

    Форма в режиме разработки приложения показана на рисунке 1.


Рис.1. Форма в режиме разработки приложения

    Строка фильтра в свойстве Filter задается по правилам, видным из следующего примера:

  Text files (*.txt)|*.txt|All files (*.*)|*.*

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

    Например, если задать, чтобы высветились все текстовые файлы и все файлы Word, то в этом случае строка фильтра будет такой:

  Text Files (*.txt)|*.txt|Word Files (*.doc)|*.doc
а в поле типов файлов будет две строки (рисунок 2):


Рис.2. Типы файлов, определяемые свойством Filter

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

  Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*

    Перечень свойств компонента OpenFileDialog показан на рисунке 3.


Рис.3. Свойства компонента OpenFileDialog

    Кратко остановимся на некоторых из них.

    Приведем текст приложения, которое позволяет выбрать текстовый файл и загрузить его содержимое. Текст h-файла приводится ниже (в текст добавлена функция, переводящая тип String^ в char*, т. к. текстовые файлы были подготовлены в коде ASCII).

 #pragma once

namespace pr190_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;
	/// <summary>
	/// Сводка для Form1

.   .   .   .   .   .
	private: System::Windows::Forms::Button^  button2;
	private: System::Windows::Forms::OpenFileDialog^  openFileDialog1;

	private:
		/// <summary>
		/// Требуется переменная конструктора.
		//==========================================================
		char*  StrToChar(String^ str) {
			cli::pin_ptr<const wchar_t> wch = PtrToStringChars(str);
			size_t convertedChars = 0;
			size_t sizeInBytes = ((str->Length +1) * 2);
			errno_t err = 0;
			char* ch = (char *)malloc(sizeInBytes);
			err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, 
                             sizeInBytes); 
			if (err != 0)
				MessageBox::Show("wcstombs_s failed!\n"); 
			return(ch); 
		}
		void LoadFromFile(char* File, ListBox^ lb) {
			char s[300]; 
			FILE *fp;
			int i = 0;
			lb->Items->Clear();
			if (! (fp=fopen(File, "r")))
			{
				MessageBox::Show("Ошибка открытия файла", 
					"Компонент OpenFileDialog",
					MessageBoxButtons::OK,
					MessageBoxIcon::Asterisk); 
				return;
			}
                        fgets(s, 300, fp); 
			while(!feof(fp))
			{
				String ^dd = gcnew String(s); 
				// этот способ конвертирования
				// не удаляет последний управляющий символ, 
				// который надо удалить:
				int j = dd->Length-1; 
				dd = dd->Substring(0, j); 
				lb->Items->Add(dd);
                                fgets(s, 300, fp); 
			}
		}
		//==========================================================
		/// </summary>
.   .   .   .   .   .
// Кнопка "Выход"
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
	 Close();
 }
// Кнопка "Выбор файла"
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	 Stream^ s;
	 //ShowDialog() возвращает имя файла в FileName 
	 if(openFileDialog1->ShowDialog() == 
		 System::Windows::Forms::DialogResult::OK) 
	// ShowDialog() возвращает переменную типа DialogResult
	 {
		 if( (s = openFileDialog1->OpenFile()) != nullptr )
		 {
			 //здесь идут операторы чтения файла из потока
			 String^ a = openFileDialog1->FileName;
			 char *ss = StrToChar(a); 
			 LoadFromFile(ss, listBox1);
		 }
		 else MessageBox::Show("Ошибка открытия файла");
	 }
 }

    Включение заголовочных файлов в файле cpp:

// pr190_1.cpp: главный файл проекта.

#include "stdafx.h"

#include <io.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <share.h> 
#include <stdlib.h> 
#include <vcclr.h> 

#include "Form1.h"

using namespace pr190_1;
.   .   .   .   .
Архив проекта можно взять здесь.

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


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

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




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