Главная страница

Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование


Скачать 5.54 Mb.
НазваниеВасильев А. Н. Программирование
АнкорВасильев А.Н. Основы программирования на C
Дата20.09.2022
Размер5.54 Mb.
Формат файлаpdf
Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
ТипДокументы
#686596
страница31 из 40
1   ...   27   28   29   30   31   32   33   34   ...   40
391
Рис. 8.8. Переход в режим приложения Окно и обработка событий
Пошли, Скрипач, в открытый космос.
из к/ф «Кин-дза-дза»
Еще один пример, который мы рассмотрим далее, также связан с созданием пустого окна. Нона этот раз окно будет более функциональным. Кроме того, если в предыдущем примере все команды по созданию и отображению окна размещались в главном методе программы, то теперь мы пойдем другим путем. Мы опишем класс, на основе которого будет создаваться окно, и этот класс будет наследовать класс Form. Для отображения окна в классе описан специальный статический метод. Также окно реагирует на действия мыши при наведении курсора мыши на область окна фон окна становится красным. Когда курсор мыши перемещается за пределы области окна, цвет фона окна возвращается к первоначальному значению.
Рассмотрим программный код, представленный в листинге Листинг 8.2. Окно и обработка событий System;
using System.Drawing;
using System.Windows.Forms;
Глава 8
392
//
Ʉɥɚɫɫ ɫɨɡɞɚɟɬɫɹ ɧɚɫɥɟɞɨɜɚɧɢɟɦ ɤɥɚɫɫɚ Form:
class MyForm:Form{
//
Ɂɚɤɪɵɬɨɟ ɩɨɥɟ ɞɥɹ ɡɚɩɨɦɢɧɚɧɢɹ ɮɨɧɨɜɨɝɨ ɰɜɟɬɚ ɨɤɧɚ:
private Color baseColor;
//
Ʉɨɧɫɬɪɭɤɬɨɪ:
public MyForm(string txt):base(){
//
Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ:
Text=txt;
//
ȼɵɫɨɬɚ ɨɤɧɚ:
Height=200;
//
ɒɢɪɢɧɚ ɨɤɧɚ:
Width=300;
//
Ɉɤɧɨ ɧɟɢɡɦɟɧɧɵɯ ɪɚɡɦɟɪɨɜ:
FormBorderStyle=FormBorderStyle.Fixed3D;
//
ɋɱɢɬɵɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɞɥɹ ɮɨɧɨɜɨɝɨ ɰɜɟɬɚ ɨɤɧɚ:
baseColor=BackColor;
//
Ɉɛɪɚɛɨɬɱɢɤ ɞɥɹ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ ɫ ɧɚɜɟɞɟɧɢɟɦ
//
ɤɭɪɫɨɪɚ ɦɵɲɢ ɧɚ ɨɛɥɚɫɬɶ ɨɤɧɚ:
MouseEnter+=(a,b)=>{
//
ɐɜɟɬ ɮɨɧɚ ɨɤɧɚ - ɤɪɚɫɧɵɣ:
BackColor=Color.Red;
};
//
Ɉɛɪɚɛɨɬɱɢɤ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ ɫ ɜɵɯɨɞɨɦ ɤɭɪɫɨɪɚ
//
ɦɵɲɢ ɡɚ ɩɪɟɞɟɥɵ ɨɛɥɚɫɬɢ ɨɤɧɚ:
MouseLeave+=(a,b)=>{
//
ɉɪɢɦɟɧɟɧɢɟ ɢɫɯɨɞɧɨɝɨ ɰɜɟɬɚ ɞɥɹ ɮɨɧɚ ɨɤɧɚ:
BackColor=baseColor;
};
}
//
ɋɬɚɬɢɱɟɫɤɢɣ ɦɟɬɨɞ ɞɥɹ ɨɬɨɛɪɚɠɟɧɢɹ ɨɤɧɚ:
public static void show(string txt){
//
Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ:
Приложения с графическим интерфейсом Application.Run(new MyForm(txt));
}
}
//
Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
class MoreSimpleFormDemo{
//
Ⱥɬɪɢɛɭɬ ɢɫɩɨɥɶɡɨɜɚɧɢɹ ɨɞɧɨɩɨɬɨɱɧɨɣ ɦɨɞɟɥɢ:
[STAThread]
//
Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
static void Main(){
//
Ɉɬɨɛɪɚɠɟɧɢɟ ɩɟɪɜɨɝɨ ɨɤɧɚ:
MyForm.show(
Ǝɉɟɪɜɨɟ ɨɤɧɨƎ);
//
Ɉɬɨɛɪɚɠɟɧɢɟ ɜɬɨɪɨɝɨ ɨɤɧɚ:
MyForm.show(
Ǝȼɬɨɪɨɟ ɨɤɧɨƎ);
Класс MyForm создается наследованием класса Form. Конструктору класса MyForm при создании объекта передается текстовый аргумент обозначен как txt). В теле конструктора командой Text=txt аргумент присваивается в качестве значения свойству Text. Таким образом, аргумент конструктора определяет заголовок окна, реализуемого через объект класса Высота окна определяется командой Height=200, а команда
Width=300
определяет ширину окна. Кроме этого, мы хотим, чтобы окно имело постоянный размер (то есть чтобы размер окна нельзя было изменить с помощью мыши. Для этого присваивается значение свойству FormBorderStyle объекта окна. Значением присваивается константа Fixed3D из перечисления FormBorderStyle (название такое же, как у свойства. Данная константа означает, что для окна используется объемная рамка, а само окно имеет фиксированные раз- меры.
Командой baseColor=BackColor значение свойства BackColor объекта окна присваивается полю baseColor. Поле объявлено как относящееся к типу Color. Это структура из пространства имен System.
Drawing
. Экземпляры этой структуры определяют цвет, который
Глава можно применять, присваивая в том числе ив качестве значения свойству НАЗ А МЕТКУ В программе, помимо прочего, подключается пространство имен
System.Drawing
. Также необходимо добавить соответствующую ссылку в проект.
Поскольку цвет фона окна может меняться, мы используем поле baseColor для того, чтобы запомнить, каким был цвет фона окна в самом начале, при его создании.
В конструкторе определяются обработчики для событий, связанных с наведением курсора мыши на область окна и с перемещением курсора мыши за пределы области окна.
У объектов класса Form (а значит, и у объектов класса MyForm) есть разные события, и среди них событие MouseEnter и событие
MouseLeave
. Событие MouseEnter происходит, когда курсор оказывается над областью компонента, для которой определено событие. Событие MouseLeave происходит, когда курсор мыши перемещается за область компонента (окна. В обоих случаях для добавления в список обработчиков событий мы используем лямбда-выражения. Здесь нужно учесть, что для классов графических компонентов события в том числе MouseEnter и MouseLeave) определены с типом делегата (пространство имен System). Это означает, что в список обработчиков событий могут добавляться ссылки на экземпляры делегата EventHandler или ссылки на методы, соответствующие этому делегату. Делегат EventHandler соответствует методам, которые не возвращают результат и у которых два аргумента. Первым аргументом является ссылка класса Object. Подразумевается, что это ссылка на объект компонента, который вызвал событие (с которым событие произошло. Второй аргумент является объектной ссылкой класса (пространство имен System). Этот аргумент нужен для передачи информации о параметрах события, которое произошло. Такая информация содержится в объекте, переданном методу в качестве второго аргумента. Что касается класса EventArgs, то он является базовым для классов, объекты которых реально передаются вторым аргументом методам-обработчикам.
Приложения с графическим интерфейсом НАЗ А МЕТКУ Когда на компоненте происходит некоторое событие, то для его обработки вызываются методы из списка обработчиков события. Этим методам передается по два аргумента. Первый аргумент — это ссылка на объект компонента, на котором произошло событие. Второй аргумент — это объект, содержащий сведения о событии. Метод может использовать эти аргументы, а может не использовать. Но аргументы у метода должны быть.
Компоненты разные, и поэтому объекты компонентов относятся к разным классам. Но поскольку первый аргумент делегата
EventHandler является ссылкой класса
Object
, то фактически этот аргумент может быть ссылкой на объект любого класса. Похожая ситуация имеет место со вторым аргументом. Реальные объекты, которые передаются в качестве второго аргумента при вызове методов из списка обработки события, относятся к классам, производным от класса Таким образом, метод, который добавляется в список обработчиков события, должен иметь два аргумента (даже если мы не собираемся эти аргументы использовать. Как отмечалось выше, методы для обработки событий мы определяем с помощью лямбда-выражений. У этих лямбда- выражений есть два формальных аргумента (обозначены как a и b), которые не используются. В теле метода, добавляемого обработчиком для события MouseEnter, выполняется команда BackColor=Color.Red, которой устанавливается красный цвет фона окна. В теле метода, добавляемом обработчиком для события MouseLeave, выполняется команда
BackColor=baseColor
, которой для фона окна устанавливается исходный цвет (который был у окна при создании).
Помимо конструктора и закрытого поля baseColor, в классе MyForm описан статический метод Show() с текстовым аргументом (обозначен как txt). При вызове метода выполняется команда Application.
Run(new
MyForm(txt)). В качестве аргумента метода Run() указана инструкция new MyForm(txt), которой создается анонимный объект класса MyForm. В результате создается объект окна, и это окно отображается на экране. Выполнение метода Run() состоит вопросе на предмет событий, связанных с окном. Проще говоря, пока окно незакрыто, метод Run() продолжает работу.
В главном методе программы командой MyForm.show(
Ǝɉɟɪ-
ɜɨɟ ɨɤɧɨƎ) отображается первое окно, представленное на рис. 8.9.
Глава Рис. 8.9. Первое окно, которое отображается при запуске программы на выполнение
Заголовок окна определяется текстом, переданным в качестве аргумента методу show(). Размеры окна изменить нельзя (но при этом с помощью системной пиктограммы можно развернуть окно навесь экрана если навести курсор мыши на область окна, то фон окна станет красным (рис. Рис. 8.10. При наведении курсора мыши на область окна фон окна становится красным
Если курсор переместить за пределы области окна, то фон окна станет прежним.
После закрытия окна появляется еще одно окно (результат выполнения команды MyForm.show(
Ǝȼɬɨɪɨɟ ɨɤɧɨƎ)). Оно показано на рис. Рис. 8.11. После закрытия первого окна появляется еще одно (второе) окно
Приложения с графическим интерфейсом
397
От первого окна оно отличается только заголовком. Как и первое окно, второе окно меняет цвет фона при наведении на него курсора мыши.
Кнопки и метки Анормального входа в этот универсам нет За нормальный чатлами надо платить, род- ной!
из к/ф «Кин-дза-дза»
Мы продолжаем знакомиться с простыми программами (с графическим интерфейсом, но постепенно будем изучать разные графические компоненты. Далее рассмотрим программу, в которой используются наиболее простые компоненты — кнопки и текстовые метки. А именно, создадим программу, при запуске которой отображается диалоговое окно с сообщением и кнопкой. Щелчок по кнопке приводит к закрытию окна и завершению выполнения программы. Как выглядит окно, отображаемое при запуске программы на выполнение, показано на рис. Рис. 8.12. Окно с сообщением и кнопкой
Мы раньше встречались с подобными окнами. От предыдущих случаев данная ситуация отличается тем, что окно с кнопкой конструируем мысами. Программный код, выполнение которого приводит к желаемому результату, представлен в листинге Листинг 8.3. Окно с сообщением и кнопкой System;
using System.Drawing;
using System.Windows.Forms;
//
Ʉɥɚɫɫ ɨɤɧɚ ɧɚɫɥɟɞɭɟɬ ɤɥɚɫɫ Form:
class MyForm:Form{
//
Ʉɨɧɫɬɪɭɤɬɨɪ:
Глава 8
398
public MyForm(string msg,string title):base(){
this.Text=title; //
Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ
//
Ɋɚɡɦɟɪɵ ɨɤɧɚ:
this.Size=new Size(300,140);
//
Ɉɤɧɨ ɩɨɫɬɨɹɧɧɵɯ ɪɚɡɦɟɪɨɜ:
this.FormBorderStyle=FormBorderStyle.FixedSingle;
//
Ɉɤɧɨ ɧɟɥɶɡɹ ɪɚɡɜɟɪɧɭɬɶ ɧɚ ɜɟɫɶ ɷɤɪɚɧ:
this.MaximizeBox=false;
//
ɉɨɥɧɵɣ ɩɭɬɶ ɤ ɮɚɣɥɭ ɫ ɩɢɤɬɨɝɪɚɦɦɨɣ ɞɥɹ ɨɤɧɚ:
string file=
ƎD:/Books/pictures/csharp/penguin.icoƎ;
//
ɉɢɤɬɨɝɪɚɦɦɚ ɞɥɹ ɨɤɧɚ:
this.Icon=new Icon(file);
//
ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ ɦɟɬɤɢ:
Label lbl=new Label();
//
Ɍɟɤɫɬ ɦɟɬɤɢ:
lbl.Text=msg;
//
ɉɨɥɨɠɟɧɢɟ ɦɟɬɤɢ ɜ ɤɨɧɬɟɣɧɟɪɟ (ɨɤɧɟ):
lbl.Location=new Point(10,10);
lbl.Width=265; //
ɒɢɪɢɧɚ ɦɟɬɤɢ
lbl.Height=40; //
ȼɵɫɨɬɚ ɦɟɬɤɢ
//
Ɍɟɤɫɬ ɜ ɦɟɬɤɟ ɜɵɪɚɜɧɢɜɚɟɬɫɹ ɩɨ ɰɟɧɬɪɭ:
lbl.TextAlign=ContentAlignment.MiddleCenter;
//
Ɍɢɩ ɪɚɦɤɢ ɞɥɹ ɦɟɬɤɢ:
lbl.BorderStyle=BorderStyle.Fixed3D;
//
Ɉɛɴɟɤɬ ɲɪɢɮɬɚ:
Font F=new Font(
ƎArialƎ,15,FontStyle.Italic);
//
ɉɪɢɦɟɧɟɧɢɟ ɲɪɢɮɬɚ ɞɥɹ ɦɟɬɤɢ:
lbl.Font=F;
//
ɐɜɟɬ ɲɪɢɮɬɚ ɞɥɹ ɦɟɬɤɢ:
lbl.ForeColor=Color.Blue;
//
Ⱦɨɛɚɜɥɟɧɢɟ ɦɟɬɤɢ ɜ ɨɤɧɨ:
this.Controls.Add(lbl);
Приложения с графическим интерфейсом //
ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ ɤɧɨɩɤɢ:
Button btn=new Button();
//
Ɍɟɤɫɬ (ɧɚɡɜɚɧɢɟ) ɞɥɹ ɤɧɨɩɤɢ:
btn.Text=
ƎɁɚɤɪɵɬɶƎ;
//
ɉɨɥɨɠɟɧɢɟ ɢ ɪɚɡɦɟɪɵ ɤɧɨɩɤɢ:
btn.Bounds=new Rectangle(100,60,90,30);
//
ɒɪɢɮɬ ɞɥɹ ɤɧɨɩɤɢ:
btn.Font=new Font(btn.Font.Name, //
ɇɚɡɜɚɧɢɟ ɲɪɢɮɬɚ
btn.Font.Size+3, //
Ɋɚɡɦɟɪ ɲɪɢɮɬɚ
//
ɋɬɢɥɶ ɲɪɢɮɬɚ:
FontStyle.Underline|FontStyle.Bold
);
//
Ⱦɨɛɚɜɥɟɧɢɟ ɨɛɪɚɛɨɬɱɢɤɚ ɞɥɹ ɫɨɛɵɬɢɹ, ɫɜɹɡɚɧɧɨɝɨ
//
ɫɨ ɳɟɥɱɤɨɦ ɩɨ ɤɧɨɩɤɟ:
btn.Click+=delegate(object a,EventArgs b){
//
Ɂɚɜɟɪɲɟɧɢɟ ɪɚɛɨɬɵ ɩɪɢɥɨɠɟɧɢɹ:
Application.Exit();
};
//
Ⱦɨɛɚɜɥɟɧɢɟ ɤɧɨɩɤɢ ɜ ɨɤɧɨ:
this.Controls.Add(btn);
}
}
//
Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
class ButtonAndLabelDemo{
[STAThread]
//
Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
static void Main(){
//
ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ ɨɤɧɚ:
MyForm mf=new MyForm(
Ǝȼɫɟɦ ɩɪɢɜɟɬ!Ǝ, // Ɂɚɝɨɥɨɜɨɤ
ƎɈɤɧɨ ɫ ɤɧɨɩɤɨɣƎ // Ɍɟɤɫɬ ɜ ɨɤɧɟ
);
//
Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ:
Глава 8
400
Application.Run(mf);
В программе описывается класс окна MyForm, который является производным от класса Form. Все самое интересное происходит в конструкторе этого класса. В качестве аргументов конструктору передаются два текстовых значения первое msg определяет сообщение, отображаемое в окне, а второе title определяет заголовок окна. А именно, в теле конструктора командой this.Text=title свойству Text объекта окна присваивается значение title, чем определяется заголовок, отображаемый в строке названия окна НАЗ А МЕТКУ В конструкторе класса
MyForm используется три объекта для графических компонентов (объект окна, объект метки и объект кнопки, а также большое количество свойств, структур, классов, перечислений (и некоторые названия совпадают. Чтобы программный код читался легче, в теле конструктора использована явная ссылка this на объект окна (хотя необходимости в этом нет).
Размеры окна определяются командой this.Size=new Size(300,140), которой свойству Size окна присваивается экземпляр структуры Size. При создании экземпляра структуры аргументами конструктору передаются размеры окна.
При выполнении команды this.FormBorderStyle=FormBorderStyle.
FixedSingle свойству FormBorderStyle объекта окна в качестве значения присваивается константа FixedSingle (простая рамка постоянных размеров) из перечисления FormBorderStyle. Получается окно постоянных размеров, но при этому окна будет пиктограмма, которая позволяет развернуть окно навесь экран. Мы используем команду, чтобы заблокировать работу соответствующей пиктограммы для окна.
Мы используем собственную пиктограмму для окна (отображается в строке названия окна в левом верхнем углу. Для этого в текстовую переменную записывается полный путь к файлу с изображением для пиктограммы (файл penguin.ico в каталоге D:\Books\pictures\
csharp
).
Приложения с графическим интерфейсом ПОДРОБНОСТИ bОбратный слеш
\
используется в управляющих символах (таких, как
\n или
\t
). Поэтому в текстовом значении, определяющем путь к файлу, используют или слеш
/
, или двойной обратный слеш Пиктограмма для окна определяется командой this.Icon=
new
Icon(file), которой свойству Icon объекта окна присваивается ссылка на объект класса Icon. При создании объекта аргументом конструктору передается текстовая строка с полным путем к файлу сизо- бражением для пиктограммы.
Объект текстовой метки создается командой Label lbl=new Label(). Командой lbl.Text=msg определяем текст, который будет отображаться в метке. Положение метки в контейнере (которым будет окно) определяем инструкцией lbl.Location=new Point(10,10): свойству объекта метки lbl значением присваивается ссылка на объект класса Point. Размеры метки в пикселях задаем так присваиваем значения свойствам Width (ширина) и Height (высота) объекта метки. Для выравнивания текста в области метки по центру по вертикали и горизонтали свойству TextAlign объекта метки значением присваивается константа MiddleCenter из перечисления
ContentAlignment
. Тип рамки для метки определяется командой lbl.
BorderStyle=BorderStyle.Fixed3D
(метка выделяется с использованием объемного эффекта — получается вдавленная в окно метка. Также мы хотим самостоятельно определить шрифт для отображения текста в метке. Для этого создаем объект шрифта (объект F класса Font). При создании объекта (команда Font F=new Font(
ƎArialƎ,15,
FontStyle.Italic)
) аргументами конструктору класса Font передаются название шрифта
ƎArialƎ, размер шрифта 15, а также константа
Italic из перечисления FontStyle (данная константа означает, что используется курсивный шрифт. Для применения созданного шрифта для метки свойству Font объекта метки присваивается ссылка на объект шрифта (команда Мы хотим, чтобы в метке цвет текста был синим. Для этого свойству
ForeColor в качестве значения присваивается константа Blue из структуры (команда lbl.ForeColor=Color.Blue). Для добавления метки в окно мы из свойства Controls объекта окна вызываем метод
Add()
, аргументом которому передается ссылка на объект метки
Глава Также в конструкторе класса окна создается объект кнопки (команда
Button btn=new Button()). Название, которое отображается на кнопке, определяется значением свойства Text объекта кнопки. Поэтому при выполнении команды btn.Text=
ƎɁɚɤɪɵɬɶƎ определяется название кнопки. Положение и размеры кнопки определяются, когда свойству Bounds объекта кнопки присваивается ссылка на объект класса Rectangle. Конструктору класса Rectangle при создании объекта передаются четыре целых числа. Первые два числа определяют положение кнопки в контейнере (в окне. Два других числа определяют ширину и высоту кнопки НАЗ А МЕТКУ Обычно существуют разные способы определять характеристики графических компонентов. Это относится к способу определения положения графического компонента и его размеров. Мы в рассматриваемом примере используем разные способы для определения положения и размеров компонентов для окна, метки и кнопки, хотя могли бы использовать однотипные подходы. Данное разнообразие связано с желанием продемонстрировать разные подходы для решения однотипных задач.
Для кнопки мы также определяем шрифт. В этом случае свойству Font объекта кнопки btn значением присваивается ссылка на объект класса
Font
. При создании объекта шрифта первым аргументом конструктору передается значение btn.Font.Name. Это текущее название шрифта для кнопки. Проще говоря, мы используем тот шрифт, который предполагалось использовать по умолчанию. Вторым аргументом конструктору класса Font передается выражение btn.Font.Size+3. Данное значение это увеличенный на 3 текущий размер шрифта, используемый по умолчанию для отображения текста в кнопке. Наконец, третьим аргументом конструктору класса Font передается выражение FontStyle.
Underline|FontStyle.Bold
. Это две константы Underline и Bold из перечисления FontStyle, объединенные оператором |. Данное выражение означает, что используется и подчеркивание (константа
Underline
), и выделение жирным стилем (константа Для события Click кнопки, которое связано со щелчком по кнопке, добавляется обработчик, основанный на анонимном методе. В теле анонимного метода вызывается команда Application.Exit(), которой завершается работа приложения
Приложения с графическим интерфейсом ПОДРОБНОСТИ bНапомним, что события для графических компонентов относятся к делегату
EventHandler
. Этот делегат подразумевает, что метод, используемый для обработки события, должен иметь два аргумента объектная ссылка класса
Object
(ссылка на объект компонента, на котором произошло событие) и объектная ссылка класса
EventArgs
(ссылка на объект, содержащий информацию о произошедшем событии. Поэтому анонимный метод, который добавляется в список вызовов события
Click
, описывается с двумя аргумен- тами.
Для добавления кнопки в окно из свойства Controls объекта окна вызывается метод Add(), аргументом которому передана ссылка на объект кнопки НАЗ А МЕТКУ Для использования структур
Size и
Color
, классов
Icon
,
Point
,
Rectangle и
Font
, а также перечислений
ContentAlignment ив заголовке программы добавлена инструкция using
System.Drawing
. Кроме этого необходимо добавить соответствующую ссылку в проект.
В главном методе программы создается объект окна (объект mf класса
MyForm
). Этот объект передается в качестве аргумента методу Run(), который вызывается из класса Application. В результате отображается диалоговое окно (см. рис. 8.12). При закрытии окна приложение завершает работу ПОДРОБНОСТИ bМы можем закрыть окно, либо щелкнув по кнопке Закрыть, либо щелкнув по системной пиктограмме в правом верхнем углу окна. Но действия эти неэквивалентные (хотя последствия одинаковые. При щелчке по кнопке Закрыть завершается выполнение приложения. При щелчке по системной пиктограмме закрывается окно. Но поскольку в главном методе других команд нетто после этого завершается выполнение приложения
Глава Использование списков
Да, и что вы можете со своей стороны предложить из к/ф Собачье сердце»

В следующей программе мы познакомимся с таким графическим компонентом, как раскрывающийся список. Раскрывающийся список реализуется через объект класса ComboBox. Но прежде чем приступить к рассмотрению программного кода, остановимся на том, как программа работает. Так будет легче понять программный код.
При запуске программы появляется диалоговое окно, представленное на рис. 8. Рис. 8.13. Диалоговое окно с изображением волка
Половину окна занимает изображение. В правой части окна есть раскрывающийся список и кнопка
1   ...   27   28   29   30   31   32   33   34   ...   40


написать администратору сайта