Чтение из файла и StreamReader
Класс StreamReader позволяет нам легко считывать весь текст или отдельные строки из текстового файла. Среди его методов можно выделить следующие:
- Close: закрывает считываемый файл и освобождает все ресурсы
- Peek: возвращает следующий доступный символ, если символов больше нет, то возвращает -1
- Read: считывает и возвращает следующий символ в численном представлении. Имеет перегруженную версию: Read(char[] array, int index, int count), где array - массив, куда считываются символы, index - индекс в массиве array, начиная с которого записываются считываемые символы, и count - максимальное количество считываемых символов
- ReadLine: считывает одну строку в файле
- ReadToEnd: считывает весь текст из файла
Считаем текст из файла построчно:
string path = @"C:\hta.txt";
string line;
Console.WriteLine("******считываем построчно********");
StreamReader sr = new StreamReader(path, System.Text.Encoding.Default);
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
Обратите внимание, что в последних двух случаях в конструкторе StreamReader указывалась кодировка System.Text.Encoding.Default. Свойство Default класса Encoding получает кодировку для текущей кодовой страницы ANSI. Также через другие свойства мы можем указать другие кодировки. Если кодировка не указана, то при чтении используется UTF8. Иногда важно указывать кодировку, так как она может отличаться от UTF8, и тогда мы получим некорректный вывод.
Запись в файл и StreamWriter
Для записи в текстовый файл используется класс StreamWriter. Свою функциональность он реализует через следующие методы:
- Close: закрывает записываемый файл и освобождает все ресурсы
- Flush: записывает в файл оставшиеся в буфере данные и очищает буфер.
- Write: записывает в файл данные простейших типов, как int, double, char, string и т.д.
- WriteLine: также записывает данные, только после записи добавляет в файл символ окончания строки
Рассмотрим запись в файл на примере:
string path = @"C:\hta.txt";
StreamWriter sw = new StreamWriter(path, true, System.Text.Encoding.Default);
sw.WriteLine("123");
sw.Close();
Класс StreamWriter имеет несколько конструкторов. Здесь мы использовали один из них: new StreamWriter(writePath, false, System.Text.Encoding.Default). В качестве первого параметра передается путь к записываемому файлу. Второй параметр представляет булевую переменную, которая определяет, будет файл дозаписываться или перезаписываться. Если этот параметр равен true, то новые данные добавляются в конце к уже имеющимся данным. Если false, то файл перезаписывается. И если в первом случае файл перезаписывается, то во втором делается дозапись в конец файла.
Третий параметр указывает кодировку, в которой записывается файл.
Введение в Windows forms
Windows Forms позволяет разрабатывать приложения с полнофункциональным графическим интерфейсом. Для работы с WF необходимо создать проект. Основные окна проекта:
Обозреватель решений – показывает структуру проекта;
Графический дизайнер формы – позволяет создавать интерфейс;
Панель элементов – готовые компоненты для оформления интерфейса;
Окно свойств – позволяет настроить свойства элементов интерфейса.
Рассмотрим структуру проекта. Несмотря на то, что при создании проекта мы видим только главную форму, проект имеет и несколько компонентов:
Стартовой точкой входа в графическое приложение является класс Program, расположенный в файле Program.cs
Сначала программой запускается данный класс, затем с помощью выражения Application.Run(new Form1()) он запускает форму Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий класс формы.
В структуре проекта есть файл Form1.Designer.cs. Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose(), который выполняет роль деструктора объекта, иInitializeComponent(), который устанавливает начальные значения свойств формы.
При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.
Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции - установка свойств объектов, установка переменных.
Еще один файл - Form1.resx - хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для нескольких языковых культур.
И более важный файл - Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы. По умолчанию здесь есть только конструктор формы, в котором просто вызывается метод InitializeComponent(), объявленный в файле дизайнера Form1.Designer.cs. Именно с этим файлом мы и будем больше работать.
ФОРМЫ
Основным объектом для построения интерфейса являются формы. Каждой графической форме соответствует некоторый код, который представляет из себя класс с таким же именем как и имя формы, являющийся потомком класса Form. Также необходимо подключение пространства имен System.Windows.Forms
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Основные свойства формы:
Большинство этих свойств оказывает влияние на визуальное отображение формы. Пробежимся по основным свойствам:
· Name: устанавливает имя формы - точнее имя класса, который наследуется от класса Form
· BackColor: указывает на фоновый цвет формы. Щелкнув на это свойство, мы сможем выбрать тот цвет, который нам подходит из списка предложенных цветов или цветовой палитры
· BackgroundImage: указывает на фоновое изображение формы
· BackgroundImageLayout: определяет, как изображение, заданное в свойстве BackgroundImage, будет располагаться на форме.
· ControlBox: указывает, отображается ли меню формы. В данном случае под меню понимается меню самого верхнего уровня, где находятся иконка приложения, заголовок формы, а также кнопки минимизации формы и крестик. Если данное свойство имеет значение false, то мы не увидим ни иконку, ни крестика, с помощью которого обычно закрывается форма
· Cursor: определяет тип курсора, который используется на форме
· Enabled: если данное свойство имеет значение false, то она не сможет получать ввод от пользователя, то есть мы не сможем нажать на кнопки, ввести текст в текстовые поля и т.д.
· Font: задает шрифт для всей формы и всех помещенных на нее элементов управления. Однако, задав у элементов формы свой шрифт, мы можем тем самым переопределить его
· ForeColor: цвет шрифта на форме
· FormBorderStyle: указывает, как будет отображаться граница формы и строка заголовка. Устанавливая данное свойство в None можно создавать внешний вид приложения произвольной формы
· HelpButton: указывает, отображается ли кнопка справки формы
· Icon: задает иконку формы
· Location: определяет положение по отношению к верхнему левому углу экрана, если для свойства StartPosition установлено значение Manual
· MaximizeBox: указывает, будет ли доступна кнопка максимизации окна в заголовке формы
· MinimizeBox: указывает, будет ли доступна кнопка минимизации окна
· MaximumSize: задает максимальный размер формы
· MinimumSize: задает минимальный размер формы
· Opacity: задает прозрачность формы
· Size: определяет начальный размер формы
· StartPosition: указывает на начальную позицию, с которой форма появляется на экране
· Text: определяет заголовок формы
· TopMost: если данное свойство имеет значение true, то форма всегда будет находиться поверх других окон
· Visible: видима ли форма, если мы хотим скрыть форму от пользователя, то можем задать данному свойству значение false
· WindowState: указывает, в каком состоянии форма будет находиться при запуске: в нормальном, максимизированном или минимизированном
Мы можем изменять свойства формы непосредственно в окне свойств, а можем изменять их программно. Для этого в программном коде после инициализации свойств можно прописать и собственные значения:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HelloApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Text = "Hello World!";
this.BackColor = Color.Aquamarine;
this.Width = 250;
this.Height = 250;
//размер
this.Size = new Size(200,150);
//начальная позиция
this.StartPosition = FormStartPosition.CenterScreen;
//фон и цвета формы
this.BackColor = Color.Aquamarine;
this.ForeColor = Color.Red;
//изображение в качестве фона
this.BackgroundImage = Image.FromFile("C:\Users\Eugene\Pictures\3332.jpg");
}
}
}
Кроме свойств компонент с программированием в WF тесно связан механизм событий. Он служит для связи с пользователем программы.
В WinForms есть некоторый стандартный набор событий, который по большей части имеется у всех визуальных компонентов.
Чтобы посмотреть все события элемента, нам надо выбрать этот элемент в поле графического дизайнера и перейти к вкладке событий на панели форм.
В системе Windows к событиям можно отнести нажатие кнопкой мыши, нажатие клавиши и т.п.
Каждому событию соответствует некоторая функция, код которой выполняется в случае наступления события. Добавление же обработчика, созданного таким образом, производится в файле Form1.Designer.cs. Поэтому если мы захотим удалить созданный подобным образом обработчик, то нам надо не только удалить метод из кода формы в Form1.cs, но и удалить добавление обработчика в этом файле.
Рассмотрим основные события формы.
Load – Происходит до первоначального отображения формы, т.е. при загрузке формы.
FormClosed – Происходит после закрытия формы.
FormClosing – Происходит до закрытия формы.
Click – Происходит при щелчке мыши
DoubleClick – Происходит при двойном щелчке мыши.
Добавление форм.
В проекте может быть не одна форма. Добавить форму можно следующим образом:
Взаимосвязь между формами организовывают следующим образом:
В форме-родителе в соответствующем обработчике события создают объект класса дочерней формы и применяют метод Show()
Form2 newForm = new Form2();
newForm.Show();
В данном случае дочерняя форма не знает о существовании родительской. Чтобы это исправить, надо дочерней форме как-то передать сведения о родительской форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.
Итак перейдем ко второй форме и перейдем к ее коду - нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и содержит только конструктор. Поскольку C# поддерживает переопределение методов, то мы можем создать несколько методов и конструкторов с разными параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public Form2(Form1 f) { InitializeComponent(); f.BackColor = Color.Yellow; } } } |
Фактически мы только добавили здесь новый конструктор public Form2(Form1 f), в котором мы получаем первую форму и устанавливаем ее фон в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:
private void button1_Click(object sender, EventArgs e) { Form2 newForm = new Form2(this); newForm.Show(); } |
Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект - объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.
Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.
Мы можем также создавать объекты и текущей формы:
private void button1_Click(object sender, EventArgs e) { Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); } |
При работе с несколькими формами надо учитывать, что одна из них является главной – которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.