{
TForm *FpForm = new TForm(Application);
FpForm->Left = 10;
FpForm->Top = 10;
FpForm->Width = 200;
FpForm->Height = 200;
FpForm->Visible = true;
TPanel *FpPanel = new TPanel(FpForm);
FpPanel->Parent = FpForm;
FpPanel->Left = 2;
FpPanel->Top = 2;
FpPanel->Width = 198;
FpPanel->Height = 198;
FpPanel->Visible = true;
MessageBox ( NULL,"If YES clicked < OK >", "You finished ?", MB_OK );
if(FpPanel) {
delete FpPanel;
if(FpForm)
deleteFpForm;
}
}
3.Сохранить проект в каталоге под именем sum.mak
4.Выбрать Options|Project...|Directories/Conditionals
5.В поле Conditionals набрать: __BUILDING_THE_DLL
6.В каталоге где находится проект создать файл sum.h со следующим кодом:
#ifdef __BUILDING_THE_DLL
#define __EXPORT_TYPE __export
#else
#define __EXPORT_TYPE __import
#endif
void __EXPORT_TYPE SayHello();
int __EXPORT_TYPE Sum(int a,int b);
char* __EXPORT_TYPE Codec(char *eptr); //<------------------
void __EXPORT_TYPE InvokeYesNoDialog();
7.Откомпилировать командой Project|BuildAll. В результате компиляции получим sum.DLL.
8.Скопировать sum.DLL в каталог ..\BINC++ Builder-а
9.Набрать в командной строке implib.exe -wsumsum.dll
10.В результате получим файл sum.lib который будет подключен к выполняемому проекту
11.Скопировать sum.lib в каталог с проектом.
Рассмотрим пример вызова DLL из программы. В программе имеются визуальные компоненты:Edit (для ввода строки), Button1 (шифровка-дешифровка строки), Button2 - выход из программы. Программа работает следующим образом - после запуска вводится строка и нажимается кнопка Button1 - в результате строка шифруется, далее снова нажимается кнопка Button1 - строка дешифруется.
//---------------------------------------------------------------------------
#ifndef projcodH
#define projcodH
//---------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "projcod.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
#include "sum.h" //<<--------------ВНИМАНИЕ-----
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* szMyStr = new char [StrLen(Edit1->Text.c_str())+2];
*szMyStr = 0;
StrLCat(szMyStr, Edit1->Text.c_str(), StrLen(Edit1->Text.c_str()));
Edit1->Text = Codec(szMyStr); //<----------------
delete [] szMyStr;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
К исполняемому файлу (код которого приведен выше) подключить sum.lib выполнив команду:
Project\Add to Project\.....sum.lib
Запустить проект на компиляцию и выполнение.
Возможен вызов DLL из DLL, или вызов DLL из другого языка программирования.
4.13 Разработка визуальных компонент
C++ Builder позволяет расширять библиотеку VCL собственными компонентами.
Рассмотрим на примере разработку визуальной компоненты, которая позволяет перемножать два числа, если их значение не превышает 100.
Прежде всего отметим, что разрабатываемая компонента TMul потомок Tcomponent. Расположим ее на странице Samplesбиблиотеки VCL.
Разрабатывемый компонент содержит свойства методы и события.
Свойства используются для задания определенных атрибутов (полей данных) и инициализации некоторых действий.
Методы - это процедуры и функции, которые делают класс общедоступным.
События используются для расширения компонентов в случае, когда возникают события (например, щелчок мыши).
Разрабатываемый компонент имеет два свойства типа int (Val1 - первый сомножитель, Val2- второй сомножитель) один метод DoMult (перемножает сомножители) и событие TooBig (вызывет обработчик событий, когда один из сомножителей больше 100).
При вызове метода, два значения в свойствах перемножаются и результат становится значением третьего свойства (Res).
Событие TooBig реализуется, если хотя бы одно из чисел больше 100.
Рассмотрим этапы построения TMul.
1.Создадим модуль, используя раздел Component/ NewГлавного меню.
Взакладке Component Wizard указываемCalss Name: – TMul, Ancestor type: - Tcomponent, Pallette Page: – Samples. В результате будет сгенерирован код, который включает стандартную оболочку объявления класса TMul, и поцедуру регистрации класса. Далее модуль сохраняется под именем Mul.cpp. В результате будет созданы файлы: Mul.cpp и Mul.h.
2.Добавление свойств к компоненту. Открываем файл Mul.h и записываем код.
В разделе private определим свойства FVal1, FVal2 - доступные в процессе проектирования и в процессе выполнения и свойство Res -доступное в процессе выполнения. Также описываем событие TooBig, для определения которого используется тип TnitifyEvent – обобщенный указатель на функцию, которая передает один параметр типа Tcomponent – this.
class TMul : public TComponent
{
private:
int FVal1;
int FVal2;
int FRes ;
TNotifyEventFTooBig;
Далее определим свойства (__property): Res в разделе public, т.к. оно доступно во время выполнения и свойства Val1 и Val2 в разделе __published, т.к. они доступны во время проектирования. Определяем прямой доступ для чтения и записи (read,write) значений переменных в разделе __published
Для переменной FRes прямой доступ не нужен,т.к. свойство Resпредназначено только для чтения.
class TMul : public TComponent
{
private:
int FVal1;
int FVal2;
int FRes ;
TNotifyEvent FTooBig;
protected:
public:
__fastcall TMul(TComponent* Owner);
void __fastcallDoMult(void);
//свойство для получения результата
__property int Res = { read=FRes, write=FRes };
__published:
//первый операнд
__property int Val1 = { read=FVal1, write=FVal1, default = 1 };
//второй операнд
__property int Val2 = { read=FVal2, write=FVal2, default = 1 };
//событие
__property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};
};
Далее загружаем файл Mul.cpp и добавляем код.
3.Добавление конструктора.
Для создания представителя класса вызывается конструктор. Конструктор также:
- устанавливает значения по умолчанию для переменных класса;
- отвечает за динамическое распределение памяти и получение ресурсов, необходимых классу;
- вызывается при добавлении компонента к форме во время проектирования или во время выполнения.
__fastcall TMul::TMul(TComponent* Owner)
: TComponent(Owner)
{
FVal1 = 1;
FVal2 = 1;
}
4.Добавление метода.
Для добавления метода необходимо написать код:
void __fastcall TMul::DoMult(void)
{
if((Val1 < 100) && (Val2 < 100))
Res = FVal1 * FVal2;
else
if (FTooBig) TooBig(this);
}
5.Добавление событие.
Событие предоставляет программисту задать специальный код, исполняемый когда что-то происходит. В нашем случае добавляется событие
TooBig, которое запускается когда значение Val1 или Val2 больше 100.
Обработка события осуществляется в строке:
if (FTooBig) TooBig(this);
Если нашем случае FtooBig=TRUE то происходит обработка события.
Листинг файла Mul.h
//---------------------------------------------------------------------------
#ifndefmulH
#define mulH
//---------------------------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------------------------
class TMul : public TComponent
{
private:
int FVal1;
int FVal2;
int FRes ;
TNotifyEvent FTooBig;
protected:
public:
__fastcall TMul(TComponent* Owner);
void __fastcall DoMult(void);
__property int Res = { read=FRes, write=FRes };
__published:
__property int Val1 = { read=FVal1, write=FVal1, default = 1 };
__property int Val2 = { read=FVal2, write=FVal2, default = 1 };
__property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};
};
//---------------------------------------------------------------------------
#endif
Листингфайла Mul.cpp:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "mul.h"
//---------------------------------------------------------------------------
static inline TMul *ValidCtrCheck()
{
return new TMul(NULL);
}
//---------------------------------------------------------------------------
__fastcall TMul::TMul(TComponent* Owner)
: TComponent(Owner)
{
FVal1 = 1;
FVal2 = 1;
}
//---------------------------------------------------------------------------
namespace Mul
{
void __fastcall Register()
{
TComponentClass classes[1] = {__classid(TMul)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TMul::DoMult(void)
{
if((Val1 < 100) && (Val2 < 100))
Res = FVal1 * FVal2;
else
if (FTooBig) TooBig(this);
}
//---------------------------------------------------------------------------
Далее компонент необходимо оттранслировать и включить в библиотеку компонент.
Для включения компонента в библиотеку необходимо:
- в главном меню выбрать Component/Install;
- в появившемся окне InstallComponents выбрать опцию Add;
- зайти в папку где находится компонента, выбрать файл Mul.cpp и щелкнуть мышью по кнопке OK.
Компонента установится на странице Samples.
Для тестирования компонента используем программу.
На форму поместим три компоненты Edit, три Label, Button и Mul.
Щелкнем по кнопке Button и запишем код.
Mul1->Val1 = StrToInt(EdVal1->Text);
Mul1->Val2 = StrToInt(EdVal2->Text);
Mul1->DoMult();
EdRes->Text = IntToStr(Mul1->Res);
Далее щелкаем мышью справа от события TooBig сомпонеты Mul и записываем код:
Form1->Caption="Переполнение";
Общий вид программы:
//---------------------------------------------------------------------------
#pragma link "mul"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Mul1->Val1 = StrToInt(EdVal1->Text);
Mul1->Val2 = StrToInt(EdVal2->Text);
Mul1->DoMult();
EdRes->Text = IntToStr(Mul1->Res);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Mul1TooBig(TObject *Sender)
{
Form1->Caption="Переполнение";
}
//---------------------------------------------------------------------------
Далее программу можно выполнить.
Кроме рассмотренного примера возможна модификация существующих визуальных компонент и получение новых компонент на базе существующих.
4.14 Введение в программирование CGI
Важнейшей особенностью web-сервера является возможность получения информации от пользователя и обработка ее с помощью CGI(общий шлюзовый интерфейс). CGI – компонент программного обеспечения, который: