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

БГУ Пособие - Программирование в C++ Builder. Учебное пособие по курсу методы программирования для студентов специальностей


Скачать 1.24 Mb.
НазваниеУчебное пособие по курсу методы программирования для студентов специальностей
АнкорБГУ Пособие - Программирование в C++ Builder.pdf
Дата26.05.2018
Размер1.24 Mb.
Формат файлаpdf
Имя файлаБГУ Пособие - Программирование в C++ Builder.pdf
ТипУчебное пособие
#19699
страница2 из 12
1   2   3   4   5   6   7   8   9   ...   12

ActiveControl
Присваивается значение обекта, на который устанавливается фокус ввода при загрузке формы
Cursor
Определяет форму указателя мыши
BorderStyle
Вид рамки объекта. Принимает значения: bsNone (нет рамки);
bsSingle (простая рамка); bsSizeable (рамка, позволяющая изменять размеры объекта мышью); bsDialog (рамка в стиле диалоговых окон); bsToolWindow (как bsSingle, но с небольшим заголовком);
bsSizeToolWin (как bsSizeable, но с небольшим заголовком)
Caption
Заголовок. Для одних объектов применяется, чтобы задать заголовок в окне или надпись на кнопке, для других – описывает их содержимое (например, у полей надписи)
Constraints
Содержит четыре подсвойства, определяющие минимальный и максимальный допустимый размер объекта
Default
Определяет, будет ли происходить для данного объекта событие
OnClick, когда пользователь нажмет клавишу Enter (для этого свойство Default должно иметь значение true)
DragKind
Определяет, можно ли объект произвольно перетаскивать по окну
(dkDrag) или же его можно перемещать как стыкуемый объект
(dkDock), который сам определяет свою форму при стыковке с другими объектами
Enabled
Определяет доступность объекта. Когда свойство Enabled имеет значение false, объект становится недоступным для пользователя
Font
Определяет шрифт, которым будут делаться все надписи внутри объекта. Содержит множество подсвойств
Height
Высота объекта
Hint
Текст подсказки, которая всплывает при наведении указателя мыши на объект. Эта подсказка будет показываться, если свойство
ShowHint установлено в true
Name
Имя объекта
PopupMenu
Контекстное меню, связанное с объектом и вызываемое при щелчке правой кнопки мыши над этим объектом. Выбирается в раскрывающемся списке доступных меню
Scaled
Если имеет значение true, то учитывается свойство PixelsPerlnch
ShowHint
Определяет, надо ли показывать всплывающую подсказку,
хранящуюся в свойстве Hint
Top
Верхняя координата объекта на компоненте-родителе
Visible
Определяет, будет ли видим объект во время работы программы
(по умолчанию – false)
Width
Ширина объекта

14
Рис. 6. Результат вывода формы в немодальном режиме
В результате получим следующий головной файл проекта:
USERES("Project2.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", AboutBox);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){ try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TAboutBox), &AboutBox);
Application->Run();
} catch (Exception &exception)
{
Application->ShowException(&exception);
} return 0;
}
Закроем форму AboutBox по нажатию кнопки OK. Для этого запишем следующий обработчик события для кнопки: void __fastcall TAboutBox::OKButtonClick(TObject *Sender)
{

15
Close();
}
На рис. 7 показан результат выполнения приложения.
Рис. 7. Приложение с двумя формами
Для создания MDI приложения надо поменять свойство формы
FormStyle с fsNormal на fsMDIForm. После этого новая подчиненная форма создается вместе с изменением свойства FormStyle на fsMDIChild.
При попытке закрытия подчиненная форма сворачивается. Чтобы закрыть подчиненную форму, можно в обработчике события FormClose набрать: Action=caFree;.
Диалоговые окна. Кроме оконных форм для вывода и ввода строк можно использовать диалоговые окна. Первое окно, используемое для вывода вызывается функцией ShowMessage(): void __fastcall TForm1::FormClick(TObject *Sender)
{
ShowMessage("Вывод в окно ShowMessage");
}
Это окно открывается модально.

16
Второе окно, используемое как для вывода, так и для ввода, вызывается функцией InputBox(): void __fastcall TForm1::FormKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
String Name=InputBox("InputBox","What is your name","");
}
Результаты выполнения этих функций приведены на рис. 8.
Рис. 8. Примеры диалоговых окон
Окна для ввода и вывода можно также вызывать с помощью методов
InputQuery("str1","str2", inputstr) и MessageDlg(str, mtInformation,
TMsgDlgButtons() << mbOK, 0). Рассмотрим пример: void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{ String Name;
InputQuery("InputQuery","Prompt",Name);
MessageDlg("MessageDlg:"+Name, mtInformation, TMsgDlgButtons() << mbOK,
0);
}
Результаты выполнения функции приведены на рис. 9.
Рис. 9. Результаты вывода диалоговых окон
Вопросы
1. Из каких файлов состоит приложение C++Builder и как организо- ваны эти файлы?

17 2. Какие коды автоматически генерируются в головном файле при- ложения при создании этого приложения?
3. В чем отличие действия команд Run, Make и Build при работе с проектом?
4. Каково назначение окон Инспектора объектов?
5. Для чего используется окно Редактора кода ?
6.
Что содержит файл представления формы ( .dfm)?
7. Что такое событие и как создать обработчик события для компо- ненты?
8. Какие существуют отличия модальной формы, SDI и MDI форм?
9. Что находится в разделах __published, private и public класса в за- головочном файле формы Unit.h?
10. Что произойдет в результате выполнения кода:
{Form1->Button1Click(Form1);}
11. Что произойдет в результате выполнения кода:
Form1->WindowState = wsMaximized;
Form1->WindowState = wsMinimized;
Form1->WindowState = wsNormal;
Упражнения
1. Создать приложение, состоящее из модальной и SDI форм. Создать кнопки для закрытия этих форм. Изменить свойства форм.
2. Создать приложение, состоящее из формы AboutBox и двух MDI форм. Создать кнопки для закрытия этих форм. Изменить свойства форм.
3. Создать форму и написать несколько обработчиков событий, свя- занных с созданием и изменением свойств формы.
4. Из окна редактирования (Edit) ввести символьную строку и преоб- разовать в целое и вещественное числа. При преобразовании в число предусмотреть обработку исключительной ситуации
5. Разработать калькулятор, реализующий арифметические операции и операции со стандартными функциями.
6. Разработать калькулятор для перевода чисел в двоичную, восьме- ричную и шестнадцатеричную системы счисления и реализовать основ- ные операции.
7. Разработать калькулятор для работы с комплексными числами и реализовать основные операции.

18
1. C++BUILDER И ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ
1.1. Классы, компоненты и объекты
C++Builder использует понятие компонентов – специальных классов, содержащих, кроме обычных данных-членов класса и методов, также свойства и события. Свойства и события позволяют манипулировать ви- дом и функциональным поведением компонентов как на стадии проекти- рования приложения, так и во время его выполнения.
Свойства (properties) компонентов представляют собой расширение понятия данных-членов и используют ключевое слово __property для объявления. При помощи событий (events) компонент сообщает пользо- вателю о том, что на нее оказано некоторое воздействие. Обработчики
событий (event handlers) представляют собой методы, реализующие ре- акцию программы на возникновение событий. Типичные события – на- жатие кнопки или клавиши на клавиатуре. Компоненты имеют ряд осо- бенностей:
• Все компоненты являются прямыми или косвенными потомками класса TComponent. При этом иерархия наследования следующая: Tob- ject->Tpersistent-> Tcomponent->Tcontrol->… .
• Компоненты используются непосредственно, они не могут служить базовыми классами для построения новых подклассов.
• Компоненты размещаются только в динамической памяти с помо- щью оператора new.
• Компоненты можно добавлять к Палитре компонентов и манипули- ровать с ними посредством Редактора форм.
1.2. Разработка классов
C++Builder дает возможность объявить базовый класс, который ин- капсулирует имена свойств, данных, методов и событий. Каждое объяв- ление внутри класса определяет привилегию доступа к именам класса в зависимости от того, в каком разделе имя появляется. Каждый раздел на- чинается с одного из ключевых слов: private, protected и public, опреде- ляющих возможности доступа к элементам соответствующего раздела.
Рассмотрим пример объявления класса. Отметим объявление свойст- ва Count в защищенном разделе, а метода SetCount, реализующего запись в данное Fcount, – в закрытом разделе.

19
class TPoint {
private:
int FCount; // Закрытый член данных
void __fastcall SetCount(int Value);
protected:
__property int Count = // Защищенное свойство
{ read= FCount, write=SetCount };
double x; // Защищенный член данных
double у; // Защищенный член данных
public:
TPoint(double xVal, double yVal); // Конструктор
double getX();
double getY();
};
Объявления класса и определения методов обычно хранятся в разных файлах (с расширениями .h и .срр, соответственно). Следующий пример показывает, если методы определяются вне класса, то их имена следует уточнять с помощью имени класса.
TPoint::TPoint(double xVal, double yVal)
{ // Тело конструктора
}
void __fastcall TPoint::SetCount( int Value ){
if ( Value != FCount )
{
FCount = Value; // Запись нового значения
Update(); // Вызов метода Update
}
}
double TPoint::getX(){
// Тело метода getX(), объявленного в классе TPoint
}
1.3. Объявление производных классов
C++Builder дает возможность объявить производный класс, который наследует свойства, данные, методы и события всех своих предшествен- ников в иерархии классов, а также может объявлять новые характеристи- ки и перегружать некоторые из наследуемых функций. Объявление про- изводного класса можно выполнить следующим образом:
class derivedClass : [<спецификатор доступа>] parentClass {
private:
<закрытые данные-члены>
<закрытые методы>
protected:
<защищенные данные-члены>

20
<защищенные методы>
public:
<открытые свойства>
<открытые данные-члены>
<открытые конструкторы>
<открытый деструктор>
<открытые методы>
__published:
<опубликованные свойства>
<опубликованные данные-члены>
<объявления дружественных функций>
};
Отметим появление нового раздела с ключевым словом __published – дополнение, которое C++Builder вводит в стандарт ANSI C++ для объяв- ления опубликованных элементов компонентных классов. Этот раздел отличается от раздела public только тем, что компилятор генерирует ин- формацию RTTI (информация времени выполнения) о свойствах, дан- ных-членах и методах объекта и C++Builder организует передачу этой информации Инспектору объектов.
Когда класс порождается от базового, все имена базового класса в производном классе автоматически становятся закрытыми по умолчанию
(если спецификатор доступа при наследовании не указывается). Но это можно изменить, указав следующие спецификаторы доступа при насле- довании базового класса:
• protected. Наследуемые (т.е. защищенные и открытые) имена базо- вого класса становятся защищенными в экземплярах производного клас- са.
• public. Открытые имена базового класса и его предшественников будут открытыми в экземплярах производного класса, а все защищенные останутся защищенными.
Рассмотрим применение методики расширения и ограничения харак- теристик на примере создания разновидностей кнопки при наследовании базового компонента TButtonControl из Библиотеки Визуальных Компо- нентов. Базовый класс TButtonControl способен с помощью родительско- го метода Draw отображать кнопку в виде двух вложенных прямоуголь- ников: внешней рамки и внутренней закрашенной области. Чтобы соз- дать простую кнопку без рамки, нужно построить производный класс
SimpleButton, использовав в качестве родительского TButtonControl, и перегрузить метод Draw:
class SimpleButton: public TButtonControl {
public:
SimpleButton(int x, int y) ;

21
void Draw() ;

SimpleButton() { }
};
SimpleButton::SimpleButton(int x, int y) : TButtonControl(x, y)
{ }
void SimpleButton::Draw()
{outline->Draw();}
Единственная задача конструктора объекта для SimpleButton – вы- звать конструктор базового класса с двумя параметрами. Именно пере- определение метода SimpleButton:: Draw () предотвращает вывод обво- дящей рамки кнопки (как происходит в родительском классе). Чтобы из- менить код метода, надо изучить его по исходному тексту базового ком- понента TButtonControl.
Создадим кнопку с пояснительным названием. Для этого нужно по- строить производный класс TextButton из базового TButtonControl и пе- регрузить метод Draw с расширением его функциональности:
class Text {//Вспомогательный класс
public:
Text(int x, int y, char* string) { }
void Draw() { }
};
class TextButton: public TButtonControl {
Text* title;
public:
TextButton(int x, int y, char* title);
void Draw();
TextButton() { }
};
TextButton::TextButton(int x, int y, char* caption):
TButtonControl(x, y) { title = new Text(x, y, caption);
}
void TextButton::Draw () {
TButtonControl::Draw() ; title->Draw() ;
}
1.4. Идентификация типов времени выполнения RTTI
Идентификация типов при выполнении программы RTTI (Run-Time
Туре Identification) позволяет вам написать переносимую программу, ко- торая способна определять фактический тип объекта в момент выполне- ния даже в том случае, если программе доступен только указатель на этот объект. Это дает возможность, например, преобразовывать тип ука-

22
зателя на базовый класс в указатель на производный тип фактического объекта данного класса. Таким образом, преобразование типов может происходить не только статически – на фазе компиляции, но и динамиче- ски – в процессе выполнения. Динамическое преобразование указателя в заданный тип осуществляется с помощью оператора dynamic_cast.
Механизм RTTI также позволяет проверять, имеет ли объект некото- рый определенный тип, или принадлежат ли два объекта одному и тому же типу. Оператор typeid определяет фактический тип аргумента и воз- вращает указатель на объект класса typeinfo, который этот тип описыва- ет.
Передавая RTTI Инспектору объектов во время выполнения,
C++Builder информирует его о типах свойств и членов данного класса.
1.5. Пакеты
Пакеты – это особый тип динамических библиотек DLL для Windows.
Как и обычные DLL, пакетные файлы BPL (Borland Package Library) со- держат код, разделяемый многими приложениями. C++Builder размещает наиболее часто используемые компоненты в пакете под названием
VCL50.BPL. При создании исполняемого кода приложения в нем остают- ся только уникальные инструкции и данные, а разделяемый код подгру- жается из указанных пакетов во время исполнения.
Объявление нового компонентного класса в интерфейсном модуле должно включать предопределенный макрос PACKAGE сразу же за ключевым словом class: class PACKAGE MyComponent : ...
Этот же макрос должен присутствовать в кодовом модуле там, где объявлена функция регистрации компонента: void __fastcall PACKAGE Register(){…}
Образующийся при подстановке макроса PACKAGE код обеспе- чивает возможность импортирования и экспортирования объявленного компонентного класса в результирующий файл с расширением BPL. Ес- ли при создании нового компонента вы пользуетесь мастером (по коман- де Component | New Component), C++Builder автоматически вводит
PACKAGE в нужное место.
1.6. Объявления компонентных классов
Опережающие объявления классов Библиотеки Визуальных Ком- понентов VCL, входящей в состав C++Builder, используют модификатор
_declspec:

23
_declspec(<спецификатор>)
Это ключевое слово может появляться в любом месте перечня объявлений, причем спецификатор принимает одно из следующих значений:
delphiclass используется для опережающего объявления прямых или косвенных производных от VCL-класса TObject;
delphireturn используется для опережающего объявления прямых или косвенных производных от VCL-классов Currency, AnsiString,
Variant, TDateTime и Set. Он определяет правила совместимости VCL при обращении с параметрами и возвращаемыми значениями функций- членов.
pascalimplementation указывает, что компонентный класс реализован на Объектном Паскале.
1.7. Объявления свойств
C++BuiIder использует модификатор _property для объявления свойств компонентных классов. Синтаксис описания свойства имеет вид:
_property <тип свойства> <имя свойства> = {<список атрибутов>} ;
Список атрибутов содержит перечисление следующих атрибутов свойства:
write = < член данных или метод записи > – определяет способ при- сваивания значения члену данных;
read = < член данных или метод чтения > – определяет способ по- лучения значения члена данных;
default = < булева константа > – разрешает или запрещает сохране- ние значения свойства по умолчанию в файле формы *.dfm;
stored = < булева константа или функция > – определяет способ со- хранения значения свойства в файле формы с расширением *.dfm.
C++BuiIder использует модификатор __published для спецификации тех свойств компонентов, которые будут отображаться Инспектором объектов на стадии проектирования приложения. Правила видимости, определяемые этим ключевым словом, не отличаются от правил видимо- сти членов данных, методов и свойств, объявленных как
1   2   3   4   5   6   7   8   9   ...   12


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