Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2009 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Лекция 5:

Работа с файлами и каталогами

В этом коде скрыт один коварный нюанс, на который следует обратить внимание. Дело в том, что текстовое поле способно принимать сколь угодно длинные тексты. А в нашем коде обработчика result_TextChanged набор цифр преобразуется в целый тип Int32, имеющий конечную длину. Соответственно, длинный ввод пользователя может вызвать исключение. Не погружаясь глубоко в эту проблему, в которой нужно было бы еще учесть операции умножения предельно допустимых значений ввода (или изменить тип int на long ), просто ограничим количество вводимых цифр барьером, способным уместиться в целом типе. Это явно приближенный подход, но просто для примера, только для тренировки!

  • Модифицируйте обработчик txt_KeyPress( ) полей ввода цифр так

Было

private void txt_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            // Запрещаем в текстовом поле лишние символы
            if (!isNumber)
                e.Handled = true;
        }

Стало

private void txt_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            TextBox txtBox = sender as TextBox;// Приведение ссылки 
            int maxLength = int.MaxValue.ToString().Length - 1;// Длина ввода (с запасом)
    
            // Запрещаем в текстовом поле лишние символы 
            // и ограничиваем длину пользовательского ввода
            if (!isNumber || txtBox.Text.Length >= maxLength)
                e.Handled = true;
        }

Теперь осталось запрограммировать кнопку btnExecute и выполнить небольшие действия по сохранению состояния приложения.

  • В режиме Design двойным щелчком на кнопке btnExecute создайте обработчик события по умолчанию, который заполните так
private void btnExecute_Click(object sender, System.EventArgs e)
        {
            String fileName = txtFileName.Text; // Копируем ссылку для удобства
    
            // Заполнено ли текстовое поле
            if (fileName.Length <= 0 || txtDirTarget.Text == String.Empty)
            {
                MessageBox.Show("Вы не задали имя файла или каталога",
                    "Ошибка",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Stop);
                return;
            }
    
            // Есть ли расширение txt
            int pos0 = fileName.LastIndexOf('.');// Ищем с конца
            if (pos0 == -1 || !String.Equals(fileName.Substring(pos0), ".txt"))
            {
                MessageBox.Show("Вы не задали расширение .txt",
                    "Ошибка",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Stop);
                return;
            }
    
            // Не допускать составное имя
            int pos1 = fileName.IndexOf('.');   // Ищем с начала
            if (pos0 != pos1)   // Если точек несколько
            {
                MessageBox.Show("Задайте одно расширение .txt",
                    "Ошибка",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Stop);
                return;
            }
    
            // Добавляем путь = полное имя файла
            fileName = Path.Combine(txtDirTarget.Text, fileName);
    
            if (!File.Exists(fileName))
            {
                FileStream stream = File.Create(fileName);// Создать файл
                stream.Close(); // Освободить ресурс
            }
    
            Console.Clear();    // Очистить консоль
            Random rand = new Random();// Генератор случайных чисел по равномерному закону
            int result;
            StreamWriter writeFile = new StreamWriter(fileName, false, 
                System.Text.ASCIIEncoding.GetEncoding(1251));
            for (int i = 0; i < count; i++)
            {
                result = min + i * step + rand.Next(step);
                Console.WriteLine(result.ToString());   // Выводим на консоль
                writeFile.WriteLine(result.ToString()); // Выводим в файл
            }
            writeFile.WriteLine("--------");    // Отделяем итог
            writeFile.WriteLine(count.ToString() + " шт.");
    
            writeFile.Close();   // Освободить ресурс
        }
  • Запустите приложение - все должно работать

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

  • В режиме Design не меняя размеров формы сдвиньте (стрелкой 'Вниз') кнопку Execute немного вниз
  • Охватите лассо курсора четыре нижних текстовых поля вместе с метками (до 'Имя текстового файла:') и тоже стрелкой 'Вниз' сдвиньте их вниз
  • Выделите текстовую метку 'Имя текстового файла:' вместе с ее полем, выполните Copy и сразу Paste
  • Выделите все пять текстовых полей и щелкните на кнопке Make Vertical Spacing Equal панели инструментов Layout, чтобы равномерно распределить элементы

  • То же самое действие примените к текстовым меткам
  • Настройте новые элементы в соответствии с стаблицей свойств
Таблица 18.15.
Элемент Свойство Значение
Label Text Серия:
TextBox ( Name ) txtSeries
Text Пусто
  • Запустите приложение - интерфейс должен выглядеть примерно так

Теперь осталось включить значение серии в вывод программы.

  • Отредактируйте фрагмент кода обработчика btnExecute_Click( ) так

Было

for (int i = 0; i < count; i++)
       {
       		result = min + i * step + rand.Next(step);
               Console.WriteLine(result.ToString());   // Выводим на консоль
               writeFile.WriteLine(result.ToString()); // Выводим в файл
	}

Стало

for (int i = 0; i < count; i++)
       	{
		result = min + i * step + rand.Next(step);
               Console.WriteLine(txtSeries.Text.Trim() + result.ToString());   // Выводим на консоль
               writeFile.WriteLine(txtSeries.Text.Trim() + result.ToString()); // Выводим в файл
	}
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?