Автор работы: Пользователь скрыл имя, 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
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*>(
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*>::
if(! (*iter)->IsConnected()) { // если есть свободный
(*iter)->Attach(sock); // присоеденим нового клиента к нему
check = false;
break;
}
}
// Если свободных элементов нет
if(check) {
EnterCriticalSection(§ion)
xClient* new_client = new xClient();
if(new_client->Create( sock ))
clients.push_back(new_client);
else {
delete new_client;
new_client = NULL;
}
LeaveCriticalSection(§ion)
}
}
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 hin
= GetStdHandle(STD_INPUT_HANDLE)
if(hout == INVALID_HANDLE_VALUE || hin == INVALID_HANDLE_VALUE)
return 1;
SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
SetConsoleTitleW(L"Многопользо
CONSOLE_SCREEN_BUFFER_INFO sinfo = {0};
GetConsoleScreenBufferInfo(
sinfo.dwSize.Y = 25;
SetConsoleScreenBufferSize(
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*>::
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((
return TRUE;
case WM_COMMAND:
if(LOWORD(wParam) == IDC_SEND) {
if(GetWindowTextLengthA(
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, "Вы
точно хотите удалить все
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()
ExitProcess(0u);
}
void MessageError(HWND hwnd, int code) {
HLOCAL local = NULL;
FormatMessageA(FORMAT_MESSAGE_
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(
break;
GetDlgItemTextA(hDlg, IDC_IP_ADDR, hostname, sizeof(hostname) - 1);
port = (USHORT) GetDlgItemInt(hDlg, IDC_PORT, NULL, FALSE) & 0xFFFF;
if(GetWindowTextLengthA(
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_
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. В строке
«Ваше сообщение для отправки»
напишите ваше сообщение
2. Нажмите ENTER (или кликните на кнопке "Отправить").