- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Delphi. Учимся на примерах - Сергей Парижский
Шрифт:
Интервал:
Закладка:
Рис. 16.1. Форма клиентской программы для удаленного управления указателем
Разработка программного кода
По нажатию кнопки Connect должны считываться все настройки и выполняться соединение с сервером:
procedure TForm1.Button1Click(Sender: TObject);
begin
Client.Port:= StrToInt(port.Text); //считываем порт
Сlient.Address:= ip.text; //считываем ip-адрес сервера
Client.Active:= True; //соединяемся
Timer1.Enabled:= True; //включаем таймер
end;
Сначала мы считываем все необходимые настройки, а затем предпринимаем попытку соединиться с сервером. Если все нормально, то включаем таймер, по которому будут передаваться координаты указателя мыши.
Обработаем нажатие кнопки Disconnect:
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:= False;//выключаем таймер
Client.Close; //закрываем соединение
Client.Active:=False; //отключаемся от сервера
end;
При нажатии кнопки Disconnect мы перестаем передавать координаты указателя на сервер и отсоединяемся от него.
Для того чтобы на сервере не возникало ошибок при аварийном выключении клиента, создайте обработчик события формы OnDestroy и добавьте в него следующий код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
Client.Close; //закрываем соединение
Client.Active:=False; //отключаемся от сервера
end;
При аварийном завершении программы закрывается соединение и выполняется отключение от сервера.
Для уведомления пользователя об успешном соединении с сервером создайте обработчик события client.OnConnect:
procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage('Connected!'); //показать сообщение
end;
Для реализации аналогичного действия при отсоединении от сервера, следует создать обработчик события OnDisconnect:
procedure TForml.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage('Disconnected!'); //сообщение при отсоединении
end;
Теперь обработаем событие OnTimer для компонента Timer:
procedure TForm1.Timer1Timer(Sender: TObject);
var
cur:TPoint; //хранит координаты указателя мыши
begin
GetCursorPos(cur); //узнаем координаты указателя мыши
//отправляем данные на сервер
Client.Socket.SendText(IntToStr(cur.X) +'_' + IntToStr(cur.Y));
end;
Каждые полсекунды мы будем получать координаты указателя мыши и отправлять их на сервер. Программа-клиент полностью готова. Теперь разработаем программу-сервер.
Разработка серверной программы
Создайте новый проект Delphi. Разместите на форме главный компонент программы — ServerSocket категории Internet и измените значение его свойства Port на 2801.
Первым делом, обеспечим нашей форме невидимость. Создайте обработчик события формы OnPaint и добавьте в него следующий код:
procedure TForm1.FormPaint(Sender: TObject);
begin
Form1.Hide;
end;
Для того чтобы активизировать сервер при запуске программы, необходимо обработать событие формы OnCreate:
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:= True; //активизировать сервер
end;
Для того чтобы при выходе из программы сервер отключался, необходимо обработать событие формы OnDestroy:
procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active:= False; //отключаем сервер
end;
Теперь осталось только обработать событие OnClientRead компонента ServerSocket. Это событие будет происходить каждый раз, когда будет поступать команда от клиента. Код обработчика этого события имеет следующий вид:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
str, x, y: string; //полученный текст и координаты
//указателя по X и по Y
i, j: integer; //счетчики циклов
begin
//обнуляем координаты курсора
х := ' ';
у := ' ';
str:= Socket.ReceiveText; //полученный от клиента текст
for i:=1 to Length(str) do begin
if str[i] <> '_' then x:= x + str[i]; //координаты по х
if str[i] = '_' then Break; //разделитель между
//координатами указателя
end;
for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у
//устанавливаем новые координаты указателя
SetCursorPos(StrToInt(x), StrToInt(у));
end;
При получении текста мы считываем в отдельные переменные значение координат указателя по X и по Y. Затем изменяем координаты на те, которые только что получили от клиента.
Теперь программа полностью готова, и для того чтобы протестировать ее, необходимо иметь хотя бы два компьютера, объединенные в локальную сеть или подключенные к Internet.
Полный исходный код модулей
Полный код модуля серверной программы представлен в листинге 16.1.
Листинг 16.1. Модуль серверной программыunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp;
type TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ServerSocketlClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active:= False; //отключаем сервер
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:= True; //активизировать сервер
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
str, x, y: string; //полученный текст и координаты
//указателя по X и по Y
i, j: integer; //счетчики циклов
begin
//обнуляем координаты курсора
х := ' ';
у := ' ';
str:= Socket.ReceiveText; //полученный от клиента текст
for i:=1 to Length(str) do begin
if str[i] <> '_' then x:= x + str[i]; //координаты по х
if str[i] = '_' then Break; //разделитель между
//координатами указателя
end;
for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у
//устанавливаем новые координаты указателя
SetCursorPos(StrToInt(x), StrToInt(у));
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Form1.Hide;
end;
end.
Полный код модуля клиентской программы представлен в листинге 16.2.
Листинг 16.2. Модуль клиентской программыunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls;
type TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Client: TClientSocket;
Timer1: TTimer;
port: TEdit;
ip: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:= False;//выключаем таймер
Client.Close; //закрываем соединение
Client.Active:= False; //отключаемся от сервера
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Client.Close; //закрываем соединение
Client.Active:=False; //отключаемся от сервера
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Client.Port:= StrToInt(port.Text); //считываем порт
Сlient.Address:= ip.text; //считываем ip-адрес сервера
Client.Active:= True; //соединяемся
Timer1.Enabled:= True; //включаем таймер
end;
procedure TForm1.Timer1Timer(Sender: TObject);