При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Работа с файлами и каталогами
В этом коде скрыт один коварный нюанс, на который следует обратить внимание. Дело в том, что текстовое поле способно принимать сколь угодно длинные тексты. А в нашем коде обработчика 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, чтобы равномерно распределить элементы
- То же самое действие примените к текстовым меткам
- Настройте новые элементы в соответствии с стаблицей свойств
- Запустите приложение - интерфейс должен выглядеть примерно так
Теперь осталось включить значение серии в вывод программы.
- Отредактируйте фрагмент кода обработчика 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()); // Выводим в файл }