Разработка gui. Создание sdiприложений обработка событий
Скачать 361.78 Kb.
|
Операции ввода/вывода данных в .NЕТПоток – это перенос данных между программой и любым устрой- ством ввода/вывода. Данные могут рассматриваться как поток байтов, символов или объектов. В пространстве имен System.IO есть не- сколько классов, позволяющих использовать различные устройства хранения, если только данные можно трактовать как байты или сим- волы. Потоковые классы. Stream — абстрактный класс, который явля- ется базовым для чтения и записи байтов в некоторое хранилище дан- ных. Этот класс поддерживает синхронные и асинхронные чтение и запись. Класс Stream содержит типичные методы: Read , Write, Seek, Flush и Close. Класс FileStream, который является производным от класса Stream, предоставляет операции чтения и записи последовательности байтов в файл. Конструктор FileStream создает экземпляр потока. Перегружен- ные методы класса Stream осуществляют чтение и запись в файл. У класса Stream есть и другие производные классы: MemoryStream, BufferedStream и NetworkStream (в System.Net.Sockets). Программа 1. Запись и чтение 10 байтов в/из файл(а). Пример вы- полнить дважды. Первый раз программа создаст файл и запишет в него числа, а во второй раз прочитает и распечатает часть файла using System.IO; void Main() { byte [] data = new byte [10]; FileStream fs = new FileStream( "FileStreamTest.txt", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); for (short i = 0; i < 10; i++) data[i] = (byte)i; fs.Write(data, 0, 10); // Запись данных } else { fs.Seek(-5, SeekOrigin.End); // Ищем конец int count = fs.Read(data, 0, 10); // Чтение данных for (int i = 0; i < count; i++) Console.WriteLine(data[i]); } fs.Close(); } Встроенные типы данных и потоки. Если необходимо прочитать в поток или записать из потока простой тип, такой как Boolean, String или Int32, следует использовать классы BinaryReader и BinaryWriter. Нужно создать соответствующий поток (напимер, FileStream) и пере- дать его в качестве параметра в конструктор BinaryReader или BinaryWriter. Потом можно использовать один из перегруженных ме- тодов Read или Write для чтения данных из потока или записи данных в поток. Программа 2. Запись и чтение 10 чисел в/из файл(а). Пример вы- полнить дважды. Сначала файл создается, и в него записываются дан- ные. Во второй раз данные читаются из файла. void Main() { FileStream fs = new FileStream( "BinaryTest.bin", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); BinaryWriter w = new BinaryWriter(fs); for (short i = 0; i < 10; i++) w.Write(i); // Запись w.Close () ; } else { BinaryReader r = new BinaryReader(fs); for (int i = 0; i < 10; i++) Console.WriteLine(r.ReadInt16()); r.Close(); } fs.Close(); } Классы TextReader и TextWriter. В абстрактных классах TextReader и TextWriter данные рассматриваются как последователь- ный поток символов (текст). TextReader имеет следующие методы: Close, Peek (Считывание элемента данных), Read, ReadBlock, ReadLine и ReadToEnd. TextWriter содержит методы типа Close, Flush, Write и WriteLine. Перегруженные методы Read читают символы из потока. Классы_StringReader_и_StringWriter'>Классы StringReader и StringWriter являются производными классами от классов TextReader и TextWriter соответственно. StringReader и StringWriter читают и записывают данные в символьную строку, которая сохраняется в базовом объекте StringBuilder. Конст- руктор StringWriter может принимать объект StringBuilder. Классы StreamReader и StreamWriter также являются производ- ными классами от классов TextReader и TextWriter. Они читают текст из объекта и записывают текст в объект Stream. Можно создать объект Stream и передать его в конструктор StreamReader или StreamWriter. Программа 3. Запись и чтение символьных строк в/из файл(а). Программу выполнить дважды: первый раз – чтобы создать файл, а затем второй раз – чтобы прочитать его. void Main() { FileStream fs = new FileStream( "TextTest.txt", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); // Запись данных StreamWriter sw = new StreamWriter(fs); sw.Write(100); // Запись sw.WriteLine(" One Hundred"); // Сто sw.WriteLine("End of File"); // Конец Файла sw.Close(); } else { String text; // Строка StreamReader sr = new StreamReader(fs) ; text = sr.ReadLine(); // текст while (text != null) { Console.WriteLine(text); text = sr.ReadLine(); } sr.Close (); } fs.Close (); } Классы File и FileInfo. Класс File содержит методы для создания и открытия файлов, которые возвращают объекты FileStream, StreamWri- ter или StreamReader, производящие фактическое чтение и запись. Пе- регруженный метод Create возвращает объект FileStream. Метод CreateText возвращает StreamWriter. Перегруженный метод Open в за- висимости от передаваемых параметров может создавать новый файл или открывать существующий для чтения или записи. Возвращаемый объект – объект FileStream. Метод OpenText возвращает StreamReader. Метод OpenRead возвращает объект FileStream. Метод OpenWrite воз- вращает объект типа FileStream. Классы File и FileInfo содержат также методы копирования, удале- ния, перемещения файлов, проверки существования файла, чтения и изменения атрибутов файла (время создания; время последнего обра- щения; последнее время записи; архивный, скрытый, обычный, сис- темный или временный; сжатый, зашифрованный; только для чтения; файл или каталог). Программа 4. Пример использования методов класса File и FileIn- fo. void Main() { File.Delete("file2.txt"); // Удалить файл "file2.txt" StreamWriter sw = System.IO.File.CreateText("file.txt"); sw.Write ("Пусть каждый день твой будет светлым, "); sw.WriteLine("приятным, радостным и щедрым!"); sw.Close(); File.Move("file.txt", "file2.txt"); // Переименование FileInfo fileInfo = new FileInfo("file2.txt"); Console.WriteLine( "File {0} is {1} bytes in length, created on {2}", fileInfo.FullName,fileInfo.Length, fileInfo.CreationTime); Console.WriteLine(""); StreamReader sr = fileInfo.OpenText(); String s = sr.ReadLine(); while (s != null) { Console.WriteLine(s); s = sr.ReadLine(); } sr.Close(); } Сериализация объектов. Сериализация преобразовывает объекты, такие как классы, структуры и массивы в поток байтов. При преобра- зовании из последовательной формы в параллельную поток байтов преобразовывается обратно в объекты. Сериализация может осуществляться в двух форматах: бинарном и XML-формате. Пространство имен System.Runtime. Serialization ис- пользуется для сериализации в общей системе типов. Пространство имен System.Xml.Serialization используется для сериализации XML- документов. Чтобы информировать каркас, что класс может быть преобразован в последовательную форму, нужно пометить класс атрибутом [Serializable]. Любое поле или свойство, которые не должны быть пре- образованы в последовательную форму, могут быть отмечены атрибу- том [NonSerialized]. [Serializable] // Объявление сериализации объектов класса public class Personage{ public Personage(string name, int age) { this.name = name; this.age = age; } static int wishes; public string name, status, wealth; int age; public Personage couple; void SaveState(){ //сериализация в бинарном формате BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream ("State.bin",FileMode.Create, FileAccess.Write); bf.Serialize(fs,this); fs.Close(); } void BackState(ref Personage fisher){ //десериализация BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream ("State.bin",FileMode.Open, FileAc- cess.Read); fisher = (Personage)bf.Deserialize(fs); fs.Close(); } } РАЗРАБОТКА МНОГООКОННОГО ПРИЛОЖЕНИЯ Разберем создание MDI (Multiple Document Interface, многодоку- ментный интерфейс) приложений на примере разработки программы «Блокнот». Создайте новое приложение (программа 5) и назовите его NotepadC#. Установите следующие свойства формы (табл. 4.1) Т а б л и ц а 4.1 Свойства формы NotepadC#
Создайте меню приложения со следующими пунктами (рис. 4.1). Для этого вызовите контекстное меню, установив курсор мыши на компоненте menuStrip1, расположенной на панели невидимых компо- нент, и выберите пункт Edit Items. Каждый пункт главного меню имеет свое окно свойств, в котором задаются значения свойств Name и Text (рис. 4.2). В поле Text перед словом New стоит знак & – так называе- мый амперсанд, указывающий, что N должно быть подчеркнуто и бу- дет частью встроенного клавиатурного интерфейса Windows. Когда пользователь на клавиатуре нажимает клавишу Alt и затем N, выво- дится подменю New. Рис. 4.1. Пункты главного меню приложения NotepadC# Рис. 4.2. Свойства пункта меню New Свойства пунктов меню в приложении NotepadC# приводятся в табл. 4.2. Т а б л и ц а 4.2 Пункты главного меню приложения NotepadC#
О к о н ч а н и е т а б л . 4.2
В MDI-приложениях главная форма содержит в себе несколько документов, каждый из которых является холстом в графических про- граммах или полем для текста в редакторах. В окне Solution Explorer щелкаем правой кнопкой на имени проекта и в появившемся контекст- ном меню выбираем Add/New Item/ Windows Form. В появившемся окне называем форму – blank.h. В нашем проекте появилась новая форма – будем называть ее дочерней. В режиме дизайна перетаскива- ем на нее элемент управления RichTextBox, размер содержимого тек- ста в нем не ограничен 64 Кб; кроме того, RichTextBox позволяет ре- дактировать цвет текста, добавлять изображения. Свойству Dock этого элемента устанавливаем значение Fill. Переходим в режим дизайна формы frmmain и устанавливаем свой- ству IsMdiContainer значение true. Цвет формы при этом становится темно-серым. Новые документы будут у нас появляться при нажатии пункта меню New, поэтому дважды щелкаем в этом пункте и перехо- дим в код. При создании нескольких документов будем называть их ДокументN, где N – номер документа. Переключаемся в код формы blank, и в классе blank объявляем поле |