МГИЭТ(ТУ)
Кафедра ВТ
факультет МПиТК
Лабораторная работа №2
«Базовые компоненты C++ Builder и их применение при написании Windows-приложений
(компилятор «Borland C++ Builder»)»
Составил: ст.пр. Тельминов О.А.
09/2001 г.
Цель работы: изучить основные компоненты C++Builder и получить навыки программирования в среде Windows
Отчетность: каждый студент должен иметь протокол (рукописный или отпечатанный) выполнения работы, включающий в себя:
-
теоретическую часть (указанные функции)
-
полные листинги программ
-
полностью выполнить все указания лабораторной работы
-
ответы на вопросы, поставленные в лабораторной работе
Порядок выполнения работы
1. Windows-программа
-
Создайте свою папку. Запустите компилятор BorlandC++Builder.
-
Сохраните новый проект в отдельную папку. Для этого выполните File/SaveAll (или на панели инструментов), но не Save! Откройте свою папку, сохраните файл unit1, затем Project1. Итак, вы должны сохранить 2 файла в свою папку. Это важно. В дальнейшей работе не забывайте время от времени сохранять все файлы вашего проекта этой командой!
-
Запустите приложение (=ваша программа под Windows), осуществите перемещение мышью главной формы вашей программы. Форма – основа приложения, на которой в дальнейшем разместим кнопки, поля ввода и др. Запустите Калькулятор среды Windows и проведите аналогию между этими приложениями. Итак, вы получили приложение для Windows!
-
Закройте (обязательно) свою работающую программу. В среде разработки освойте переход между ObjectInspector, Form1 и редактором текста программы. Для этого нажмите F11 несколько раз.
-
Найдите компонент TButton и поместите его на форму Form1. Получившаяся кнопка автоматически названа Button1.
-
Правила обращения с объектом в редакторе Object Inspector (сначала выделите мышью нужный объект Button1)
-
свойство объекта
-
изменение свойства (закладка Properties): найдите свойство Caption (заголовок) и задайте ему значение Кнопка. Проверьте результат.
-
изучите самостоятельно свойства Width, Height, Left, Top объекта Button1.
-
-
событие объекта
-
при [движении мыши, нажатии на клавишу и др.] Windows генерирует событие и посылает его в вашу программу. Если в программе есть обработчик события, то автоматически будет выполнена соответствующая функция. Проверим на примере.
-
Активизируйте закладку Events (события) вместо Properties в Object Inspector, найдите OnClick, дважды щелкните по полю ввода. В редакторе появится:
-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
}
-
Что же получилось? Мы связали событие «щелкнуть мышью OnClick» для объекта Button1 с функцией Button1Click. Рассмотрим эту функцию:
имя функции: Button1Click
функция принадлежит (оператор ::) классу: TForm1
принимаемые аргументы: Sender, тип TObject * (т.е указатель)
тип возвращаемого значения: void (т.е эта функция ничего не возвращает)
ключевое слово __fastcall указывает на порядок передачи аргументов (для нас несущественно)
скобки { } ограничивают начало и конец тела функции (как begin и end в TPascale)
-
ВНИМАНИЕ! эта функция сгенерирована автоматически, поэтому если ее тело будет оставлено пустым, то при сохранении функция удалится. В этом случае снова проделайте операцию с событием OnClick
-
Итак, содержимое тела этой функции будет выполняться всякий раз при нажатии на кнопку Button1 нашей программы в процессе ее работы. Измените тело функции:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Width = Button1->Width + 1;
}
-
Мы указали имя объекта Button1 и получили доступ к его свойству Width с помощью оператора доступа ->
-
Запустите приложение и щелкните несколько раз на кнопке Button1. Объясните результат. Закройте приложение и вернитесь в среду разработки.
-
ВНИМАНИЕ! Если записать
((TButton*) Sender) –>Caption,
то получим доступ к свойству Caption того объекта, который породил вызов функции Button1Click. Это актуально, когда для нескольких кнопок используется одна и та же функция Button1Click, в которой нужно узнать заголовок щелкнутой кнопки.
-
Сделайте 3 кнопки и единый обработчик OnClick для них. Для этого с помощью ObjectInspector добейтесь, чтобы напротив OnClick было указано одна и та же функция для 3-х кнопок. Программа: заголовок нажатой кнопки должен изменится на «аbc».
-
Активизируйте объект Form1. Измените его свойство Caption. Изучите свойство Color. Запомните названия 3-х цветов. Сделайте еще 3 кнопки класса TButton, озаглавьте их названиями цветов («красный» и т.п.). Программа: при нажатии на эти кнопки форма Form1 должна менять цвет.
-
Компонент TEdit – поле ввода. Поместите его (Edit1) на форму.
-
изучите его свойство Text в Object Inspector, проверяя реакцию Edit1
-
запустите приложение, проверьте начальное значение, введите новое, закройте приложение
-
Аналогично – свойство Caption компонента TLabel
-
Сделайте кнопку «Добавить *» и разместите ее около Edit1. В обработчик OnClick запишите:
{
String s; //тип для работы со строками
s = Edit1 -> Text; // текстовое содержимое попадает в s
s = s + “*”; // добавляем звезду в хвост строки
Edit1 -> Text = s; // обновляем текстовое содержимое Edit1
}
-
ВНИМАНИЕ! Свойства Text, Caption имеет тип TString
-
Преобразование чисел в строки и обратно. Включите в свою программу и выполните следующий фрагмент (добавьте необходимые компоненты).
{
//пусть в Edit2->Text строка “3.141592”. Получим вещественное число:
float fs; // также и для типа double
fs = StrToFloat (Edit2->Text);
//пусть в Edit3->Text строка “–5”. Получим целое число:
int is; // можно любой знаковый целый тип
is = StrToInt (Edit2->Text);
//обнулим строки (например)
Edit2->Text = “”;
Edit3->Text = “”;
// поместим сумму в заголовок
float sum = fs + is;
Label1->Caption = FloatToStr(sum);
// целое в строку
String st = IntToStr(s);
}
-
из этого текста уясните назначение и правила вызова 4-х выделенных функций
-
проанализируйте программу и получившийся результат после выполнения
-
получите помощь по этим 4-м функциям для преобразования число–текст и обратно, законспектируйте
-
Компонент TMemo. Поместите на форму. Запустите. Введите текст. Закройте приложение. Изучите:
-
свойство Lines
-
свойство WordWrap
-
свойство Alignment
-
изучите фрагмент:
{
//(нумерация строк с нуля!)
// Memo1 -> Lines – доступ ко всем строкам
Memo1 -> Lines –>Clear (); // вызов функции компонента для//
//очистки всех строк
Memo1 -> Lines –>Add(“еще одна строка”); // добавление строки. Можно
//передать константу в кавычках или объект типа String
Memo1 -> Lines ->Delete( k ); // удаляет строку с номером int k
Memo1 -> Lines ->Strings[2] = “Yahoo!”; //доступ к строке по номеру
// строка с таким номером должна существовать!
int c=Memo1 -> Lines ->Count; //вычисляет кол-во строк
}
-
ВНИМАНИЕ! Объект может иметь как свойства, так и функции (=методы). Функции обязательно имеют скобки ( ), а свойства – никогда.
-
установите WordWrap=false. Программа: задействуйте в ней все указанные выше свойства и функции для Memo1. Разместите рядом с Memo1 несколько кнопок. Например, пусть поле ввода Edit5 будет содержать номер редактируемой строки, Edit6 – новое значение строки. При нажатии кнопки «заменить» осуществить проверку существования строки с таким номером, и заменить ее содержимым Edit6. Формат if:
if (условие) операторЕслиИстина; //важна точка с запятой перед else!
else операторЕслиЛожь;
-
задействуйте в своей программе все остальные рассмотренные выше свойства и функции Memo1
-
Загрузка и сохранение и текста в TMemo: изучите в своей программе 2 функции, указывая в кавычках путь к файлу и его имя. Важно, что слэш нужно писать дважды! Учтите, что файлы читаются в Memo в текстовом формате в Win-кодировке. Аналогично с записью содержимого Memo.
Memo1 -> Lines -> LoadFromFile (“d:\\MpiTK\\MP23\\green.txt”);
Memo1 -> Lines -> SaveToFile (“d:\\MpiTK\\MP23\\green.dat”);
-
Стандартный диалог для открытия файла
-
поместите OpenDialog (Dialogs) на форму
-
задайте обработчик для кнопки «открыть»
if (OpenDialog1->Execute())
{
ShowMessage(OpenDialog1->FileName);
}
-
запустите и исследуйте: нажмите кнопку «открыть» и выберите файл. Что произошло? Объясните.
-
еще раз нажмите кнопку «открыть», но откажитесь от выбора посредством закрытия диалога (Esc или мышью). Объясните.
-
функция Execute() приводит к появлению диалогового окна. Она возвращает нуль, если пользователь отказался от сохранения, и не-нуль при выборе конкретного имени файла, которое будет помещено в свойство OpenDialog1->FileName. Используйте это свойство для получения имени файла.
-
Изучите SaveDialog аналогично предыдущему OpenDialog
-
Сделайте пункт 1.13 с использованием стандартных диалогов SaveDialog и OpenDialog
-
Изучите TCheckBox и свойство Checked.
-
Изучите ListBox
-
Изучите ComboBox
-
Откройте Unit1.h. Он должен содержать подобное:
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TMemo *Memo1;
TCheckBox *CheckBox1;
TOpenDialog *OpenDialog1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
-
в Билдере существует некий класс TForm, предназначенный для работы с окнами.
-
Билдер автоматически при построении проекта создал форму Form1 класса TForm1.
-
Класс TForm1 полностью унаследовал всё, что было в базовом для него классе TForm., но добавилось следующее:
-
раздел __published: здесь описаны все компоненты и функции для них, находящиеся на форме (автоматически)
-
разделы private: и public: – для пользовательских функций, переменных и др.
-
Добавьте глобальную (она будет доступна в любой части программы, а не только в какой-то конкретной функции) переменную в раздел public:
public: // User declarations
int GlobalInt; //выделили память. Инициализировать НЕ здесь
-
Обратите на функцию __fastcall TForm1(TComponent* Owner); в разделе public. Это – конструктор (специальная функция) формы, вызывается один раз при запуске приложения. В нем нужно инициализировать глобальные переменные. Найдите тело этого конструктора в unit1.cpp, модифицируйте его:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
GlobalInt = 10; //место для инициализации глобальных переменных
}
Итак, глобальные переменные нужно помещать в раздел public: файла .h, а инициализировать (задавать начальное значение) – в конструкторе формы (например, TForm1 для формы Form1).
Теперь вы способны создавать приложения для Windows. Улучшайте свои навыки дальше в процессе выполнения следующих задач.
-
Задачи.
-
Загрузите текстовый файл в Memo в формате «группа пробел фамилия» МП-22_Зорин. Пользователь выбирает режим сортировки: только по группам или по группам и фамилиям внутри групп, по возрастанию/убыванию.
Примечание. Работа со строками класса AnsiString
пусть обрабатываемая строка равна:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
М |
П |
– |
2 |
2 |
|
З |
о |
р |
и |
н |
int Len=Memo1->Lines->Strings[0].Length(); //длина начальной строки Memo1
// нумерация строк с 0!!!
int posSpace=Memo1->Lines->Strings[0].Pos(“ “); // позиция пробела в строке 0.
//для класса AnsiString нумерация символов в строке с 1!!!
String tmp; //переменная для хранения временной строки
tmp = Memo1->Lines->Strings[0].SubString (
posSpace+1, //с какого символа начинаем копировать
Len-posSpace //количество символов, копируемых из строки
);
//теперь в tmp хранится фамилия
-
Пользователь пытается сохранить файл, а файл с таким именем уже существует. Откройте Word или подобный и изучите поведение программы при аналогичной попытке. Нарисуйте в конспекте блок-схему, включающую всевозможные действия пользователя. Реализуйте этот алгоритм в Билдере (SaveDialog). Указание: используйте
if (FileExists(“c:\\windows\\calc.exe”)) … //файл существует?
Примечание. Получите помощь по MessageDlg.
extern PACKAGE int __fastcall MessageDlg(const AnsiString Msg, TMsgDlgType DlgType, TMsgDlgButtons Buttons, int HelpCtx);
Пример вызова:
TMsgDlgButtons s << mbYes << mbNo << mbCancel; //
int ret = MessageDlg (“Файл существует.\n Сохранить поверх?”, //текст вопроса
mtWarning, // картинка на диалоге
s, //кнопки ответа
0// КонтекстПомощи
);
//Программа ждет реакции пользователя. После этого в ret помещается одно из значений:
//mrNone, mrAbort, mrYes, mrOk, mrRetry, mrNo, mrCancel, mrIgnore, mrAll
//теперь проверим, что же выбрал юзер:
if (ret == mrYes) ShowMessage(“Вы выбрали: сохранить файл поверх”);
//и т.д.
-
Реализуйте калькулятор. На форме должны быть кнопки 0…9, точка, сброс в нуль и 4 арифметических действия. Указание: для кнопок 0…9 сделайте единый обработчик события OnClick, в нем идентифицируйте нажатую кнопку.
-
Магазин с 3 отделами. При запуске программа считывает наименования товара и его цену в скобках примус(245,00) из файлов Отдел1.txt, Отдел2.txt, Отдел3.txt. На экране можно выбрать по несколько товаров из разных отделов нажать «заказать» и получить чек с указанием товара, стоимости, отдела, и общую сумму. Кнопкой «редактировать» можно изменить цену товара, «сохранить» – записать изменения в исходный .txt.