Разработка браузера на Borland Delphi 7

Автор работы: Пользователь скрыл имя, 21 Мая 2013 в 02:01, курсовая работа

Описание работы

Актуальность. Данная программа предназначена для быстрого поиска, какой либо информации. Именно через нее мы получаем основной поток информации и проводим в ней большую часть времени. Данную программу не надо устанавливать, программа открывается за доли секунды. Так же лёгкий интерфейс.
Объект: Инструментальные средства и технологии разработки Windows-приложений
Предмет: Программирование в Borland Delphi 7
Цель: Разработка приложения для быстрого поиска, какой либо информации.

Содержание работы

ВВЕДЕНИЕ ..7
Глава 1 Разработка Web-browser на основе EI в среде Delphi…..8
1.1 Назначение работы и область ее применения.....................................10
1.2 Технологии и средства разработка программы 13
1.3 Описание языка программирования Delphi. 15
Вывод по главе 1 17

Глава 2 Этапы разработки программы 18
2.1 Обоснование выбора языка программирования 18
2.2 Алгоритм программы 19
2.3 Структурные и функциональные характеристики
программы. 20
2.4 Пользовательский интерфейс 21
2.5 Описание кода, тестирование и верификация
программы. 23
Вывод по главе 2 23

ЗАКЛЮЧЕНИЕ 23
ЛИТЕРАТУРА 25
ПРИЛОЖЕНИЕ 26

Файлы: 1 файл

kursovaya_rabota_ISIT.doc

— 308.00 Кб (Скачать файл)

CloseHandle(fiber);

fiber = NULL;

}

if(server != 0u)

closesocket(server);

fiber  = NULL;

server = 0u;

}

BOOL IsRun(void) const {

return (server != 0u);

}

private:

static  DWORD WINAPI  ThreadAccept(LPVOID  hParam) {  // поток для ожидания клиентских соединений

xTCPServer*  svr = reinterpret_cast<xTCPServer*>(hParam);

sockaddr_in  addr;

int  size  = sizeof(sockaddr_in);

bool check = false;

while(TRUE) {

ZeroMemory(&addr, sizeof(sockaddr_in));

SOCKET  sock = accept(svr->server, (sockaddr*)&addr, &size );

if(sock == INVALID_SOCKET)

continue;

// попытаемся  найти в пуле найти свободный  элемент

check = true;

for(std::list<xClient*>::iterator iter = clients.begin(); iter != clients.end(); ++iter) {

if(! (*iter)->IsConnected()) {  // если есть свободный

(*iter)->Attach(sock);    // присоеденим нового клиента  к нему

check = false;

break;

}

}

// Если свободных  элементов нет

if(check) {

EnterCriticalSection(&section);

xClient*  new_client = new xClient();

if(new_client->Create( sock ))

clients.push_back(new_client);   // добавим новый элемент в набор-пула

else {

delete new_client;

new_client = NULL;

}

LeaveCriticalSection(&section);

}

}

return 0u;

}

};

int main(void) {

// только один  экземпляр-сервера может быть  запущен

HANDLE event = CreateEventA(NULL, TRUE, FALSE, "Kudushteev");

if(GetLastError() == ERROR_ALREADY_EXISTS) {

CloseHandle(event);

return 1;

}

WSADATA data = {0};

if(WSAStartup(MAKEWORD(2, 2), &data) != 0)

return 1;

CHAR buf[32];

HANDLE  hout = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE  hin  = GetStdHandle(STD_INPUT_HANDLE);

if(hout == INVALID_HANDLE_VALUE || hin == INVALID_HANDLE_VALUE)

return 1;

SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);

SetConsoleTitleW(L"Многопользовательский чат локальной сети курсовая группы ПИ ЗАО 2-й курс Тайсин Забир ");

CONSOLE_SCREEN_BUFFER_INFO sinfo = {0};

GetConsoleScreenBufferInfo(hout, &sinfo);

sinfo.dwSize.Y = 25;

SetConsoleScreenBufferSize(hout, sinfo.dwSize);

DWORD  dwrite = 0u;

CharToOemA("Ведите порт: ", buf);

WriteConsoleA(hout, (LPVOID)buf, lstrlenA(buf), &dwrite, NULL);

if(! ReadConsoleA(hin, (LPVOID)buf, sizeof(buf) - 1, &dwrite, NULL))

return 1;

FlushConsoleInputBuffer(hin);

USHORT port = (USHORT)atoi(buf);

port &= 0xFFFF;

xTCPServer*  server = new xTCPServer();

if(server->Create(port)) {

CharToOemA("Для остановки сервера любая клавиша", buf);

SetConsoleTextAttribute(hout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);

WriteConsoleA(hout, (LPVOID)buf, lstrlenA(buf), &dwrite, NULL);

ReadConsoleA(hin,   (LPVOID)buf, sizeof(buf),   &dwrite, NULL);

for(std::list<xClient*>::iterator iter = clients.begin(); iter != clients.end(); ++iter)

delete (*iter);

if(clients.size() > 0u)

clients.clear();

}

delete server;

server = NULL;

WSACleanup();

CloseHandle(event);

return 0;

}

 

2. Листинг  программы клиента для многопользовательского  чата для локальной сети

include "xTCPClient.h"

#include <windows.h>

#include "xEditOutput.h"

#include "resource.h"

#define   BUFSIZE     512

#define   IDC_OUTPUT  555

LRESULT CALLBACK  ConnectProc(HWND hDlg, UINT msg, WPARAM  wParam, LPARAM lParam);

LRESULT CALLBACK  ChatProc(HWND hDlg, UINT msg, WPARAM  wParam, LPARAM lParam);

LRESULT CALLBACK  EditProc(HWND edit, UINT msg, WPARAM wParam, LPARAM lParam);

void  OnReader(const CHAR* buf,  int size);

void  OnError(int code);

void  MessageError(HWND hwnd, int code);

xEditOutput*  edit_out    = NULL;

xTCPClient* tcp_client    = NULL;

CHAR        user_name[17] = "none";

WNDPROC     edit_proc     = NULL;

HWND        chat_wnd      = NULL;

int  WINAPI  WinMain(HINSTANCE  hInstance, HINSTANCE  hPrevInstance, LPSTR  lpCmdLine, int nShowCmd) {

xTCPClient::Init();

int result = DialogBoxA(hInstance, MAKEINTRESOURCEA(IDD_CONNECT), NULL, (DLGPROC)ConnectProc);

if(result != 0)

DialogBoxParamA(hInstance, MAKEINTRESOURCEA(IDD_CHAT), NULL, (DLGPROC)ChatProc, (LPARAM)(HINSTANCE)hInstance);

if(tcp_client != NULL)

delete tcp_client;

tcp_client = NULL;

xTCPClient::Free();

return 0;

}

LRESULT CALLBACK  ChatProc(HWND hDlg, UINT msg, WPARAM  wParam, LPARAM lParam) {

CHAR buf[BUFSIZE + 32];

int  len;

switch(msg) {

case WM_INITDIALOG:

chat_wnd  = hDlg;

edit_proc = (WNDPROC) SetLong(GetDlgItem(hDlg, IDC_INPUT), GWL_WNDPROC, (LONG)EditProc);

ZeroMemory(buf, sizeof(buf));

SendDlgItemMessage(hDlg, IDC_INPUT, EM_LIMITTEXT, (WPARAM)int(BUFSIZE - 16), 0);

edit_out = new xEditOutput((HINSTANCE)lParam);

edit_out->Create(hDlg, 10, 17, 316, 320, IDC_OUTPUT);

SendDlgItemMessageA(hDlg, IDC_DELETE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)(HICON)LoadIconA((HINSTANCE)lParam, MAKEINTRESOURCEA(IDI_ICON3)));

return TRUE;

case WM_COMMAND:

if(LOWORD(wParam)  == IDC_SEND) {

if(GetWindowTextLengthA(GetDlgItem(hDlg, IDC_INPUT)) <= 1)

break;

len = (int)wsprintfA(buf, "%s|", user_name);

GetDlgItemTextA(hDlg, IDC_INPUT, buf + len, BUFSIZE - 1);

if(! tcp_client->Send(buf, len)) {

MessageError(hDlg, len);

break;

}

GetDlgItemTextA(hDlg, IDC_INPUT, buf, BUFSIZE - 1);

edit_out->Add(user_name, buf, true);

SetDlgItemTextA(hDlg, IDC_INPUT, "");

} else if(LOWORD(wParam) == IDC_DELETE) {

if(edit_out->GetSize() == 0u)

break;

if(MessageBoxA(hDlg, "Вы  точно хотите удалить все сообщения,  Да или Нет ?", "Удаление", MB_YESNO | MB_ICONQUESTION) == IDYES)

 edit_out->Clear();

}

break;

case WM_CLOSE:

if(edit_out != NULL)

delete edit_out;

edit_out = NULL;

EndDialog(hDlg, 0);

break;

}

return FALSE;

}

void  OnReader(const CHAR* buf,  int size) {

CHAR  str[18] = {'\0'};

CHAR* to = str;

const CHAR* p = NULL;

for(p = buf; *p != '|' && *p; *to++ = *p++);

if((str[0] != '\0') && (p != NULL))

edit_out->Add(str, p + 1);

}

void  OnError(int code) {

MessageError(GetActiveWindow(), code);

ExitProcess(0u);

}

void  MessageError(HWND hwnd, int code) {

HLOCAL local = NULL;

FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,

NULL, DWORD(code), MAKELANGID(LANG_USER_DEFAULT, SUBLANG_ENGLISH_US), (CHAR*)&local, 0, NULL);

if(local != NULL) {

MessageBoxA(hwnd, (const CHAR*)LocalLock(local), "Ошибка", MB_OK | MB_ICONSTOP);

LocalUnlock(local);

LocalFree(local);

local = NULL;

}

LRESULT CALLBACK  ConnectProc(HWND hDlg, UINT msg, WPARAM  wParam, LPARAM lParam) {

int err = 0;

CHAR   hostname[64] = "localhost";

USHORT port         =  7777u;

switch(msg) {

case WM_INITDIALOG:

tcp_client = new xTCPClient();

SetDlgItemTextA(hDlg, IDC_IP_ADDR, hostname);

SetDlgItemInt(hDlg, IDC_PORT, UINT(port), FALSE);

SetDlgItemTextA(hDlg, IDC_USERNAME, user_name);

SendDlgItemMessage(hDlg, IDC_USERNAME, EM_LIMITTEXT, (WPARAM)16, 0);

SendDlgItemMessage(hDlg, IDC_IP_ADDR,  EM_LIMITTEXT, (WPARAM)64, 0);

return TRUE;

case WM_COMMAND:

if(LOWORD(wParam) == IDC_CONNECT) {

if(GetWindowTextLengthA(GetDlgItem(hDlg, IDC_IP_ADDR)) == 0)

break;

GetDlgItemTextA(hDlg, IDC_IP_ADDR, hostname, sizeof(hostname) - 1);

port = (USHORT) GetDlgItemInt(hDlg, IDC_PORT, NULL, FALSE) & 0xFFFF;

if(GetWindowTextLengthA(GetDlgItem(hDlg, IDC_USERNAME)) == 0) {

MessageBoxA(hDlg, "Вы не задали имя в чате !", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

break;

}

GetDlgItemTextA(hDlg, IDC_USERNAME, user_name, 16);

if(! tcp_client->Create(hostname, port, err, OnReader, OnError)) {

MessageError(hDlg, err);

break;

}

EndDialog(hDlg, 1);

} else if(LOWORD(wParam) == IDC_EXIT)

EndDialog(hDlg, 0);

break;

case WM_CLOSE:

EndDialog(hDlg, 0);

break;

}

return FALSE;

}

LRESULT CALLBACK EditProc(HWND edit, UINT msg, WPARAM wParam, LPARAM lParam){

switch(msg){

case WM_CHAR:

if((LOWORD(wParam) == VK_RETURN) && int(SendDlgItemMessage(chat_wnd, IDC_ENTER, BM_GETCHECK, 0, 0))){

SendMessage(chat_wnd, WM_COMMAND, MAKEWPARAM(IDC_SEND, 0), 0);

PeekMessage(NULL, edit, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE);

return 0;

}

break;

}

return CallWindowProcA(edit_proc, edit, msg, wParam, lParam);

}

3. Руководство  пользователя для многопользовательского  чата для локальной сети

 

Главный принцип  работы чата - кто-то является сервером, а кто-то клиентом. Кто-то создаёт сервер, а потом все к нему присоединяются.

Создание сервера.

1. После запуска  укажите порт для использования  сервером

Соединение клиента  с сервером.

1. Под надписью "IP-адрес" укажите IP-адрес котором создан сервер.

2. Под надписью "Ваше имя в чате" укажите  ваше имя или ник..

3. Кликните  мышкой на кнопке "Соединение".

Отправка сообщений.

1. В строке  «Ваше сообщение для отправки»  напишите ваше сообщение длиной  не более 200 символов.

2. Нажмите  ENTER (или кликните на кнопке "Отправить").

 


Информация о работе Разработка браузера на Borland Delphi 7