Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / ООП.Builder / Lab2C++

.doc
Скачиваний:
14
Добавлен:
17.04.2013
Размер:
153.09 Кб
Скачать

8

МГИЭТ(ТУ)

Кафедра ВТ

факультет МПиТК

Лабораторная работа №2

«Базовые компоненты C++ Builder и их применение при написании Windows-приложений

(компилятор «Borland C++ Builder»)»

Составил: ст.пр. Тельминов О.А.

09/2001 г.

Цель работы: изучить основные компоненты C++Builder и получить навыки программирования в среде Windows

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

  • теоретическую часть (указанные функции)

  • полные листинги программ

  • полностью выполнить все указания лабораторной работы

  • ответы на вопросы, поставленные в лабораторной работе

Порядок выполнения работы

1. Windows-программа

    1. Создайте свою папку. Запустите компилятор BorlandC++Builder.

    2. Сохраните новый проект в отдельную папку. Для этого выполните File/SaveAll (или на панели инструментов), но не Save! Откройте свою папку, сохраните файл unit1, затем Project1. Итак, вы должны сохранить 2 файла в свою папку. Это важно. В дальнейшей работе не забывайте время от времени сохранять все файлы вашего проекта этой командой!

    3. Запустите приложение (=ваша программа под Windows), осуществите перемещение мышью главной формы вашей программы. Форма – основа приложения, на которой в дальнейшем разместим кнопки, поля ввода и др. Запустите Калькулятор среды Windows и проведите аналогию между этими приложениями. Итак, вы получили приложение для Windows!

    4. Закройте (обязательно) свою работающую программу. В среде разработки освойте переход между ObjectInspector, Form1 и редактором текста программы. Для этого нажмите F11 несколько раз.

    5. Найдите компонент TButton и поместите его на форму Form1. Получившаяся кнопка автоматически названа Button1.

    1. Правила обращения с объектом в редакторе 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».

    1. Активизируйте объект Form1. Измените его свойство Caption. Изучите свойство Color. Запомните названия 3-х цветов. Сделайте еще 3 кнопки класса TButton, озаглавьте их названиями цветов («красный» и т.п.). Программа: при нажатии на эти кнопки форма Form1 должна менять цвет.

    2. Компонент TEdit – поле ввода. Поместите его (Edit1) на форму.

  • изучите его свойство Text в Object Inspector, проверяя реакцию Edit1

  • запустите приложение, проверьте начальное значение, введите новое, закройте приложение

    1. Аналогично – свойство Caption компонента TLabel

    2. Сделайте кнопку «Добавить *» и разместите ее около Edit1. В обработчик OnClick запишите:

{

String s; //тип для работы со строками

s = Edit1 -> Text; // текстовое содержимое попадает в s

s = s + “*”; // добавляем звезду в хвост строки

Edit1 -> Text = s; // обновляем текстовое содержимое Edit1

}

  • ВНИМАНИЕ! Свойства Text, Caption имеет тип TString

    1. Преобразование чисел в строки и обратно. Включите в свою программу и выполните следующий фрагмент (добавьте необходимые компоненты).

{

//пусть в 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-м функциям для преобразования число–текст и обратно, законспектируйте

    1. Компонент 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

    1. Загрузка и сохранение и текста в TMemo: изучите в своей программе 2 функции, указывая в кавычках путь к файлу и его имя. Важно, что слэш нужно писать дважды! Учтите, что файлы читаются в Memo в текстовом формате в Win-кодировке. Аналогично с записью содержимого Memo.

Memo1 -> Lines -> LoadFromFile (“d:\\MpiTK\\MP23\\green.txt”);

Memo1 -> Lines -> SaveToFile (“d:\\MpiTK\\MP23\\green.dat”);

    1. Стандартный диалог для открытия файла

  • поместите OpenDialog (Dialogs) на форму

  • задайте обработчик для кнопки «открыть»

if (OpenDialog1->Execute())

{

ShowMessage(OpenDialog1->FileName);

}

  • запустите и исследуйте: нажмите кнопку «открыть» и выберите файл. Что произошло? Объясните.

  • еще раз нажмите кнопку «открыть», но откажитесь от выбора посредством закрытия диалога (Esc или мышью). Объясните.

  • функция Execute() приводит к появлению диалогового окна. Она возвращает нуль, если пользователь отказался от сохранения, и не-нуль при выборе конкретного имени файла, которое будет помещено в свойство OpenDialog1->FileName. Используйте это свойство для получения имени файла.

    1. Изучите SaveDialog аналогично предыдущему OpenDialog

    2. Сделайте пункт 1.13 с использованием стандартных диалогов SaveDialog и OpenDialog

    3. Изучите TCheckBox и свойство Checked.

    4. Изучите ListBox

    5. Изучите ComboBox

    6. Откройте 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: – для пользовательских функций, переменных и др.

    1. Добавьте глобальную (она будет доступна в любой части программы, а не только в какой-то конкретной функции) переменную в раздел public:

public: // User declarations

int GlobalInt; //выделили память. Инициализировать НЕ здесь

    1. Обратите на функцию __fastcall TForm1(TComponent* Owner); в разделе public. Это – конструктор (специальная функция) формы, вызывается один раз при запуске приложения. В нем нужно инициализировать глобальные переменные. Найдите тело этого конструктора в unit1.cpp, модифицируйте его:

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

GlobalInt = 10; //место для инициализации глобальных переменных

}

Итак, глобальные переменные нужно помещать в раздел public: файла .h, а инициализировать (задавать начальное значение) – в конструкторе формы (например, TForm1 для формы Form1).

Теперь вы способны создавать приложения для Windows. Улучшайте свои навыки дальше в процессе выполнения следующих задач.

  1. Задачи.

  1. Загрузите текстовый файл в 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 хранится фамилия

  1. Пользователь пытается сохранить файл, а файл с таким именем уже существует. Откройте 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(“Вы выбрали: сохранить файл поверх”);

//и т.д.

  1. Реализуйте калькулятор. На форме должны быть кнопки 0…9, точка, сброс в нуль и 4 арифметических действия. Указание: для кнопок 0…9 сделайте единый обработчик события OnClick, в нем идентифицируйте нажатую кнопку.

  2. Магазин с 3 отделами. При запуске программа считывает наименования товара и его цену в скобках примус(245,00) из файлов Отдел1.txt, Отдел2.txt, Отдел3.txt. На экране можно выбрать по несколько товаров из разных отделов нажать «заказать» и получить чек с указанием товара, стоимости, отдела, и общую сумму. Кнопкой «редактировать» можно изменить цену товара, «сохранить» – записать изменения в исходный .txt.

Соседние файлы в папке ООП.Builder