Лабораторные работы МИРЭА 2014 (1017113), страница 18
Текст из файла (страница 18)
Листинг 4. Функции обработки событий на компонентах формы программы "Сила тока"
// щелчок на кнопке Вычислить
void__fastcall TForm1::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// проверим, введены ли данные в поля Напряжение и Сопротивление
if (((Edit1-XText).Length()==0)||((Edit2->Text).Length()==0))
{
MessageDlg("Haдo ввести напряжение и сопротивление",
mtlnformation, TMsgDlgButtons()<<mbOK,0);
if ((Edit1->Text).Length()==0)
Edit1->SetFocus(); // курсор в поле Напряжение else
Edit2->SetFocus();// курсор в поле Сопротивление
return;
};
// получить данные из полей ввода
u = StrToFloat(Edit1->Text);
r = StrToFloat(Edit2->Text);
// вычислить силу тока
try {
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2->SetFocus(); //курсор в поле Сопротивление
return;
}
// вывести результат в поле Label4
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + " А";
}
// нажатие клавиши в поле Напряжение
void __fastcall TForm1::EditlKeyPress(TObject *Sender, char SKey)
{
/* коды запрещенных клавиш заменим нулем, в результате символы этих клавиш в поле редактирования не появятся
Key — код нажатой клавиши
проверим, является ли символ допустимым */
if ((Key>='0')&&(Key<='9'}) // цифра
return;
/* Глобальная переменная DecimalSeparator
содержит символ, используемый в качестве разделителя
при записи дробных чисел */
if ( Key == DecimalSeparator)
{
if ((Edit1->Text).Pos(DecimalSeparator)!=0)
Key =0; // разделитель уже введен
return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
{
Edit2->SetFocus();
return;
};
// остальные клавиши запрещены
Key =0; // не отображать символ
}
// нажатие клавиши в поле Сопротивление
void__fastcall TForm1::Edit2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if ((Key>='0')&&(Key<='9')) // цифра
return;
if ( Key == DecimalSeparator)
{
if ( (Edit2->Text).Pos(DecimalSeparator) != 0)
Key =0; // разделитель уже введен
return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return; <
if ( Key == VK_RETORN) // клавиша <Enter>
(
Button1->SetFocus();//переход к кнопке Вычислить
// повторное нажатие клавиши <Enter>
// активизирует процесс вычисления тока
return;
};
// остальные клавиши запрещены
Key = 0; //не отображать символ
}
// щелчок на кнопке Завершить
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close(); // закрыть форму приложения
}
Настройка приложения
После того как программа отлажена, необходимо выполнить ее окончательную настройку: задать название программы и значок, который будет изображать исполняемый файл приложения в папке, на рабочем столе и на Панели задач, во время работы программы.
Название программы
Название программы отображается во время ее работы в панели задач Windows, а также в заголовках окон сообщений, выводимых функцией ShowMessage. Название программы надо ввести в поле Title (рис. 44) вкладки Application диалогового окна Project Options, которое появляется в результате выбора в меню Project команды Options.
Рис. 38. Название программы надо ввести в поле Title
Значок приложения
Чтобы назначить приложению значок, отличный от стандартного, нужно в меню Project выбрать команду Options и в открывшемся окне на вкладке Application щелкнуть на кнопке Load Icon. В результате этих действий откроется стандартное окно, используя которое можно просмотреть каталоги и найти подходящий значок (значки хранятся в файлах с расширением ico).
В состав C++ Builder входит утилита Image Editor (Редактор изображений), при помощи которой программист может создать для своего приложения уникальный значок. Запустить Image Editor можно из C++ Builder, выбрав в меню Tools команду Image Editor, или из Windows — командой Пуск|Программы|BorlandC++ Builder|Image Editor.
Чтобы начать работу по созданию нового значка, нужно в меню File выбрать команду New | Icon File (рис. 43).
Рис. 43. Начало работы над новым значком
После выбора типа создаваемого файла открывается окно Icon Properties (рис. 44), в котором необходимо выбрать характеристики создаваемого значка: Size (Размер) — 32x32 (стандартный размер значков Windows) и Colors (Палитра) — 16 цветов. В результате нажатия кнопки ОК открывается окно Iconl.ico (рис. 45), в котором можно, используя стандартные инструменты и палитру, нарисовать нужный значок.
Рис. 44. Стандартные характеристики значка
Рис. 45. Начало работы над новым значком
Процесс рисования в Image Editor практически ничем не отличается от процесса создания картинки в обычном графическом редакторе, например в Microsoft Paint. Однако есть одна тонкость. Первоначально поле изображения закрашено "прозрачным" цветом. Если значок нарисовать на этом фоне, то при отображении значка части поля изображения, закрашенные "прозрачным" цветом, примут цвет фона, на котором будет находиться значок. В процессе создания картинки можно удалить (стереть) ошибочно нарисованные элементы, закрасив их прозрачным цветом, которому на палитре соответствует левый квадрат в нижнем ряду (рис. 46). Кроме "прозрачного" цвета в палитре есть "инверсный" цвет. Нарисованные этим цветом части рисунка при выводе на экран будут окрашены инверсным относительно цвета фона цветом.
Рис. 46. Палитра
Чтобы сохранить нарисованный значок, надо в меню File выбрать команду Save, в открывшемся диалоговом окне раскрыть папку проекта (приложения, для которого создан значок) и задать имя файла значка, которое обычно совпадает с именем проекта (выполняемого файла приложения).
Перенос приложения на другой компьютер
Небольшую программу, которая использует только стандартные компоненты и представляет собой один-единственный ехе-файл, можно перенести на другой компьютер вручную, например, при помощи дискеты. Как правило, при запуске таких программ на другом компьютере проблем не возникает. Вместе с тем, необходимо обратить внимание на следующее. Программа, созданная в C++ Builder, использует DLL версию библиотеки времени выполнения (RTL — Runtime Library) и специальные динамические библиотеки — пакеты (например, в пакете VCL60 находятся наиболее часто используемые компоненты и системные функции). Чтобы программа могла работать на другом компьютере, помимо ехе-файла на этот компьютер надо перенести RTL-библиотеку и используемые программой пакеты или включить библиотеку и пакеты в ехе-файл (что существенно увеличит размер ехе-файла). Чтобы включить в выполняемый файл RTL-библиотеку и используемые программой пакеты, надо в меню Project выбрать команду Options и во вкладках Linker (рис. 47) и Packages (рис. 48) сбросить соответственно флажки Use dynamic RTL и Build with runtime packages. После этого нужно выполнить перекомпоновку программы.
Сложные программы, например те, которые используют компоненты доступа к базам данных, перенести на другой компьютер вручную проблематично. Для таких программ лучше создать установочную дискету (CD-ROM). Сделать это можно, например, при помощи пакета InstallShield Express, который входит в комплект поставки C++ Builder.
Рис. 47. Чтобы включить в выполняемый файл RTL-библиотеку, сбросьте флажок Use dynamic RTL
Рис. 48. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packages
Структура простого проекта
Проект представляет собой набор программных единиц — модулей. Один из модулей, называемый главным, содержит инструкции, с которых начинается выполнение программы. Чтобы увидеть главный модуль, нужно в меню Project выбрать команду View Source. В качестве примера в листинге 2.5 приведен текст главного модуля программы "Сила тока".
Листинг 5. Главный модуль (Amper.cpp)
#include <vcl.h>
#pragma hdrstop
USEFORM("Amper_l.cpp", Forml);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "Сила тока";
Application->CreateForm(__classid(TForml), SForml);
Application->Run(); }
catch (Exception Sexception)
{
Application->ShowException(Sexception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception Sexception)
{
Application->ShowException(Sexception);
}
}
return 0;
}
Начинается главный модуль директивами компилятору (точнее, препроцессору). Директива #include <vci.h> информирует компилятор, что перед тем как приступить непосредственно к компиляции, в текст главного модуля нужно включить заголовочный файл библиотеки визуальных компонентов — vcl.h. Строка USEFORM("Amper_i.cpp", Form1) указывает, что в проект нужно включить файл модуля формы Amper_l.cpp, который содержит функции обработки событий для формы Form1. Далее следует описание главной функции программы — winMain. Функция winMain инициализирует внутренние структуры программы, создает форму Formi и запускает программу, что приводит к появлению на экране стартовой формы. Так как в проекте "Сила тока" только одна форма, то на экране именно она и появляется. Инструкция обработки исключений catch выполняется, если в программе возникает ошибка. Таким образом, главный модуль обеспечивает вывод стартовой формы программы, дальнейшее поведение которой определяют функции обработки событий стартовой формы.
Помимо главного модуля в состав проекта входят модули формы. Для каждой формы C++ Builder создает отдельный модуль, который состоит из двух файлов: заголовочного файла и файла кода (содержимое этих файлов отражается в окне редактора кода). Заголовочный файл содержит описание формы (листинг 2.6), файл кода (модуль формы) — описание (текст) функций, в том числе и обработки событий (листинг 2.7).
Листинг 6. Заголовочный файл модуля формы (Amper_1.h)
#ifndef Amper_1H
#define Amper_1H
#include <Classes.hpp>
#include «Controls.hpp>