Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Int n; // Индекс цвета

public:

CTwoForms ( ) // Конструктор

{

|| Подписать обработчик на событие MouseDown мыши

MouseDown += gcnew MouseEventHandler (this,

&CTwoForms: :OurMouseDown);

Text= "Russian flag"; // Установить заголовок окна

n= 0;

colors= gcnew array<Color^> (3); // Создать массив структур

colors[0]=Color::White;

colors [1]= Color::Blue;

colors [2]= Color::Red;

pTextBox= gcnew TextBox(); // Создать объект редактора

pTextBox -> Location= Drawing::Point (10,120); // Разместить

pTextBox-> Size= Drawing::Size (150, 20); // Размер

pTextBox -> Text= "Russia"; // Поместить текст в редактор

Controls -> Add (pTextBox); // Добавить редактор к форме

pButton= gcnew Button; // Создать объект кнопки

pButton -> Location= Drawing::Point (170,10); // Разместить

pButton -> Size= Drawing::Slze (40, 20); // Размер

pButton -> Text= "OK"; II Поместить текст в кнопку

Controls -> Add (pButton); // Добавить кнопку к форме

// Подписать обработчик на событие Click кнопки

pButton -> Click += gcnew System:;EventHandler (this,

&CTwoForms:: Ou rButtonClick);

// Подписать обработчик на событие MouseDown мыши

MouseDown += gcnew MouseEventHandler (this,

&CTwoForms: :OurMouseDown);

childForm= gcnew Form (); // Создать дочернюю форму и

chlldForm->Location= *gcnew Polnt (250, 10); // разместить

unldFonTi->Size= *ycnew Drawlng;:SiZ6 (250, 250); // с размером

childForm->Text= "ChildForm"; // Установить заголовок

childForm->Show ( ); // Отобразить на экране

childForm->Controls->Add (pTextBox); // Добавить редактор

childForm->Controls->Add (pButton); // Добавить кнопку

>

protected:

Virtual void OnPaint (PaintEventArgs л arg) override // Перерисовать область

{

Form: :OnPaint (arg);

Rectangle rect (10, 10, 130, 30); // Прямоугольник третьей части флага

for(lnt 1=0; i < 3; i++) // Нарисовать флаг

{

arg->Graphics->FillRectangle(gcnew SolidBrush (*colors[i]),

rect.X, rect.Y, rect.Wldth, rect.Height);

rect.Offset (0, 30); // Сместить прямоугольник rect вниз >

// Написать строку от координат носика курсора мыши

arg -> Graphics -> DrawString (pTextBox ->Text,

gcnew System::Drawing::Font ("Arial", 16),

gcnew SolidBrush (*colors [nJ), point);

>

void OurMouseDown (Object ^pSender, MouseEventArgs ^arg)

{

point.X= arg -> X; // Сохранить координату X носика курсора мыши

point.Y= arg -> Y; // Сохранить координату Y курсора мыши

Invalidate (); // Перерисовать область клиента окна

>

// Обработать щелчок на кнопке

void OurButtonClick (Object ^sender, EventArgs Ле)

{

n++; // К следующему цвету массива цветов colors

if (п >= 3) n= 0;

Invalidate (); // Перерисовать область клиента окна

>

>;

int maln ( )

<

Application::Run (gcnew CTwoForms ()); //Выполнить

return 0;

C++/CLI. Программа примера 10.9.3 схожа с C# программой примера 10.9.1.

Применительно к управляемому коду здесь применены операторы gcnew, де-

скрипторы, стрелки. В начале программы помещены операторы #using, под-

ключающие требуемые библиотеки.

10.10. Исключения

Исключения играют важную роль в программировании. Программа,

осуществляющая ввод данных определённого формата и оперирующая с ре-

сурсами, обязана, воспользовавшись исключениями, контролировать как кор-

ректность вводимых данных, так и доступность используемых ресурсов, ина-

че в программе произойдут сбои, и её работа, к сожалению пользователя и к

стыду создателя, завершится аварийно с возможной выдачей непонятной

для пользователя информации.

Так что же такое исключение?

Исключение (exception) - это объект, выдаваемой системой выполне-

ния программы (CLR для C# или JVM для Java), когда при исполнении про-

граммы случилась неопределённая ситуация, система не знает что делать и

выбрасывает (throw) специальный объект (exception), содержащий информа-

цию о случившемся. Если программист предусмотрел возможность появле-

ния этого объекта, схватил (catch) его и среагировал надлежащим образом, то

аварийное завершение не случится - программа продолжит нормально функ-

ционировать. Иначе, к глубокому сожалению, выполнение программы за-

вершится аварийно.

Пример 10.10.1 иллюстрирует аварийное завершение программы при

делении на нуль.

Пример 10.10.1. Исключение не обрабатывается.

////////////////////

// Java или J#

package cjLecExc_l;

public class Exc

{

public static void main ( )

{

int x, у, z;

x= 5; y= 0; z= x/y;

System.out.println ("z= "+z);

>

/>*

Result:

На консоль вьщаётся информация об аварийном завершении программы:

Unhandled Exception: System.DivldeByZeroExceptlon: Attempted to divide by zero,

at cjLecExc_l.Exc.main() in c:\VS_Programs\cjLecExc_l\Classl.jsl

:line 9

Press any key to continue

* /

////////////////////

// C#

using System;

class Exc

{

s{t atic void Main < ^

int x, y, z;

x= 5; y= 0; z= x/y;

Console.WriteLine ("z= "+z);

>

/>*

Result:

На консоль вьщаётся информация об аварийном завершении программы:

Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.

at Classl.Maln() in c:\vs_programs\cslecexc_l\classl.cs:line 8

Press any key to continue

*/

До выброса исключения функция Main() и main() присвоили значения пере-

менным x и у. При делении x на нулевое значение переменной у выброшено

исключение, работа программы прерывается, и, заметьте, функции Write-

Line() и println() не выполняются: на консоль не вьщаётся значение перемен-

ной z. Как видно из результата работы программы, на консоль выдана ин-

формация о необработанном программистом исключении (unhandled exception)

типа DivideByZeroException (попытка разделить на нуль).

Для обработки исключения применяется try-catch-finally конструкция:

try

{

контролируемый программный код

>

catch (тип-исключения объект-исключения )

{

обработчик исключения для объекта типа

>

[ finally

<

обработка перед выходом из try-блока

>]

Программный код, допускающий выброс исключения, помещают в try-блок.

Непосредственно после этого блока размещают catch-блок, указав в круглых

скобках ссылку на объект предполагаемого исключения, воспользовавшись

при этом одним из классов библиотеки. В фигурных скобках catch-блока по-

мещают последовательность операторов, реагирующих на это исключение.

Последовательно можно разместить несколько catch-блоков, каждый из ко-

торых обрабатывал бы своё исключение. Но catch-блок более общего исклю-

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

иначе оно перехватит следующие (порождённые из него) исключения.

finally-блок может отсутствовать. Последовательность его операторов вы-

полняется перед возвратом из try-блока.

Пример 10.10.2 иллюстрирует обработку DivideByZeroException ис-

ключения.

Пример 10.10.2. Обрабатка DivideByZeroException исключения.

шишинншш

|| Java или J#

package cjLecExc_2b;

public class Exc

{

public static void main(String[] args)

{

int x, у, z;

try

{

x= 5; y= 0; z= x/y;

System.out.println("z= "+z);

>

catch(ArithmeticException e)

{System.out.println("Exception is catched");}

>

I>*

Result:

Exception is catched

Press any key to continue

*/

llllllllllllllllllll

И C#

using System;

class Exc

{

static void Main(string[] args)

<

int x, y, z;

try

{

x= 5; y= 0; z= x/y;

Console.WriteLlne("z= "+z);

>

catch(ArithmeticException e)

{Console.WriteLine("HcKflK>4eHMe перехвачено");>

> /*

Result:

Исключение перехвачено

Press any key to continue

*/

В примере 10.10.2 потенциально опасное деление на нуль охвачено try-

блоком, а catch-блок перехватил выброшенное исключение типа ArithmeticException

и выдал на консоль сообщение. Программа завершилась не ава-

рийно.

Поскольку с одним try-блоком может быть связано много catch-блоков

и, более того, try-блок может включать по мере необходимости в надлежа-

щих местах другие try-блок со своими catch-блоками, то необходимо быть

внимательным и помнить, что после выброса исключения схватывается бли-

жайший catch-блок. Будучи размещённая в функции, try-catch-конетрукция

после перехвата исключения, выполнив свою работу, завершит выполнение

этой функции. Обратите внимание на результат работы программы примера