|
При выполнении в лабораторной работе упражнения №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()); // Выводим в файл
}


