Динамическое создание объектов



 

Чаще всего для размещения на форме кнопки, поля ввода или дру-гих управляющих элементов используется дизайнер среды Visual Studio: нужный элемент выделяется в панели элементов и размещается на фор-ме. Однако иногда создавать элементы нужно уже в процессе выполне-ния программы. Поскольку каждый элемент управления представляет собой отдельный класс, его помещение на форму программным спосо-бом включает несколько шагов:

 

1. Создание экземпляра класса.

2. Привязка его к форме.

3. Настройка местоположения, размеров, текста и т. п.

 

Например, чтобы создать кнопку, нужно выполнить следующий код ( его следует разместить в обработчике сообщения Load или в каком-либо другом методе):

 

Button b = new Button();


 

46


 

Здесь объявляется переменная b, относящаяся к классу Button, как

 

и в предыдущих лабораторных работах. Однако дальше идет нечто но-вое: с помощью оператора new создается экземпляр класса Button,

 

и ссылка на него присваивается переменной b. При этом выполняется целый ряд дополнительных действий: выделяется память под объект, инициализируются все свойства и переменные.

Далее нужно добавить объект на форму. Для этого служит свойство Parent, которое определяет родительский элемент, на котором будет размещена кнопка:

 

b.Parent = this;

 

Ключевое слово this относится к тому объекту, в котором разме-щен выполняемый в данный момент метод. Поскольку все методы в ла-бораторных работах размещаются в классе формы, то и this относится к этому конкретному экземпляру формы.

 

Вместо формы кнопку можно поместить на другой контейнер. На-пример, если на форме есть элемент управления Panel, то можно помес-тить кнопку на него следующим образом:

 

b.Parent = panel1;

 

Чтобы задать положение и размеры кнопки, нужно использовать свойства Location и Size:

 

b.Location = new Point(10, 20);

 

b.Size = new Size(200, 100);

 

Обратите внимание, что Location и Size – это тоже объекты. Хотя внутри у Location содержатся координаты x и y, задающие левый верхний угол объекта, не получится поменять одну из координат, нужно менять целиком весь объект Location. То же самое относится и к свойству Size.

 

На самом деле, каждый раз, когда на форму помещается новый эле-мент управления или вносятся какие-то изменения в свойства элементов управления, Visual Studio генерирует специальный служебный код, кото-рый проделывает приведенные выше операции по созданию и настройке элементов управления. Попробуйте поместить на форму кнопку, изменить

 

у нее какие-нибудь свойства, а затем найдите в обозревателе решений вет-ку формы Form1, разверните ее и сделайте двойной щелчок по ветке Form1.Designer.cs. Откроется файл с текстом программы на языке C#, ко-торую среда создала автоматически. Менять этот код вручную крайне не рекомендуется! Однако можно его изучить, чтобы понять принципы соз-дания элементов управления в ходе выполнения программы.


 

47


 

Область видимости

 

Переменные, объявленные в программе, имеют область видимости. Это значит, что переменная, описанная в одной части программы, не обязательно будет видна в другой. Вот наиболее часто встречающиеся ситуации:

 

1. Переменные, описанные внутри метода, не будут видны за пре-делами этого метода. Например:

 

void MethodA()

 

{

// Описываем переменную delta int delta = 7;

 

}

 

void MethodB()

 

{

// Ошибка: переменная delta в этом методе неизвестна! int gamma = delta + 1;

 

}

 

2. Переменные, описанные внутри блока или составного операто-ра, видны только внутри этого блока. Например:

 

void Method()

 

{

if (a == 7)

{

int b = a + 5;

}

// Ошибка: переменная b здесь уже неизвестна! MessageBox.Show(b.ToString());

 

}

 

3. Переменные, описанные внутри класса, являются глобальными

 

и доступны для всех методов этого класса, например:

 

class Form1 : Form

 

{

int a = 5;

 

void Method()


 

48


 

{

 

// Переменная a здесь действительна

MessageBox.Show(a.ToString());

}

}

 

Операции is и as

 

Часто бывает удобно переменные разных классов записать в один спи-сок, чтобы было легче его обрабатывать. Чтобы проверить, к какому классу принадлежит какой-либо объект, можно использовать оператор is: он воз-вращает истину, если объект принадлежит указанному классу. Пример:

 

Button b = new Button();

 

if (b is Button)

MessageBox.Show("Это кнопка!"); else

 

MessageBox.Show("Это что‐то другое...");

 

Как правило, в общих списках объекты хранятся в «обезличенном» состоянии, так, чтобы у всех у них был лишь минимальный общий для всех набор методов и свойств. Для того чтобы получить доступ к рас-ширенным свойствам объекта, нужно привести его к исходному классу

 

с помощью операции приведения as:

 

(someObject as Button).Text = "Это кнопка!";

 

Следует помнить, что операция приведения сработает только в том случае, если объект изначально принадлежит тому классу, к которому его пытаются привести (или совместим с ним), в противном случае опе-ратор as выбросит исключение и остановит выполнение программы. Поэтому более безопасный подход состоит в комбинированном приме-нении операторов as и is: сначала проверяем совместимость объекта и класса, и только потом выполняем операцию приведения:

 

if (someObject is Button)

 

(someObject as Button).Text = "Это кнопка!";

 

В качестве практического примера использования этих операций рассмотрим пример программы, которая перебирает все элементы управления на форме, и у кнопок (но не у других элементов управле-ния!) заменяет текст на пять звездочек «*****»:

 

private void Form1_Load(object sender, EventArgs e)

 

{


 

49


 

// Перебираем все элементы управления foreach (Control c in this.Controls)

if (c is Button) // Кнопка?

(c as Button).Text = "*****"; // Да!

}

 


Дата добавления: 2020-04-08; просмотров: 237; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!