Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ C#.docx
Скачиваний:
16
Добавлен:
20.11.2019
Размер:
1.85 Mб
Скачать

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:

  1. До создания класса невозможны ввод данных и вычисления, поэтому кнопка вычислений заблокирована.

  2. Предусмотрена возможность создания лишь одного объекта типа Class1. Поэтому после его создания кнопка создания класса заблокируется.

  3. Возможны многократный ввод исходных данных и вычисления.

Разумеется, можно создать сколько угодно форм пользовательского интерфейса и передать их указатели в классы пользователя. Надеемся, что читатель справится с этим самостоятельно.