Delphi. Учимся на примерах

Парижский Сергей Михайлович

Глава 15

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

 

 

Постановка задачи

Разработать программу, которая будет предоставлять интерфейс для использования стандартной для Win2000/XP команды передачи сообщений net send. Дать возможность указать пользователю адрес получателя, текст сообщения и количество отправляемых сообщений. Также предусмотреть возможность установки блокировки на получение сообщений от других компьютеров.

 

Разработка формы

Создайте новый проект Delphi. Измените заголовок формы (свойство Caption) на Net Sender. Разместите вдоль левого края формы один над другим три компонента Label категории Standard и присвойте их свойству Caption значения IP-адрес:, Сообщение: И Количество:.

Рядом с каждой из меток разместите по компоненту Edit категории Standard. Самый верхний назовите ip (свойство Name), а свойству Text присвойте значение 192.168.0.1.; среднее поле назовите txt, а свойству Text присвойте какой-либо текст сообщения по умолчанию; самое нижнее поле назовите how, а свойству Text присвойте значение 1.

Под перечисленными компонентами разместите компонент Checkbox категории Standard. Присвойте ему имя secure, свойству Caption присвойте значение Отключить прием сообщений, а свойству Checked — значение True.

В самом низу формы разместите кнопку (компонент Button категории Standard), присвоив ее свойству Caption значение Send. Также нам понадобится таймер (компонент Timer категории System), для которого свойству Interval следует присвоить значение 10.

Полученная форма должна соответствовать рис. 15.1.

Рис. 15.1. Форма для программы отправки сообщений в локальной сети

 

Разработка программного кода

Прежде всего напишем собственную процедуру bomb, которая будет считывать все настройки и отправлять сообщение. Объявите эту процедуру как закрытый член класса формы:

type

В TForm1 = class(TForm)

 …

private

В { Private declarations }

В procedure bomb() ;

public

В { Public declarations }

end;

Также нам понадобится глобальная переменная i типа integer:

var

В Form1: TForm1;

В  i: integer;

Теперь создадим реализацию процедуры bomb в разделе implementation:

procedure TForm1.bomb() ;

begin

 //проверяем, не пустое ли текстовое сообщение

В if txt.Text = '' then txt.Text:= '!';

 //если количество не указано, то отправляем одно сообщение

В if how.Text= '' then how.Text:= '1';

 if ip.Text = '' then ip.Text:= '127.0.0.1'; {если ip-адрес не указан, то отправляем на локальный компьютер}

 //отправляем указанное количество сообщений

В  for i:=1 to StrToInt(how.Text) do

  WinExec(PChar('net send ' + ip.Text + '"' + txt.Text + '"'), 0); //отправка сообщения

end;

В этой процедуре выполняется проверка: все ли необходимые поля заполнены. Если нет текста сообщения, то устанавливаем знак "!"; если не указан IP-адрес, то отправляем сообщение на локальный компьютер с адресом 127.0.0.1; если не указано количество сообщений, то отправляем одно сообщение. Сообщения отправляются с помощью стандартной команды net send, которая имеет следующий синтаксис:

net send ip-адрес сообщение.

Теперь обработаем событие таймера OnTimer:

procedure TForm1.Timer1Timer(Sender: TObject);

var

 h: HWND; //хранит идентификатор окна

begin

 if not secure.Checked then //если флажок не установлен

  Timer1.Enabled:= False; //отключаем мониторинг

 if secure.Checked then //если флажок установлен

В  begin

  //ищем окна с сообщениями

  h:= FindWindow(nil, 'Служба сообщений '); //закрываем все найденные окна

В  if hВ <>В 0 then PostMessage(h, WM_QUIT, 0, 0);

В  end;

end;

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

Для того чтобы можно было переключаться между этими двумя режимами, необходимо создать обработчик события secure.OnClick:

procedure TForm1.secureClick(Sender: TObject);

begin

 if secure.Checked then //если флажок установлен…

  Timer1.Enabled:= True; //…включаем мониторинг

end;

При нажатии кнопки Send мы будем просто вызывать процедуру bomb:

procedure TForm1.Button1Click(Sender: TObject);

begin

В  bomb;

end;

Для того чтобы облегчить пользователю жизнь, сделаем так, чтобы отправка сообщения осуществлялась также по нажатии клавиши в любом текстовом поле ввода. Для этого необходимо создать обработчик события OnKeyPress для каждого из полей. Код этого обработчика для поля ip, который затем можно назначить полям txt и how:

procedure TForm1.ipKeyPress(Sender: TObject; var Key: Char);

begin

 if key = #13 then //если нажата клавиша

 bomb; //отправка сообщения

end;

 

Полный исходный код модуля

Полный код модуля программы отправки сообщений по локальной сети представлен в листинге 15.1.

Листинг 15.1. Модуль программы отправки сообщений по локальной сети

unit Unit1;

interface

uses

В Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type TForm1 = class(TForm)

В Button1: TButton;

В ip: TEdit;

В Label1: TLabel;

В Label2: TLabel;

В txt: TEdit;

В Label3: TLabel;

В how: TEdit;

В secure: TCheckBox;

В Timer1: TTimer;

В procedure Timer1Timer(Sender: TObject);

В procedure secureClick(Sender: TObject);

В procedure ipKeyPress(Sender: TObject; var Key: Char);

В procedure txtKeyPress(Sender: TObject; var Key: Char);

В procedure howKeyPress(Sender: TObject; var Key: Char);

В procedure Button1Click(Sender: TObject);

private

В { Private declarations }

В procedure bomb();

public

В { Public declarations }

end;

var

В Form1: TForm1;

В i: integer;

implementation

{$R *.dfm}

procedure TForm1.bomb();

begin

 //проверяем, не пустое ли текстовое сообщение

В if txt.Text = '' then txt.Text:= '!';

 //если количество не указано, то отправляем одно сообщение

В if how.Text= '' then how.Text:= '1';

 if ip.Text = '' then ip.Text:= '127.0.0.1'; {если ip-адрес не указан, то отправляем на локальный компьютер}

 //отправляем указанное количество сообщений

В for i:=1 to StrToInt(how.Text) do

  WinExec(PChar('net send ' + ip.Text + '"' + txt.Text + '"'), 0); //отправка сообщения

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var

 h: HWND; //хранит идентификатор окна

begin

 if not secure.Checked then //если флажок не установлен

  Timer1.Enabled:= False; //отключаем мониторинг

 if secure.Checked then //если флажок установлен

В begin

  //ищем окна с сообщениями

  h:= FindWindow(nil, 'Служба сообщений '); //закрываем все найденные окна

В  if hВ <>В 0 then PostMessage(h, WM_QUIT, 0, 0);

В end;

end;

procedure TForm1.secureClick(Sender: TObject);

begin

 if secure.Checked then //если флажок установлен…

  Timer1.Enabled:= True; //…включаем мониторинг

end;

procedure TForm1.ipKeyPress(Sender: TObject; var Key: Char);

begin

 if key = #13 then //если нажата клавиша

 bomb; //отправка сообщения

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

В bomb;

end;

end.

⊚ Р’СЃРµ файлы проекта Рё исполняемый файл рассмотренной программы находятся РЅР° прилагаемом Рє РєРЅРёРіРµ компакт-РґРёСЃРєРµ РІ папке Chapter 15.