Главная страница
Навигация по странице:

  • 4.10 Спрайтовая графика

  • 4.11 Объектная технология OLE 2

  • 4.12 Библиотеки DLL

  • 4.13 Разработка визуальных компонент

  • 4.14 Введение в программирование CGI

  • День до сдачи работы мы справимся, и ты получишь Отлично по своему предмету! Только представь ты занимаешься своим любимым делом, пока твои лохиодногруппники теряют свои нервные клетки Проникнись Это бесценное ощущение Курсовая,


    Скачать 389.95 Kb.
    НазваниеДень до сдачи работы мы справимся, и ты получишь Отлично по своему предмету! Только представь ты занимаешься своим любимым делом, пока твои лохиодногруппники теряют свои нервные клетки Проникнись Это бесценное ощущение Курсовая,
    Дата04.07.2021
    Размер389.95 Kb.
    Формат файлаdocx
    Имя файлаUchebnoe_posobie_Osnovy_C.docx
    ТипРешение
    #223314
    страница9 из 9
    1   2   3   4   5   6   7   8   9

    4.9 Мультимедиа
    Мультимедиа - это использования звука и видео в программах. Для работы со звуком (файлами с расширением wav и mid) нужна звуковая карта - Soundblaster.

    В файлах с расширением wav записано цифровое представление информации о волновой форме электрического сигнала, соответствующего звуку.

    Файлы с расширением mid используются для хранения музыкальных фрагментов. Звук в этих файлах хранится в виде данных о том на каком инструменте исполняются те или иные ноты и как они звучат (цифрой эквивалент дирижерской партитуры).

    Файл с расширением avi представляет оцифрованное изображение в виде кадров, которые сменяются с частотой 24 (могут быть отличия в различных системах) кадра в секунду. Обычно видеофайлы сжаты, т.к. занимают достаточно много места в памяти. Для сжатия применяется в основном следующий метод: определяется неподвижная часть изображения, по сравнению к начальному кадру и эта информация сжимается, т.е. сохраняются только отличия одного кадра от другого.

    Для проигрывания wav файлов в C++ Builder используется процедура PlaySound. Рассмотрим пример – по нажатию клавиши Button – проигрывается звуковой файл bomb.wav.
    //---------------------------------------------------------------------------

    #include

    #pragma hdrstop
    #include "Unit1.h"

    #include "mmsystem.hpp"

    //---------------------------------------------------------------------------

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //---------------------------------------------------------------------------

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    PlaySound("bomb.wav",0,SND_SYNC);

    }

    //---------------------------------------------------------------------------

    Как видно из программы дополнительно введен модуль mmsystem (в котором хранятся константы для функции PlaySound) и вызвана API функция PlaySound, которая имеет три параметра:

    Первый параметр - "bomb.wav" типа AnsiString - содержит имя проигрываемого файла.

    Второй параметр (в нашем случае 0) применяется, если файл содержится в файле ресурсов.

    Третий параметр специфицирует опции, задающие способ воспроизведения звука.

    Для проигрывания всех типов мультимедийных файлов можно использовать компонент MediaPlaer.

    Рассмотрим пример, проигрывания avi, wav и mid файлов.

    На форме расположим компоненты: MainMenu, OpenDialog, MediaPlayer, добавим к меню команду File|Open и в событие меню Open введем код:
    void __fastcall TForm1::Open1Click(TObject *Sender)

    {

    if(OpenDialog1->Execute())

    {

    MediaPlayer1->FileName=OpenDialog1->FileName;

    MediaPlayer1->Open();

    }

    }

    Общий вид программы следующий:
    //---------------------------------------------------------------------------

    #include

    #pragma hdrstop
    #include "Unit1.h"

    //---------------------------------------------------------------------------

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //---------------------------------------------------------------------------

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::N2Click(TObject *Sender)

    {

    if(OpenDialog1->Execute())

    {

    MediaPlayer1->FileName=OpenDialog1->FileName;

    MediaPlayer1->Open();

    }

    }

    //---------------------------------------------------------------------------
    Загружая через меню тот или иной мультимедийный файл мы сможем его проигрывать.

    В случае, если панель проигрывателя показывать не надо, а проигрывать файл необходимо, то свойство Visible компоненты MediaPlayer нужно установить равным false.

    Рассмотрим пример - информационной системы - в зависимости от выбранной радиокнопки проигрывается тот или иной avi файл. Используются компоненты: MediaPlayr, RadioGroup, RadioButton, Panel, Button.

    Основная логика программы реализуется в обработке события OnClick кнопки Button. Когда пользователь нажимает кнопку, программа проверяет, какая из радиокнопок выбрана. В зависимости от этого проигрывается один из трех avi-файлов.


    //---------------------------------------------------------------------------
    #include

    #pragma hdrstop
    #include "Unit1.h"

    //---------------------------------------------------------------------------

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //---------------------------------------------------------------------------

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::FormCreate(TObject *Sender)

    {

    MediaPlayer1->Display=Panel1;

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    if(RadioButton1->Checked)

    MediaPlayer1->FileName="1.AVI";

    if(RadioButton2->Checked)

    MediaPlayer1->FileName="2.AVI";

    if(RadioButton3->Checked)

    MediaPlayer1->FileName="3.AVI";

    MediaPlayer1->Open();

    MediaPlayer1->DisplayRect=Rect(0,0,

    Panel1->Width,Panel1->Height);

    MediaPlayer1->Play();

    }
    //---------------------------------------------------------------------------
    4.10 Спрайтовая графика
    Спрайты - движущиеся картинки небльшого размера, являются одной из главных частей любого игрового или обучающего пакета программ. Рассмотрим несколько примеров использование спрайтов MChSprite из линейки Samples

    Компонента MchSpriteBgr.

    Данная компонента представляет собой фон на котором происходит движение спрайтов. Одним из основных свойств MchSpriteBgr является свойство Picture – загрузка bmp или gif изображения.

    Компонента MchSprite.

    Компонента представляет собой собственно спрайт- небольшое bmp -изображение. Для загрузки изображения используется свойство SprSpriteBitmap.

    Основные свойства MchSprite:

    SprHideAfter – виден или нет спрайт после окончания движения (MChSprite1->SprHideAfter=True - не виден);

    SprSetScaleX – масштаб спрайта по оси Х;

    SprSetScaleY – масштаб спрайта по оси Y;

    Пример – изменение масштаба спрайта при приближении:

    Form1->MChSprite2->SprSetScaleX(1+1.0*sin(alpha)); (где alpha - переменная типа double);

    SprPosFunc – функция пользователя – закон движения спрайта (возвращает координаты движения спрайта) – пример:

    //функция пользователя для движения спрайта N 2

    TPoint __fastcall Sprite2PosFunc(TDateTime AtTime)

    //AtTime – время от начала движения спрайта в секундах

    {

    doublex,y,alpha;

    alpha=2*3.14*(AtTime-Form1->MChSprite2->SprTimeStarted)* 24.0*60.0100.0/(180.0*3.14);

    x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

    (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

    y= Form1->MChSpriteBgr1->ClientHeight /2.0 +

    (Form1->MChSpriteBgr1->ClientWidth /3.0)*sin(alpha);

    Form1->MChSprite2->SprSetScale(1+1.0*sin(alpha));

    return(Point(int(x),int(y)));

    }

    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------

    void __fastcall TForm1::FormCreate(TObject *Sender)

    {

    MChSprite2->SprPosFunc=Sprite2PosFunc;//вызов функции движения

    MChSprite2->SprCruise(-1);

    }

    //---------------------------------------------------------------------------

    SprSpriteBitmap – изображение спрайта;

    SprTrColor – цвет спрайта;

    SprDragable – если истина, то спрайт можно премещать мышью;

    SprColliding – если истина, то вызывается функция пользовыателя для обработки столкновения спрайтов;

    SprRefX, SprRefY –соответственно контрольная точка на растре спрайта по оси X и Y;

    SprRadiusX ,SprRadiusY радиус столкновения спрайта по оси X и оси Y соответственно;
    Основные методы MchSprite.

    Метод SprRun (Point (X1, Y1), Point (X2,Y2), t) –делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

    Пример: (MChSprite1->SprRun(

    Point (MChSpriteBgr1->ClientWidth, 0),

    Point (0, MChSpriteBgr1->ClientHeight), 3);

    Метод SprShowOn (); делает спрайт видимым в текущей позиции.

    Метод SprCruise (-1); делает спрайт видимым и его движение задается функцией пользователя SprPosFunc;

    Метод SprMoveTo (Point (X, Y); делает спрайт видимым в позиции X, Y.

    Пример:

    MChSprite6->SprMoveTo (Point (int ((Form1->MChSpriteBgr1->ClientWidth)/2), int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    Метод SprShowAt(Point(X,Y); - делает спрайт видимым в точке X,Y.

    Метод SprHide – делает спрайт невидимым;

    Метод SprStop – останавливает спрайт;

    Метод SprGoTo (Point(X,Y),t); - делает спрайт видимым и перемещает в течении t секунд из текущей позиции в позицию X, Y.

    Метод SprGo (Point (X1, Y1), Point (X2, Y2), t); - делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

    Рассмотрим пример использования спрайтов. На форме расположены 6 спрайтов и 4 кнопки.

    В зависимости от нажатия той или иной кнопки происходят события – летит ракета, сверхновая звезда сталкивается с Солнцем и происходит взрыв и т.д.

    Листинг программы:

    //---------------------------------------------------------------------------

    #include

    #include

    #pragma hdrstop

    #include "Unit1.h"

    //---------------------------------------------------------------------------

    #pragma link "MChSpBg"

    #pragma link "MChSprt"

    #pragma resource "*.dfm"

    TForm1 *Form1;

    bool CollideFlip,Exploding;

    //---------------------------------------------------------------------------

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //----------------------------------------------------------------------

    void __fastcall NoCollide(TDateTime AtTime)

    {

    if (CollideFlip) MessageBeep(MB_OK);

    CollideFlip=False;

    }

    //----------------------------------------------------------------------

    void __fastcall OnCollide(TMChSprite *SprCollided ,TDateTime AtTime)

    {

    if (SprCollided==Form1->MChSprite2)

    {

    // MessageBeep(MB_ICONASTERISK);

    if (! CollideFlip)

    {

    MessageBeep(MB_ICONASTERISK);

    CollideFlip=True;

    }

    if (Form1->MChSprite4->SprNextPos.xMChSpriteBgr1->ClientWidth)/2))

    {

    if (Form1->MChSprite4->SprIndexMChSprite3->SprIndex)

    Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

    Form1->MChSprite3->SprIndex);

    }

    else

    {

    if (Form1->MChSprite4->SprIndex>Form1->MChSprite3->SprIndex)

    Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

    Form1->MChSprite3->SprIndex);

    }

    }

    }

    //--------------------------------------------------------------------

    void __fastcall OnExplosion(TMChSprite *SprCollided ,TDateTime AtTime)

    {

    if (Exploding)

    {

    // SprCollided->SprStop;

    // SprCollided->SprHide;

    }

    if ((! Exploding) && (SprCollided==Form1->MChSprite1))

    {

    Exploding=True;

    Form1->MChSprite2->SprColliding=true;

    Form1->MChSprite5->SprColliding=true;

    Form1->MChSprite6->SprCruise(20);

    }

    }
    //---------------------------------------------------------------------

    TPoint __fastcall Sprite6PosFunc(TDateTime AtTime)

    {

    Form1->MChSprite6->SprSetScale(1.25*(AtTime-Form1->MChSprite6->SprTimeStarted)

    *24.0*60.0*60.0*5.0);

    // if ((AtTime-Form1->MChSprite6->SprTimeStarted)*24.0*60.0*60.0>17.0)

    // Form1->MChSprite6->SprHide;

    return(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

    int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    }
    //-----------------------------------------------------------------------

    TPoint __fastcall Sprite4PosFunc(TDateTime AtTime)

    {

    double x,y,alpha;

    alpha =2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0+0.0)/180.0*3.14;

    x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

    (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

    y= Form1->MChSpriteBgr1->ClientHeight /2.0 +

    - (Form1->MChSpriteBgr1->ClientWidth /3.0)*sin(alpha);

    Form1->MChSprite4->SprSetScale(1-0.9*sin(alpha));

    return(Point(int(x),int(y)));

    }

    //-----------------------------------------------------------------------

    TPoint __fastcall Sprite3PosFunc(TDateTime AtTime)

    {

    double x,y,alpha;

    alpha=-2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0-180.0)/180*3.14;

    x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

    (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

    y= Form1->MChSpriteBgr1->ClientHeight *0.5 +

    -(Form1->MChSpriteBgr1->ClientWidth *0.55)*sin(alpha);

    if (x>=(Form1->MChSpriteBgr1->ClientWidth)/2)

    Form1->MChSprite3->SprSetScaleX( (1-1.0*sin(alpha)));

    else Form1->MChSprite3->SprSetScaleX(-(1-1.0*sin(alpha)));

    if (y<(Form1->MChSpriteBgr1->ClientHeight)/2)

    Form1->MChSprite3->SprSetScaleY( (1-1.0*sin(alpha)));

    else Form1->MChSprite2->SprSetScaleY(-(1-1.0*sin(alpha)));

    return(Point(int(x),int(y)));

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::FormCreate(TObject *Sender)

    {

    Exploding=false;

    MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

    int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    MChSprite3->SprPosFunc=Sprite3PosFunc;

    MChSprite4->SprPosFunc=Sprite4PosFunc;

    MChSprite6->SprPosFunc=Sprite6PosFunc;

    MChSprite6->SprHideAfter=true;

    MChSprite6->SprOnCollide=OnExplosion;

    MChSprite4->SprOnCollide=OnCollide;

    MChSprite4->SprNoCollide=NoCollide;

    MChSprite3->SprCruise(-1);

    MChSprite4->SprCruise(-1);

    MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

    int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    Exploding=false;

    MChSprite6->SprSetScale(0.2);

    MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

    int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    Form1->MChSprite1->SprColliding=true;

    Form1->MChSprite6->SprColliding=true;

    Form1->MChSprite1->SprGo( Point(Form1->MChSpriteBgr1->ClientWidth,0),

    Point(int(Form1->MChSpriteBgr1->ClientWidth/2),

    int(Form1->MChSpriteBgr1->ClientHeight/2)), 5 );

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)

    {

    MChSprite5->SprColliding=False;

    MChSprite5->SprHideAfter=True;

    MChSprite5->SprGo(Point(Form1->MChSpriteBgr1->ClientWidth,

    Form1->MChSpriteBgr1->ClientHeight),

    Point(0,0), 20);

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button3Click(TObject *Sender)

    {

    Exploding=false;

    MChSprite1->SprColliding=false;

    MChSprite2->SprColliding=false;

    MChSprite5->SprColliding=false;

    MChSprite6->SprColliding=false;

    MChSprite6->SprHide();

    MChSprite5->SprHideAfter=true;

    MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

    int((Form1->MChSpriteBgr1->ClientHeight)/2)));

    MChSprite3->SprCruise(-1);

    MChSprite4->SprCruise(-1);
    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button4Click(TObject *Sender)

    {

    Close();

    }

    //---------------------------------------------------------------------------

    Используя рассмотренный пример, можно изучить практически все свойства спрайтов.
    4.11 Объектная технология OLE2
    Фирма Microsoft включила в систему Windows 95 подсистему внедрения и связывания объектов. В общем виде OLE2 позволяет пользователю получить доступ к объектам разработанных систем в приложении, с которым он работает. Например, работая в Word, можно вызвать таблицу Excel, обработать определенным образом данные, а результат запомнить в Word. Кроме этого автоматизация OLE2 позволяет программисту включать в свои программы разработанные компоненты, например Word.

    Основа OLE2 - Com -компонентная модель объекта (Component Object Model), которая предусматримает модульность и совместитмость во взаимодействии между компонентами, написанными на разных языках. Соm определяет двоичный интерфейс, независимый от языка программирования, который может вступать в коммуникацию с другими компонентами, ничего не зная о них. Объекты, ориентированные на внешнее использование и доступные только из программы называются автоматными объектами OLE. Рассмотрим пример программы, которая вызывает Word, создает новый файл и записывает в Word содержимое компонента Edit.
    //---------------------------------------------------------------------------

    #include

    #pragma hdrstop

    #include //подключение средств автоматизации OLE

    #include "Unit1.h"

    //---------------------------------------------------------------------------

    #pragma resource "*.dfm"

    TForm1 *Form1;

    //---------------------------------------------------------------------------

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    Variant V;

    try {

    V = CreateOleObject("Word.Basic");

    }

    catch(...){

    ShowMessage("Не могу запусть Word");

    throw;

    Close();

    }

    V.OleProcedure("AppShow");

    V.OleProcedure("FileNew");

    V.OleProcedure("Insert", Edit1->Text);
    }

    //---------------------------------------------------------------------------
    Рассмотрим как работает програмы.

    Прежде всего необходимо указать в программе команду подключения средств, отвечающей за автоматизацию OLE #include .

    Далее по команде V = CreateOleObject ("Word.Basic"); вызываем Word, делаем приложение видимым по команде V.OleProcedure ("File New"); создаем новый документ по команде V.OleProcedure ("File New"). Команда V.OleProcedure ("Insert", Edit1->Text); текст из редактора Edit и записывает в Word).

    Как видно, в программе используются средства обработки исключений

    try {

    V = CreateOleObject("Word.Basic");

    }

    catch(...){

    ShowMessage("Не могу запусть Word");

    throw;

    Close();
    которые в случае ошибки закрывают программу.

    Кроме рассмотренного примера для автоматизации OLE существуют стандартные объекты OCX, которые похожи на визуальные компоненты C++Builder, но на самом деле являются самостоятельными объектами.

    Объекты OCX могут быть включены в программу не только на C++Builder, но и Delphi. Но в отличии от компонент C++Builder - они не включаются в код программы, поэтому при распространении программного обеспечения, использующего компоненты OCX необходимо распространять и сами компоненты OCX.
    4.12 Библиотеки DLL
    DLL (Dinamic Link Library) - динамически присоединяемая библиотека, используется для хранения функций и ресурсов отдельно от исполняемого файла. Обычно в программах статистической сборки функции, ресурсы, процедуры и т.д. компонуются в исполняемом файле, использование же DLL позволяет наиболее часто используемые процедуры, функции или ресурсы хранить в DLL и загружать их из DLL по мере необходимости - это динамическое присоединение.

    Обычно DLL не загружается в память пока это не необходимо, но будучи загружена, она делает доступными функции, процедуры или ресурсы для любой программы и для любых языков программирования, которые могут работать с DLL.

    Рассмотрим пример создания DLL, коорая кодирует строку. Кодировка происходит путем сдвигов кода символа на еденицу вправо.

    Для создания библиотеки SUM.DLL необходимо выполнить шаги:

    1.Запустить C++ Builder. и выполнить File|New и выбрать пиктограмму DLL.

    2.Набрать код:
    //Генерирует C++Builder

    #include

    #pragma hdrstop

    //---------------------------------------------------------------------------

    // Important note about DLL memory management:

    //

    // If your DLL exports any functions that pass String objects (or structs/

    // classes containing nested Strings) as parameter or function results,

    // you will need to add the library BCBMM.LIB to both the DLL project and any

    // EXE projects that use the DLL. This will change the DLL and its calling

    // EXE's to use the BCBMM.DLL as their memory manager. In these cases,

    // the file BCBMM.DLL should be deployed along with your DLL.

    //

    // To avoid using BCBMM.DLL, pass string information using "char *" or

    // ShortString parameters.

    //---------------------------------------------------------------------------

    USERES("sum.res");

    //---------------------------------------------------------------------------

    void ViewForm();

    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

    {

    return 1;

    }
    //Набираемый код
    #include "sum.h"

    //---------------------------------------------------------------------------

    char FileName[256];

    void SayHello()

    {

    GetModuleFileName( NULL,FileName, sizeof (FileName) );

    MessageBox ( NULL, FileName, "Hello from:", MB_OK );
    }
    int Sum(int a,int b)

    {

    return a + b;

    }
    char* Codec(char *eptr)

    {

    int x,l;

    char ch;

    l = strlen(eptr);

    if(eptr[l-1] != '`') {

    for(x=0; x
    ch = eptr[x];

    ch = (char)((int)ch + 1);

    eptr[x] = ch;

    }

    eptr[l] = '`';

    eptr[l+1] = '\0';

    } else {

    for(x=0; x
    ch = eptr[x];

    ch = (char)((int)ch - 1);

    eptr[x] = ch;

    }

    eptr[l-1] = '\0';

    }

    return eptr;

    }
    void InvokeYesNoDialog()

    {

    ViewForm();

    }
    //---------------------------------------------------------------------

    void ViewForm()

    {

    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)

    delete FpForm;

    }

    }
    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 в каталог ..\BIN C++ Builder-а

    9.Набрать в командной строке implib.exe -w sum sum.dll

    10.В результате получим файл sum.lib который будет подключен к выполняемому проекту

    11.Скопировать sum.lib в каталог с проектом.
    Рассмотрим пример вызова DLL из программы. В программе имеются визуальные компоненты:Edit (для ввода строки), Button1 (шифровка-дешифровка строки), Button2 - выход из программы. Программа работает следующим образом - после запуска вводится строка и нажимается кнопка Button1 - в результате строка шифруется, далее снова нажимается кнопка Button1 - строка дешифруется.

    //---------------------------------------------------------------------------

    #ifndef projcodH

    #define projcodH

    //---------------------------------------------------------------------------

    #include

    #include

    #include

    #include

    //---------------------------------------------------------------------------

    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

    #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 ;

    TNotifyEvent FTooBig;
    Далее определим свойства (__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 __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};
    };
    Далее загружаем файл 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
    //---------------------------------------------------------------------------

    #ifndef mulH

    #define mulH

    //---------------------------------------------------------------------------

    #include

    #include

    #include

    #include

    //---------------------------------------------------------------------------

    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

    #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;

    • в появившемся окне Install Components выбрать опцию 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 – компонент программного обеспечения, который:

    • позволяет писать сценарии и создавать на их основе управляемые пользователем интерактивные приложения;

    • обеспечивает возможность взаимодействовать с другими программами сервера;

    • имеет средства динамического создания Web-страниц на основе информации пользователя;

    • может вызвать внешнюю программу и передать в нее пользовательские данные.

    В конечном итоге пользователь, не будучи ограничен в рамках заранее написанных документов, используя CGI сценарий может создать круг приложений, которые ему необходимы для получения информации.

    Программе CGI необходимо извлечь информацию, обработать ее и сообщить ответ. Рассмотрим простой пример – создание виртуального документа:

    Запускаем C++Builder. В главном меню выбираем File/New и в открывшейся таблице New Items выбираем Console App.

    Удаляем все, что находится в открывшемся окне и записываем код:
    //Пример CGI

    #include

    #pragma hdrstop
    char S[] = "ПРИВЕТ
    \n";
    void main(void)

    {

    setvbuf(stdout, NULL, _IONBF, 0);

    printf("\nContent-type: text/html\n\n");

    printf("\n");

    printf("\n");

    printf(S);

    printf("
    1   2   3   4   5   6   7   8   9


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