Учебное пособие (1077022), страница 28
Текст из файла (страница 28)
Это облегчает тестирование алгоритмов и позволяет использоватьих в различных приложениях, например в Windows Forms и ASP.NETMVC.Добавим в файл, содержащий обработчики событий, поле дляхранения текущего состояния таймера и метод обновления текущегосостояния таймера:/// <summary>/// Текущее состояние таймера/// </summary>TimeSpan currentTimer = new TimeSpan();/// <summary>/// Обновление текущего состояния таймера/// </summary>private void RefreshTimer(){//Обновление поля таймера в формеtextTimer.Text = currentTimer.ToString();}Для формы введем обработчик события по загрузке формы. Событие вокне свойств приведено на рис. 34.228Рис.
34. Обработчик события по загрузке формы.Для добавления обработчика события необходимо дважды щелкнутьлевой клавишей мыши на строку Load.При загрузке формы выводится начальное (нулевое) значениетаймера:private void Form1_Load(object sender, EventArgs e){//Обновление текущего состояния таймераRefreshTimer();}Обработчик события Load очень часто используется в формах. В немвыполняются действия, которые следует реализовать в только чтоотображенной форме.Добавим код обработчиков событий таймера и кнопок (каждая срокакода откомментирована):private void timer1_Tick(object sender, EventArgs e){//Добавление к текущему состоянию таймера//интервала в одну секундуcurrentTimer = currentTimer.Add(new TimeSpan(0, 0, 1));//Обновление текущего состояния таймераRefreshTimer();}private void buttonStartTimer_Click(object sender, EventArgs e){//Запуск таймераtimer1.Start();}private void buttonStopTimer_Click(object sender, EventArgs e){//Остановка таймераtimer1.Stop();}private void buttonClearTimer_Click(object sender, EventArgs e){//Остановка таймера229timer1.Stop();//Сброс текущего состояния таймераcurrentTimer = new TimeSpan();//Обновление текущего состояния таймераRefreshTimer();}Пример работы таймера представлен на рис.
35. При загрузке формы вполе таймера отображаются нулевые значения: «00:00:00». Кнопка«Старт» запускает таймер, кнопка «Стоп» останавливает таймер (но несбрасывает его значение), кнопка «Сброс» останавливает таймер исбрасывает его значение.Рис. 35. Пример работы таймера.11.4 Пример открытия дочерних оконВ большинстве случаев приложения Windows Forms содержат болееодного окна.
В данном разделе мы научимся добавлять и открывать новыеокна.Для добавления нового окна необходимо нажать правую кнопкумыши на проекте и выбрать пункт меню «Добавить/Создать элемент» (рис.36).230Рис. 36. Добавление формы – шаг 1.В появившемся меню необходимо выбрать элемент «Форма WindowsForms» и нажать кнопку «Добавить» (на рис. 37).Рис. 37. Добавление формы – шаг 2.Для добавляемой формы можно указать имя формы (имя классаформы, которое совпадает с именем файла), в данном примере Form2.cs.Если приложение содержит несколько форм, то Windows Formsдолжен каким-то образом определить первую запускаемую форму.
Этодействие задается в файле Program.cs:using System;using System.Windows.Forms;namespace WindowsFormsApplication1{231static class Program{/// <summary>/// Главная точка входа для приложения./// </summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}}}Для приложений Windows Forms метод Main класса Program содержиткод для запуска начальной формы. Если в методе Application.Run заменитьForm1 на Form2, то при запуске приложения первой будет открыватьсяForm2.Добавим на форму 1 четыре кнопки: Button (Name = «buttonOpenNonModal», Text = «Открытьнемодальное окно»); Button (Name = «buttonOpenModal», Text = «Открыть модальноеокно»); Button (Name = «buttonClose», Text = «Закрыть окно»); Button (Name = «buttonExit», Text = «Закрыть приложение»).Внешний вид формы 1 после добавления кнопок показан на рис.
38.Рис. 38. Добавление кнопок открытия и закрытия окна.232Немодальное окно – это обычное окно приложения, с которымработает пользователь. Если открыть несколько немодальных окон, томежду ними возможно переключение фокуса ввода.Модальное окно – это окно, которое пользователь должен закрытьперед продолжением работы. Если открыто модальное окно, топереключение фокуса ввода в другие окна невозможно. Модальные окнатакже называют диалоговыми.Рассмотренные ранее окна сообщений, создаваемые с помощьюкласса MessageBox, являются модальными окнами.Добавим обработчики событий для кнопок.Кнопка «Открыть немодальное окно»:private void buttonOpenNonModal_Click(object sender, EventArgs e){Form2 f2 = new Form2();f2.Show();}Для открытия дочернего окна необходимо сначала создать новыйобъект соответствующего класса.
При открытии нескольких окон нужнокаждый раз создавать новый объект класса, потому что в каждое окномогут быть введены различные данные.Далее с помощью метода Show можно открыть окно в немодальномрежиме. При многократном нажатии на кнопку «Открыть немодальноеокно» можно открыть произвольное количество дочерних окон.Кнопка «Открыть модальное окно»:private void buttonOpenModal_Click(object sender, EventArgs e){Form2 f2 = new Form2();f2.ShowDialog();}С помощью метода ShowDialog можно открыть окно в модальномрежиме. При этом невозможно вернуться в форму 1 (она не получитфокус) до тех пор, пока не будет закрыта форма 2.233Многократное нажатие на кнопку «Открыть модальное окно»невозможно, так как при первом же нажатии открывается модальное окно,которое необходимо закрыть перед продолжением работы.Кнопка «Закрыть окно»:private void buttonClose_Click(object sender, EventArgs e){this.Close();}Эта кнопка вызывает метод Close для текущего объекта, что приводитк закрытию окна.Кнопка «Закрыть приложение»:private void buttonExit_Click(object sender, EventArgs e){Application.Exit();}Данная кнопка вызывает метод Exit для статического классаApplication, что приводит к закрытию приложения.
Класс Applicationотвечает за приложение Windows Forms.Отметим, что кнопки «Закрыть окно» и «Закрыть приложение»работают одинаково для главной формы и приводят к закрытиюприложения.Добавим данные кнопки на форму 2. Внешний вид формы 2 последобавления кнопок показан на рис. 39.Рис. 39. Добавление кнопок открытия и закрытия окна.Обработчики событий кнопок совпадают с обработчиками событий вформе 1:private void buttonClose_Click(object sender, EventArgs e){this.Close();}234private void buttonExit_Click(object sender, EventArgs e){Application.Exit();}Однако поведение кнопок в дочерней форме будет отличаться от ихповедения в родительской форме.Ключевое слово this в данном случае означает текущий объект формы2.
Поэтому при нажатии на кнопку «Закрыть окно» будет закрыватьсяформа 2.Но при нажатии на кнопку «Закрыть приложение» будет закрыватьсявсе приложение.Добавим для формы 2 обработчики событий FormClosing иFormClosed, как показано на рис. 40.Рис. 40. Обработчики событий FormClosing и FormClosed.Данные события также довольно часто используются в WindowsForms.Событие FormClosed возникает, когда окно уже считается закрытым.Обработчик события:235private void Form2_FormClosed(object sender, FormClosedEventArgs e){MessageBox.Show("Форма 2 закрылась!");}Событие FormClosing возникает перед закрытием окна, в данномобработчике можно отменить закрытие окна.
Обработчик события:private void Form2_FormClosing(object sender, FormClosingEventArgs e){//Вывод диалогового окнаDialogResult result = MessageBox.Show("Вы действительно хотите закрыть форму 2?","Уважаемый пользователь", MessageBoxButtons.YesNo, MessageBoxIcon.Question);//Отмена закрытия окнаif (result == DialogResult.No){e.Cancel = true;}}В данном примере метод MessageBox.Show открывает диалоговоеокно в виде вопроса. Пользователь может выбрать кнопки «Да» или «Нет».Если он выбирает «Нет» то свойство e.Cancel (e – параметр метода)устанавливается в true, что приводит к отмене стандартного обработчикасобытия и окно не закрывается.Результаты работы показаны на рис.
41 и 42.Рис. 41. Результат работы обработчика событий FormClosing.236Рис. 42. Результат работы обработчика событий FormClosed.11.5 Контрольные вопросы к разделу 111. Как создать приложение Windows Forms?2. Как используется элемент Button?3. Как применяется элемент TextBox?4. Как используется элемент Label?5. Как применяется элемент Timer?6.
Какзадатьформу,котораяоткрываетсяпризапускеприложения?7. Как открыть модальное окно?8. Как открыть немодальное окно?9. Как закрыть окно и приложение?10.Для чего используются события FormClosed и FormClosing?12 Примермногопоточногопоискавтекстовомфайле с использованием технологии WindowsFormsВ данном разделе пособия мы реализуем комплексный пример,который обобщает предыдущие примеры.237Пример реализован с использованием технологии Windows Forms. Онвыполняет следующие действия: Запрашиваетимятекстовогофайладляпоискасиспользованием стандартного диалога открытия файла. Вводит слово для поиска. Реализует четкий (без учета опечаток) поиск слова в файле.Найденное слово (которое может встретиться в файле несколькораз) выводится в результирующий список. Реализуетнечеткий(наосноверасстоянияДамерау-Левенштейна) многопоточный поиск в файле.
При этомвводится максимальное расстояние для нечеткого поиска, накоторое искомое слово может отличаться от слова в файле.Также вводится количество потоков, на которое разделяетсямассив слов исходного файла. Найденное слово (которое можетвстретитьсяврезультирующийфайленесколькосписоксуказаниемраз)выводитсяномерапотокавивычисленного расстояния Дамерау-Левенштейна. По результатам поиска формируется отчет в виде текстовогофайла в формате HTML.
Выбор имени файла при сохранениипроводится с использованием стандартного диалога сохраненияфайла.Рассмотрим данное приложение в виде фрагментов примера 18.Приложение реализовано с использованием одной формы, котораяпоказана на рис. 43.238Рис. 43. Форма многопоточного поиска в текстовом файле.12.1 Чтение информации из текстового файлаПри нажатии на кнопку «Чтение из файла» выполняется чтениеинформации из текстового файла.Для хранения списка слов, прочитанных из файла, в классе Form1используется поле list:/// <summary>/// Список слов/// </summary>List<string> list = new List<string>();Рассмотрим код обработчика кнопки:private void buttonLoadFile_Click(object sender, EventArgs e){OpenFileDialog fd = new OpenFileDialog();fd.Filter = "текстовые файлы|*.txt";if (fd.ShowDialog() == DialogResult.OK){239Stopwatch t = new Stopwatch();t.Start();//Чтение файла в виде строкиstring text = File.ReadAllText(fd.FileName);//Разделительные символы для чтения из файлаchar[] separators =new char[] {' ','.',',','!','?','/','\t','\n'};string[] textArray = text.Split(separators);foreach (string strTemp in textArray){//Удаление пробелов в начале и конце строкиstring str = strTemp.Trim();//Добавление строки в список, если строка не содержитсяв спискеif (!list.Contains(str)) list.Add(str);}t.Stop();this.textBoxFileReadTime.Text = t.Elapsed.ToString();this.textBoxFileReadCount.Text = list.Count.ToString();}else{MessageBox.Show(«Необходимо выбрать файл»);}}Для выбора текстового файла используется класс OpenFileDialog,который реализует стандартный диалог открытия файла.















