60.69K
Категория: ПрограммированиеПрограммирование

Передача данных между объектами. Практическая работа №2

1.

Практическая работа №2
Передача данных между объектами

2.

Задание:
Создать программу реализующую обработку данных введенных
пользователем по следующим алгоритмам:
1) Сложение двух чисел(вводятся пользователем)
2) Вычитание двух чисел(вводятся пользователем)
3) Возведение числа(вводится пользователем) в степень(вводится
пользователем)
4) Сравнение двух чисел(вводятся пользователем)
5) Отображение счетчика выполненных действий

3.

Требования к программе
1) Начальная форма приложения должна содержать 2 поля для ввода
данных, поле для вывода текущего значения счетчика и отдельную
кнопку для реализации каждого действия из указанных в задании.
2) Заголовок начальной формы – ФИО студента и номер группы,
заголовок формы с выводом результата действий – по названию
действия(«Результат сложения», «Результат вычитания» и т.д.)
3) Результат выполнения каждого из действий выводится на новой
форме, имеющей поле для вывода результата и кнопку ОК,
реализующей закрытие формы и увеличение значения счетчика,
расположенного на начальной форме на 1
4) Передача данных между формами должна осуществляться как
минимум тремя разными способами
5) Предусмотреть проверку введенных пользователем данных с
генерацией сообщения об ошибке в случае необходимости
6) Программа не должна содержать более 2х форм

4.

Требования к отчету:
• Оформление по ГОСТ
• Содержание:
1) формулировка задания
2) использованные способы передачи данных между
объектами(с кратким описанием)
3) блок схема программы (укрупненная)
4) скриншоты работы программы (начальная форма +
результат каждого действия + сообщение об ошибке )
5) листинг программы (форма1 + форма2)

5.

Полезные ссылки и функции:
• http://www.cyberforum.ru/windows-forms/thread110436.html#a_Q2 –
некоторые способы передачи данных между объектами
• Try / catch – удобно использовать для проверки данных
• { MessageBox.Show("Неверный формат введенных данных"); } – для
генерации сообщения о неверном формате введеных пользователем
данных
• Math.Pow(основание_степени,показатель_степени)
• Закрытие текущей формы: this.Close();
• Создание новой формы: Form2 b = new Form2()
• Открытие новой формы в диалоговом режиме: b.ShowDialog();

6.

Способы передачи данных между
формами.
1. Изменение модификатора доступа
В Form2 Установить модификатор доступа для контрола/поля public
В любом месте Form1:
Form2 f = new Form2();
f.ShowDialog();
this.textBox1.Text = f.textBox1.Text;
+ Самый быстрый в реализации и удобный способ
- Противоречит всем основам ООП
- Возможна передача только из более поздней формы в более раннюю
- Форма f показывается только с использованием ShowDialog(), т.е. в
первую форму управление вернется только по закрытию второй.
Избежать этого можно, сохранив ссылку на вторую форму в поле первой
формы

7.

Способы передачи данных между
формами.
2. Использование открытого свойства/метода.
В классе Form2 определяем свойство (или метод):
Public string Data
{
get
{
return textBox1.Text
}
}
В любом месте Form1:
Form2 f = new Form2();
f.ShowDialog();
this.textBox1.Text = f.Data;
+ Противоречит НЕ всем основам ООП
- Возможна передача только из более поздней формы в более раннюю
- Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию
второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы

8.

Способы передачи данных между
формами.
3. Передача данных в конструктор Form2.
Изменяем конструктор Form2:
public Form2(string data)
{
InitializeComponent();
//Обрабатываем данные
//Или записываем их в поле
this.data = data;
}
string data;
Создаем форму в любом месте Form1 так:
Form2 f = new Form2(this.textBox1.Text);
f.ShowDialog();
//Или f.Show();
+ Простой в реализации способ
+ Не нарушает ООП
- Возможна передача только из более ранней формы в более позднюю

9.

Способы передачи данных между
формами.
4. Передача ссылки в конструктор.
Изменяем конструктор Form2:
public Form2(Form1 f1)
{
InitializeComponent();
//Обрабатываем данные
//Или записываем их в поле
string s = f1.textBox1.Text;
}
Создаем форму в любом месте Form1 так, т.е. передаем ей ссылку на первую форму:
Form2 f = new Form2(this);
f.ShowDialog();
//Или f.Show();
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
- Нарушает ООП

10.

Способы передачи данных между
формами.
5. Используем свойство 'родитель'.
При создании второй формы устанавливаем владельца:
Form2 f = new Form2();
f.Owner = this;
f.ShowDialog();
Во второй форме определяем владельца:
Form1 main = this.Owner as Form1;
if(main != null)
{
string s = main.textBox1.Text;
main.textBox1.Text = "OK";
}
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП

11.

Способы передачи данных между
формами.
6. Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном
namespace, т.е. например в файле Program.cs:
static class Data
{
public static string Value { get; set; }
}
Его открытые свойства/методы доступны из любой формы:
Data.Value = "111";
+ Самый удобный способ, когда данные активно используются
несколькими формами

12.

Способы передачи данных между
формами.
7. Использование функций обратного вызова.Передача метода в конструктор
Создаем в основном namespace делегат:
public delegate void MyDelegate(string data);
В Form1 создаем метод, который будет обрабатывать принятые данные:
void func(string param)
{
// обработка
}
Создаем вторую форму так:
Form2 f = new Form2(new MyDelegate(GetData));
f.ShowDialog();
При этом изменяем конструктор второй формы, чтобы он принимал делегат:
MyDelegate d;
public Form2(MyDelegate sender)
{
InitializeComponent();
d= sender;
}
И в любой момент отправляем данные:
d(textBox1.Text);

13.

Form1.cs button1(сложение)
• private void button1_Click(object sender, EventArgs e)
{
try
{
Form2 f = new Form2();
f.label1.Text = Convert.ToString(Convert.ToInt64(textBox1.Text) + Convert.ToInt64(textBox2.Text));
f.Text = "Результат сложения";
f.ShowDialog();
//this.textBox1.Text = f.textBox1.Text;
//label3.Text = Convert.ToString(Convert.ToInt64(textBox1.Text) + Convert.ToInt64(textBox2.Text));
}
catch
{
MessageBox.Show ("Недопустимый тип данных");
}
}

14.

Form2.cs button1 (ok)
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
English     Русский Правила