Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методич. материалы по КП (Курс 1).doc
Скачиваний:
2
Добавлен:
02.09.2019
Размер:
1.33 Mб
Скачать

Int масш_x, int масш_y, Pen pg)

{

int dy = размер.Height + (min_y-3)*масш_y,

dx = -(min_x-3) * масш_x;

int x1, x2, y1, y2;

SolidBrush br = new SolidBrush(pg.Color);

Font ft = new Font("Batang", 12);

x1 = dx+(точки_x[0])*масш_x;

y1 = dy - (точки_y[0])*масш_y ;

полотно.FillEllipse(br, x1 - 5, y1 - 5, 10, 10);

полотно.DrawString(точки_x[0].ToString() + "; " + точки_y[0].ToString(), ft,

Brushes.Black, x1 + 3, y1);

for (int i = 1; i < точки_x.Length; i++)

{

x2 = dx+ (точки_x[i]) * масш_x;

y2 = dy - (точки_y[i]) * масш_y;

полотно.DrawLine(pg, x1, y1, x2, y2);

полотно.FillEllipse(br, x2 - 5, y2 - 5, 10, 10);

полотно.DrawString(точки_x[i].ToString() + "; " + точки_y[i].ToString(), ft,

Brushes.Black, x2 + 1, y2);

x1 = x2;

y1 = y2;

}

}

}

}

using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

Класс, представляющий стационарные радиостанции

namespace ПроектРадиостанции

{

/// <summary>

/// Класс, представляющий стационарные радиостанции

/// </summary>

[Serializable]

public class Стационарная : Радиостанция

{

private string насел_пункт;

/// <summary>

/// Конструктор класса "Стационарная"

/// </summary>

/// <param name="позывной">Позывной радиостанции</param>

/// <param name="дальность">дальность связи</param>

/// <param name="x">Координата x</param>

/// <param name="y">Координата y</param>

/// <param name="насел_пункт">Насел пункт, в котором расположена радиостанция</param>

public Стационарная(string позывной, int дальность, int x, int y, string насел_пункт)

: base(позывной, дальность, x, y)

{

this.насел_пункт = насел_пункт;

}

/// <summary>

/// Свойство, выдающее значение населенного пункта

/// </summary>

/// <return> Населенный пункт радиостанции</return>

public string Насел_пункт

{get {return насел_пункт;}

}

}

}

Форма Form1.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace ПроектРадиостанции

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

ArrayList база;

ArrayList промежуточные_точки_x;

ArrayList промежуточные_точки_y;

Стационарная сс;

Подвижная пс;

Form2 Радиостанции_И;

Form3 Графики;

string имяЗапись;

string имяЧтение;

FileStream поток;

int k = 1;

private void Form1_Load(object sender, EventArgs e)

{

база = new ArrayList();

dataGridView1.Columns.Add("", "Тип радиостанции");

dataGridView1.Columns.Add("", "Позывной");

dataGridView1.Columns.Add("", "Дальность связи");

dataGridView1.Columns.Add("", "Расположение");

dataGridView1.Columns.Add("", "Населенный пункт");

промежуточные_точки_x = new ArrayList();

промежуточные_точки_y = new ArrayList();

}

/// <summary>

/// Предлагает пользователю сохранить базу данных в файл

/// </summary>

public void save()

{

if (имяЧтение != "") { saveFileDialog1.FileName = имяЧтение; }

DialogResult ответ;

ответ = saveFileDialog1.ShowDialog();

if (ответ == DialogResult.OK)

{

имяЗапись = saveFileDialog1.FileName;

поток = new FileStream(имяЗапись, FileMode.Create);

BinaryFormatter форм = new BinaryFormatter();

форм.Serialize(поток, база);

поток.Close();

Text = имяЗапись + " - Радиостанции";

}

}

/// <summary>

/// Предлагает пользователю сохранить данные перед выходом

/// </summary>

public void exit()

{

DialogResult ответ;

ответ = MessageBox.Show("Сохранить изменения в базе данных?", "ВЫХОД",

MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

if (ответ == DialogResult.Yes) { save(); }

if (ответ == DialogResult.No) { Close(); }

if (ответ == DialogResult.Cancel) { return; }

}

/// <summary>

/// Добавляет в базу данных стационарную радиостанцию

/// </summary>

private void button2_Click(object sender, EventArgs e)

{

try

{

база.Add(new Стационарная(textBox1.Text, (int)numericUpDown1.Value,

int.Parse(textBox2.Text), int.Parse(textBox3.Text), textBox4.Text));

}

catch

{

MessageBox.Show("Должны быть заполнены все поля и в поле 'координаты' должны быть введены только числа!", "Ошибка!");

return;

}

сс = (Стационарная)база[база.Count - 1];

dataGridView1.Rows.Insert(0, 1);

dataGridView1[0, 0].Value = сс.GetType().Name;

dataGridView1[1, 0].Value = textBox1.Text;

dataGridView1[2, 0].Value = (int)numericUpDown1.Value;

dataGridView1[3, 0].Value = (textBox2.Text + "; " + textBox3.Text);

dataGridView1[4, 0].Value = textBox4.Text;

textBox1.Clear();

numericUpDown1.Value = 1;

textBox2.Clear();

textBox3.Clear();

textBox4.Clear();

}

/// <summary>

/// Добавляет в базу данных подвижную радиостанцию

/// </summary>

private void button4_Click(object sender, EventArgs e)

{

try

{

база.Add(new Подвижная(textBox1.Text, (int)numericUpDown1.Value, (int)промежуточные_точки_x[промежуточные_точки_y.Count - 1], (int)промежуточные_точки_y[промежуточные_точки_x.Count - 1], промежуточные_точки_x, промежуточные_точки_y));

}

catch

{

MessageBox.Show("Должны быть заполнены все поля и в поле 'координаты' должны быть введены только числа!", "Ошибка!");

return;

}

пс = (Подвижная)база[база.Count - 1];

dataGridView1.Rows.Insert(0, 1);

dataGridView1[0, 0].Value = пс.GetType().Name;

dataGridView1[1, 0].Value = textBox1.Text;

dataGridView1[2, 0].Value = (int)numericUpDown1.Value;

dataGridView1[3, 0].Value = пс.X + "; " + пс.Y;

dataGridView1[4, 0].Value = "";

промежуточные_точки_x.Clear();

промежуточные_точки_y.Clear();

textBox1.Clear();

numericUpDown1.Value = 1;

}

/// <summary>

/// Добавляет координаты новой точки в массив промежуточных точек

/// </summary>

private void button3_Click(object sender, EventArgs e)

{

try

{

промежуточные_точки_x.Add(int.Parse(textBox5.Text));

промежуточные_точки_y.Add(int.Parse(textBox6.Text));

}

catch

{

MessageBox.Show("В поле 'координаты' должны быть введены только числа!", "Ошибка!");

return;

}

textBox5.Clear();

textBox6.Clear();

}

/// <summary>

/// Открывает новую форму со схемами движения всех подвижных радиостанций, перебирая базу данных и выделяя из нее подвижные радиостанции

/// </summary>

private void button5_Click(object sender, EventArgs e)

{

Подвижная.Max_x = 0;

Подвижная.Max_y = 0;

Подвижная.Min_x = int.MaxValue;

Подвижная.Min_y = int.MaxValue;

Подвижная подв;

for (int i = 0; i < база.Count; i++)

{

if (база[i].GetType().Name == "Подвижная")

{

подв = (Подвижная)база[i];

for (int j = 0; j < подв.Точки_x.Length; j++)

{

if (подв.Точки_x[j] < Подвижная.Min_x) { Подвижная.Min_x = подв.Точки_x[j]; }

if (подв.Точки_x[j] > Подвижная.Max_x) { Подвижная.Max_x = подв.Точки_x[j]; }

}

for (int j = 0; j < подв.Точки_y.Length; j++)

{

if (подв.Точки_y[j] < Подвижная.Min_y) { Подвижная.Min_y = подв.Точки_y[j]; }

if (подв.Точки_y[j] > Подвижная.Max_y) { Подвижная.Max_y = подв.Точки_y[j]; }

}

}

}

Графики = new Form3();

Графики.База = база;

Графики.ShowDialog();

}

/// <summary>

/// Открывает новую форму с перечислением стационарных радиостанций, расположенных в населенных пунктах, название которых начинается с буквы "И"

/// </summary>

private void button1_Click(object sender, EventArgs e)

{

Радиостанции_И = new Form2();

Радиостанции_И.База_и = база;

Радиостанции_И.ShowDialog();

}

/// <summary>

/// Удаляет выбранную строку из базы данных

/// </summary>

private void button6_Click(object sender, EventArgs e)

{

try

{

int nom;

nom = dataGridView1.CurrentRow.Index;

база.RemoveAt(nom);

dataGridView1.Rows.RemoveAt(nom);

}

catch

{

MessageBox.Show("Не выделено ни одной строки!", "Ошибка!");

return;

}

}

/// <summary>

/// Ссылка на метод, закрывающий программу

/// </summary>

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

Close();

}

/// <summary>

/// Предлагает пользователю сменить цветовую главного окна программы

/// </summary>

private void цветоваяСхемаToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult ответ;

ответ = colorDialog1.ShowDialog();

if (ответ == DialogResult.OK)

{

BackColor = colorDialog1.Color;

tabPage1.BackColor = colorDialog1.Color;

tabPage2.BackColor = colorDialog1.Color;

dataGridView1.BackgroundColor = colorDialog1.Color;

}

}

/// <summary>

/// Предлагает пользователю сменить шрифт надписей главного окна программы

/// </summary>

private void шрифтToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult ответ;

ответ = fontDialog1.ShowDialog();

if (ответ == DialogResult.OK)

{

Font = fontDialog1.Font;

}

}

/// <summary>

/// Ссылка на метод, предлагающий сохранить несохраненные данные

/// </summary>

private void сохранитьToolStripMenuItem1_Click(object sender, EventArgs e)

{

save();

}

/// <summary>

/// Метод, выполняемый при закрывании главного окна программы

/// </summary>

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

Form form = new Form();

DialogResult result;

result = MessageBox.Show("Сохранить изменения в базе данных?", "Радиостанции",

MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,

MessageBoxDefaultButton.Button3);

if (result == System.Windows.Forms.DialogResult.Yes)

{

save();

form.Close();

}

else if (result == System.Windows.Forms.DialogResult.No)

{

form.Close();

}

else if (result == System.Windows.Forms.DialogResult.Cancel)

{

e.Cancel = true;

}

}

/// <summary>

/// Предлагает пользователю открыть готовую базу данных радиостанций из файла

/// </summary>

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult ответ;

ответ = openFileDialog1.ShowDialog();

if (ответ == DialogResult.OK)

{

имяЧтение = openFileDialog1.FileName;

имяЗапись = openFileDialog1.FileName;

база.Clear();

поток = new FileStream(имяЧтение, FileMode.Open);

BinaryFormatter форм = new BinaryFormatter();

база = (ArrayList)форм.Deserialize(поток);

поток.Close();

dataGridView1.Rows.Clear();

Радиостанция рад;

for (int i = 0; i < база.Count; i++)

{

рад = (Радиостанция)база[i];

dataGridView1.Rows.Insert(0, 1);

dataGridView1[0, 0].Value = рад.GetType().Name;

dataGridView1[1, 0].Value = рад.Позывной;

dataGridView1[2, 0].Value = рад.Дальность;

dataGridView1[3, 0].Value = рад.X + "; " + рад.Y;

if (рад.GetType().Name == "Стационарная")

{

Стационарная ст = (Стационарная)база[i];

dataGridView1[4, 0].Value = ст.Насел_пункт;

}

}

}

Text = имяЧтение + " - Радиостанции";

}

/// <summary>

/// Создает новую базу данных, предварительно предложив сохранить несохраненные данные

/// </summary>

private void создатьToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult ответ;

ответ = MessageBox.Show("При создании новой базы данных все несохраненные данные будут утеряны. Сохранить изменения в базе данных?", "ВЫХОД",

MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

if (ответ == DialogResult.Yes) { save(); }

if (ответ == DialogResult.Cancel) { return; }

база.Clear();

dataGridView1.Rows.Clear();

имяЧтение = "Новая база данных "+k.ToString()+".bin";

k++;

Text = имяЧтение + " - Радиостанции";

}

}

}

Форма Form2

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace ПроектРадиостанции

{

/// <summary>

/// Форма с перечислением стационарных радиостанций, расположенных в населенных пунктах, название которых начинается с буквы "И"

/// </summary>

public partial class Form2 : Form

{

public Form2()

{

InitializeComponent();

}

/// <summary>

/// Свойство, принимающее массив всех радиостанций

/// </summary>

public ArrayList База_и

{ set { база_и = value;}

}

Стационарная стац_и;

private ArrayList база_и;

int kol=0;

private void Form2_Load(object sender, EventArgs e)

{

dataGridView1.Rows.Clear();

dataGridView1.Columns.Add("", "Позывной");

dataGridView1.Columns.Add("", "Дальность связи");

dataGridView1.Columns.Add("", "Расположение");

dataGridView1.Columns.Add("", "Населенный пункт");

dataGridView1.Rows.Clear();

kol = 0;

for (int i = 0; i < база_и.Count; i++)

{

if (база_и[i].GetType().Name == "Стационарная")

{

стац_и = (Стационарная)база_и[i];

if (стац_и.Насел_пункт[0] == 'и' || стац_и.Насел_пункт[0] == 'И')

{

kol++;

dataGridView1.Rows.Insert(0, 1);

dataGridView1[0, 0].Value = стац_и.Позывной;

dataGridView1[1, 0].Value = стац_и.Дальность;

dataGridView1[2, 0].Value = стац_и.X.ToString() + "; " + стац_и.Y.ToString();

dataGridView1[3, 0].Value = стац_и.Насел_пункт;

}

}

}

if (kol > 0)

label2.Text = kol.ToString();

else label2.Text = "Таких радиостанций нет";

}

}

}

Форма Form3

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace ПроектРадиостанции

{

/// <summary>

/// Форма со схемами движения всех подвижных радиостанций

/// </summary>

public partial class Form3 : Form

{

Bitmap графикВПамяти;

Graphics полотно;

Graphics полотноПанель;

Pen ps1;

Pen ps2;

Pen pr;

Pen pg;

int шир_x;

int выс_y;

int масш_x,

масш_y;

Random rnd;

private ArrayList база;

/// <summary>

/// Свойство, принимающее массив всех радиостанций

/// </summary>

public ArrayList База

{

set { база = value; }

}

public Form3()

{

InitializeComponent();

}

/// <summary>

/// Метод, вычисляющий размеры координатной сетки и выдающий сетку на полотно

/// </summary>

public void Рисовать_сетку()

{

Graphics.FromImage(графикВПамяти).Clear(Color.White);

Font font = new Font("Batang", 8);

SolidBrush br = new SolidBrush(Color.Black);

шир_x = Подвижная.Max_x - Подвижная.Min_x+6;

выс_y = Подвижная.Max_y - Подвижная.Min_y+6;

масш_x = panel1.Size.Width / шир_x;

масш_y = panel1.Size.Height / выс_y;

if (масш_x > 0 && масш_y > 0)

{

for (int i = 1; i * масш_x < panel1.Size.Width; i++)

{

Graphics.FromImage(графикВПамяти).DrawLine(ps1, i * масш_x, 0, i * масш_x,

panel1.Size.Height);

Graphics.FromImage(графикВПамяти).DrawString((Подвижная.Min_x - 3 + i).ToString(),

font, br, i * масш_x - 3, panel1.Height - 16);

}

for (int i = 1; i * масш_y < panel1.Size.Height; i++)

{// if (i % 10 == 0) { Graphics.FromImage(графикВПамяти).DrawLine(ps2, 0, i * масш_y,

panel1.Size.Width, i * масш_y); }

//else

Graphics.FromImage(графикВПамяти).DrawLine(ps1, 0, panel1.Height - i * масш_y,

panel1.Size.Width, panel1.Height - i * масш_y);

Graphics.FromImage(графикВПамяти).DrawString((Подвижная.Min_y - 3 + i).ToString(),

font, br, 3, panel1.Height - i * масш_y);

}

for (int i = 0; i * масш_y < panel1.Size.Width; i = i + 10)

{ Graphics.FromImage(графикВПамяти).DrawLine(ps2, 0, panel1.Height - i * масш_y,

panel1.Size.Width, panel1.Height - i * масш_y); }

for (int i = 0; i * масш_x < panel1.Size.Width; i = i + 10)

{ Graphics.FromImage(графикВПамяти).DrawLine(ps2, i * масш_x, 0, i * масш_x,

panel1.Size.Height); }

Graphics.FromImage(графикВПамяти).DrawRectangle(pr, 0, 0, panel1.Width, panel1.Height);

}

else { MessageBox.Show("Ошибка!","Ошибка!");

return;

}

}

/// <summary>

/// Метод, выдающий графики движения подвижных радиостанций на полотно

/// </summary>

public void Рсовать_графики()

{

Подвижная подвижная;

for (int i = 0; i < база.Count; i++)

{

if (база[i].GetType().Name == "Подвижная")

{

pg = new Pen(Color.FromArgb(255, rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)), 3);

подвижная = (Подвижная)база[i];

подвижная.Рисовать(Graphics.FromImage(графикВПамяти), panel1.Size,

шир_x, выс_y, масш_x, масш_y, pg);

}

}

}

private void Form3_Load(object sender, EventArgs e)

{

ps1 = new Pen(Color.LightGray, 1);

ps2 = new Pen(Color.Gray, 1);

pr = new Pen(Color.Black, 2);

rnd = new Random();

графикВПамяти = new Bitmap(panel1.Size.Height, panel1.Size.Width);

полотно = Graphics.FromImage(графикВПамяти);

полотно.DrawImage(графикВПамяти, 0, 0);

полотноПанель = Graphics.FromHwnd(panel1.Handle);

Рисовать_сетку();

Рсовать_графики();

//for (int i = 0; i < база.Count; i++)

// {

// if (база[i].GetType().Name == "Подвижная")

// {

// подв = (Подвижная)база[i];

// подв.Рисовать(Graphics.FromImage(графикВПамяти), panel1.Size);

//}

}

private void panel1_Paint(object sender, PaintEventArgs e)

{

полотноПанель.DrawImage(графикВПамяти, 0, 0);

}

}

}