Компоненти Indy для роботи з мережею 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Компоненти Indy для роботи з мережею



(TIdTCPServer, TIdPeerThread, TIdTCPClient)

Постановка задачі: розробити програму для обміну текстовими повідомленнями через мережу.

Послідовність виконання:

1 Помістіть на форму програми-сервера компоненти TIdTCPServer, TMemo і заповніть код:

//конструктор форми

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

IdTCPServer1->DefaultPort=8090;//задати порт

IdTCPServer1->Active=true;//зробити сервер активним

Memo1->Lines->Clear();//очистити Memo1

}

//обробник події OnExecute компонента IdTCPServer1

//AThread - потік, який використовується для клієнтських з'єднань

void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)

{

try

{//добавити в Memo1 отриманий рядок

Memo1->Lines->Add(AThread->Connection->ReadLn());

//добавити в Memo1 віддалену IP адресу

Memo1->Lines->Add(AThread->Connection->Binding->PeerIP);

//надіслати локальну IP адресу

AThread->Connection->WriteLn(AThread->Connection->Binding->IP);

}

catch(...)

{//при помилці надіслати "помилка"

AThread->Connection->WriteLn("помилка");

}

AThread->Connection->Disconnect();//роз'єднати з'єднання

}

 

3 Для можливості роботи програми-сервера на комп’ютері без середовища Borland C++ Builder 6 задайте опції проекту: Project/Options.../Packages/зніміть прапорець Build with runtime packages. На цей комп’ютер також необхідно скопіювати файли: borlndmm.dll і cc3260mt.dll.

4 Скомпілюйте програму-сервер.

5 Помістіть на форму програми-клієнта компоненти TEdit (2 штуки), TButton, TIdTCPClient, і заповніть код:

//конструктор форми

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

Edit1->Text="127.0.0.1";//локальний адрес

}

//обробник події OnClick

void __fastcall TForm1::Button1Click(TObject *Sender)

{

IdTCPClient1->Host=Edit1->Text;//вказати адресу віддаленого комп'ютера

IdTCPClient1->Port=8090;//вказати порт

try

{

IdTCPClient1->Connect();//з'єднати з сервером

IdTCPClient1->WriteLn(Edit2->Text);//надіслати рядок

Edit2->Text = IdTCPClient1->ReadLn();//отримати рядок

}

catch(...)

{//при помилці вивести повідомлення

ShowMessage("Помилка з'єднання");

}

IdTCPClient1->Disconnect();//роз'єднати з'єднання

}

6 Скомпілюйте програму-клієнт.

7 Скопіюйте програму-сервер та файли borlndmm.dll і cc3260mt.dll на віддалений комп’ютер з адресою, наприклад, 192.168.1.5. Виконайте програму-сервер на віддаленій машині і програму клієнт на локальній. Введіть в Edit1 клієнта адресу віддаленого комп’ютера і передайте йому будь-який текст. Для тестування програм без мережі на локальній машині слід вводити адресу 127.0.0.1.

Створення компонентів VCL

Постановка задачі: розробити компонент VCL TButtonEx на основі класу TButton, який додатково має властивість State логічного типу, яка визначає стан компоненту (true або false). Стан (State) компоненту змінюється на протилежний при натиску на кнопку (коли відбувається подія OnClick).

 

Послідовність виконання:

1 Закриваємо все: File/Close All

2 Створюємо новий компонент: File/New/Other.../Component/Ok

3 В діалоговому вікні вводимо: Ancestor type – TButton [StdCtrls], Class name – TButtonEx, Palette page – Samples, UnitFileName – вказуємо C:\Program Files\Borland\CBuilder6\Projects\ButtonEx.cpp. Натискаємо Ok.

4 Зберігаємо все: File/Save All, закриваємо все: File/Close All

5 Створюємо новий додаток: File/New/Application

6 В unit1.cpp дописуємо директиву #include "ButtonEx.cpp"

7 В модулі unit1.cpp після рядка TForm1 *Form1; оголосіть об’єкт типу TButtonEx:

TButtonEx *btn;

8 За допомогою Class Explorer в клас TButtonEx добавляємо властивість New Property...

9 В діалоговому вікні вводимо: Property name – State, Type – bool, create Set method, implement in: ButtonEx.cpp, create field, use this field for the read specifier, use this field for implementing the Set method, Default: true.

10 За допомогою Class Explorer в клас TButtonEx добавляємо метод New Method...

11 В діалоговому вікні вводимо: Method name – Click, Arguments – void, Function result – void, Visibility – public, Directives - __fastcall, Call Inherited.

12 В класі TButtonEx позначте цей метод словом DYNAMIC так:

DYNAMIC void __fastcall Click(void);

13 Вставте в реалізацію цього методу код:

(FState)?this->SetState(false):this->SetState(true);

перед рядком

TButton::Click();

14 За допомогою Class Explorer в клас TForm1 добавляємо метод New Method...

15 В діалоговому вікні вводимо: Method name – btn_click, Arguments – TObject *Sender, Function result – void, Visibility – public, Directives - __fastcall.

16 В реалізацію методу вставте код:

if (btn->State) btn->Caption="true";

else btn->Caption="false";

Application->MessageBoxA("Changed","State",0);

17 В конструктор класу TForm1::TForm1 вставте код:

btn=new TButtonEx(this);

btn->Parent=this;

btn->Left=100;

btn->Top=100;

btn->OnClick=btn_click;

18 Зберігаємо все: File/Save All.

19 Виконайте програму: Run/Run.

20 Component/Install Component, виберіть Into new package і вкажіть назву пакету TButtonEx.

21 Закриваємо все: File/Close All

22 Приклад використання нового компоненту. Створіть новий додаток, який використовує новий компонент TButtonEx. Добавте на форму компонент ButtonEx і створіть обробник події OnClick. В функцію TForm1::ButtonEx1Click вставте код:

Application->MessageBoxA(BoolToStr(ButtonEx1->State, true).c_str(),"State",0);

і виконайте програму.

 

Код компоненту TButtonEx

Файл ButtonEx.h

//файл ButtonEx.h з класом компоненту TButtonEx#ifndef ButtonExH#define ButtonExH#include <SysUtils.hpp>#include <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>//клас компоненту TButtonEx, який успадковується від TButton//макрос PACKAGE вказує, що клас може бути імпортований і експортований з файлу bplclass PACKAGE TButtonEx: public TButton{private: bool FState;//поле для збереження значення властивості State void __fastcall SetState(bool value);//метод запису властивості Stateprotected:public: __fastcall TButtonEx(TComponent* Owner);//конструктор DYNAMIC void __fastcall Click(void);//динамічний метод Click__published://розділ з властивостями, які показуються у Object Inspector //оголошення властивості State логічного типу //читання з поля FState, запис методом SetState, по замовчуванню true __property bool State = { read=FState, write=SetState, default=true };};#endif Файл ButtonEx.cpp //файл ButtonEx.cpp з визначенням методів класу TButtonEx#include <vcl.h>#pragma hdrstop#include "ButtonEx.h"#pragma package(smart_init)//використовується для перевірки, чи немає чисто віртуальних функційstatic inline void ValidCtrCheck(TButtonEx *){ new TButtonEx(NULL);}//конструктор__fastcall TButtonEx::TButtonEx(TComponent* Owner): TButton(Owner){}//пустийnamespace Buttonex//простір імен Buttonex{ void __fastcall PACKAGE Register()//функція реєстрації компоненту { TComponentClass classes[1] = {__classid(TButtonEx)}; RegisterComponents("Samples", classes, 0);//реєструє на вкладці Samples }}//визначення методу SetState, який установлює значення властивостіvoid __fastcall TButtonEx::SetState(bool value){//якщо поле FState не рівне value, то присвоїти valueif(FState!= value) {FState = value;}}//визначення методу Click, який уточнює реакцію на подію OnClickvoid __fastcall TButtonEx::Click(void){//якщо FState істина, то викликати SetState(false), інакше SetState(true)(FState)?this->SetState(false):this->SetState(true);TButton::Click();//виклик методу базового класу}

Створення DLL

Постановка задачі: створити бібліотеку dll, яка містить простий клас.

Послідовність виконання:

Створюємо бібліотеку DLL:

1 File/New/Other/DLL Wizard

2 Source Type: C++

3 Забрати прапорець з: Use VCL, Ok

4 Добавляємо файл заголовків File1.h: File/New/Other/Header File

5 File/Save/File1.h

6 Project/Add To Project.../File1.h

7 Вставте у файл File1.h код:

__declspec(dllexport) class My

{

private:

double x;

public:

My();

double RetSqr();

};

8 Добавте до Unit1.cpp:

#include "File1.h"

а також реалізацію методів:

My::My()

{

x=2;

}

double My::RetSqr()

{

return x*x;

}

9 Компілюємо: Project/Build Project1

Створюємо додаток, який використовує DLL:

10 Створюємо додаток: File/New/Application

11 Помістіть на форму поле і кнопку.

12 Добавте до модуля cpp:

#include "File1.h"

13 Добавляємо до проекту бібліотеку: Project/Add To Project.../Project1.lib

14 Добавте в клас TForm1 в розділ private:

My *obj;

15 В конструктор класу TForm1::TForm1 вставте код:

obj = new My();

16 В метод TForm1::Button1Click вставте код:

{

Edit1->Text=AnsiString(obj->RetSqr());

}

17 File/Save Project As... Назвіть модуль Unit2, а проект Project2.

18 Run.

Повинен появитись результат: 4.

 



Поделиться:


Последнее изменение этой страницы: 2017-01-24; просмотров: 186; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.88.249 (0.021 с.)