- •Программирование на языке c#
- •3.1. Общие принципы 27
- •Введение
- •1 . Базовые элементы языка c#
- •1.1. Структура программы
- •Типы данных
- •1.3. Арифметические и логические операции
- •1.4. Условный оператор и оператор выбора
- •1.5. Ввод/вывод в консольном режиме
- •1.6. Комментарии
- •1.7. Массивы
- •1.8. Операторы цикла
- •1.9. Работа со ступенчатыми массивами
- •Контрольные вопросы
- •2. Работа с функциями
- •2.1. Общие принципы
- •2.2. Процедурное программирование в c#
- •Контрольные вопросы
- •3. Объектно-ориентированное программирование на c#
- •3.1. Общие принципы
- •3.2. Объявление и работа с классами
- •3.3. Перегрузка операторов
- •3.4. Индексаторы
- •3.5. Свойства
- •Использование класса в качестве типа данных
- •3.7. Работа со структурами
- •3.8. Наследование
- •3.9. Ссылки на объекты
- •3.10. Конструктор копирования
- •3.11. Виртуальные методы
- •3.12. Абстрактные методы и классы
- •3.13. Интерфейсы
- •3.14. Делегаты и события
- •3.15. Исключительные ситуации
- •Контрольные вопросы
- •4. Среда Microsoft Visual Studio 2005
- •4.1. Простейший пример
- •4.2. Средства управления работой программы
- •4.3. Создание меню
- •4.4. Ввод/вывод массивов
- •4.4.1. Ввод/вывод и обработка одномерного массива-строки
- •4.4.2. Ввод/вывод и обработка одномерного массива-столбца
- •4.4.3. Ввод/вывод и обработка двумерного массива
- •4.4.4. Форматированный ввод/вывод двумерного массива
- •4.5. Создание многооконных приложений
- •4.5.1. Создание sdi –приложения
- •4.5.2. Создание mdi –приложения
- •Контрольные вопросы
- •5. Объектно-ориентированное программирование в Microsoft Visual Studio 2005
- •5.1. Дополнение класса формы средствами решения прикладной задачи
- •5.2. Создание отдельных классов
- •5.3. Передача в классы указателей на формы
- •5.4. Создание форм в классах пользователя
- •Контрольные вопросы
- •Заключение
- •Библиографический список
5.3. Передача в классы указателей на формы
Рассмотрим в этом параграфе использование в числе данных класса указателя на форму для обеспечения возможности связывания переменных класса и компонентов на форме. Напомним, что форме соответствует класс, и все компоненты формы являются и переменными ее класса. Переменные класса, по умолчанию, имеют атрибут доступа private. Поэтому не забудьте: если хотите организовать доступ к компонентам формы по указателю извне необходимо изменять атрибут доступа (свойство Modifiers)этих компонентов.
Рассмотрим следующий пример: найти среднее арифметическое тех элементов одномерного массива, которые больше заданного значения. Пусть наше приложение состоит из одной формы, на которой имеются две строки редактирования (textBox1 – исходный массив, textBox2 – заданное значение), метка для вывода результата (label4). Значение свойства Modifiers для всех перечисленных компонентов должно быть public. Кроме того там имеются три командных кнопки (button1, button2, button3).
Класс пользователя:
public class Class1
{
int[] k; // исходный массив
double d; // среднее арифметическое
int predel=0,kol; // заданное значение, количество элементов
Form1 ff; // указатель на форму
public Class1(Form1 f1)
{
ff = f1; // конструктор сохраняет значение указателя
}
public void input()
{
//ввод исходных данных, пустое поле считается нулем
string[] s1; string s2;
s2 = ff.textBox1.Text;
s1 = s2.Split(';');
k = new int[s1.Length];
for (int i = 0; i < s1.Length; i++)
if (s1[i] == "") k[i] = 0;
else
k[i] = Convert.ToInt32(s1[i]);
if (ff.textBox2.Text == "") predel = 0;
else
predel = Convert.ToInt32(ff.textBox2.Text);
}
public void obr()
{
// нахождение среднего арифметического
d = 0;
for (int i = 0; i < k.Length; i++)
if (k[i] > predel)
{
d += k[i];
kol++;
}
if (kol != 0)
d /= kol;
}
public void output()
{
// вывод результата
if (kol == 0) ff.label4.Text = "No numbers";
else
ff.label4.Text = "" + d;
} } }
В класс пользователя передается указатель на форму, на которой имеются компоненты для исходных данных и результата. Методы класса пользователя осуществляют ввод/вывод и обработку.
Методы формы:
namespace ClassForm
{
public partial class Form1 : Form
{
Class1 my; // указатель на класс пользователя
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{ // создание класса пользователя
my = new Class1(this);//передача указателя на
//текущую (в нашем случае на главную) форму
button2.Enabled = true;
button1.Enabled = false;
}
private void button2_Click(object sender, EventArgs e)
{ // ввод, вычисления и вывод результата
my.input();
my.obr();
my.output();
}
private void button3_Click(object sender, EventArgs e)
{
Close();
} } }
Примечания относительно метода button1_Click:
До создания класса невозможны ввод данных и вычисления, поэтому кнопка вычислений заблокирована.
Предусмотрена возможность создания лишь одного объекта типа Class1. Поэтому после его создания кнопка создания класса заблокируется.
Возможны многократный ввод исходных данных и вычисления.
Разумеется, можно создать сколько угодно форм пользовательского интерфейса и передать их указатели в классы пользователя. Надеемся, что читатель справится с этим самостоятельно.