Шаг 53.
Пример использования компонента TNMUDP

    На этом шаге мы рассмотрим пример использования компонента TNMUDP.

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


Рис.1. Внешний вид приложения

    Ниже приводится процедура обработки нажатия на кнопку Послать. Здесь задается стандартный уровень детализации сообщений о состоянии, переписываются имя или адрес удаленного компьютера и его номер порта. Если отправляемая строка пустая, то об этом выдается сообщение и выполнение процедуры прекращается. В противном случае, создается поток, в этот поток копируется отправляемая строка, и вызывается метод SendStream. После этого поток удаляется из памяти.

procedure TForm1.Button1Click(Sender: TObject);
var
  MyStream: TMemoryStream;
  TmpStr: String;
begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemoteHost := Edit1.Text;
  NMUDP1.RemotePort := StrToInt(Edit2.Text);
  TmpStr := Edit3.Text;
  if Length (TmpStr) = 0 then
         ShowMessage('Введите строку сообщения') else
  begin
   MyStream := TMemoryStream.Create;
   try
    MyStream.Write(TmpStr[1],Length(Edit3.Text));
    NMUDP1.SendStream (MyStream);
   finally
    MyStream.Free;
   end;
  end;
end;

    Следующая процедура - это обработчик события OnDataReceived:

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var
  MyStream: TMemoryStream;
  TmpStr: String;
begin
  MyStream := TMemoryStream.Create;
  try
    NMUDP1.ReadStream(MyStream);
    SetLength(TmpStr,NumberBytes);
    MyStream.Read(TmpStr[1],NumberBytes);
    Memo1.Lines.Add(FromIP+': '+TmpStr);
  finally
    MyStream.Free;
  end;
  StatusBar1.SimpleText := 'Данные получены'; 
end;

    Событие это происходит при получении данных. В обработчике этого события мы должны предусмотреть обработку полученных датаграмм. В данном случае мы создаем поток, копируем в него полученные данные, переписываем их в строку и добавляем эту строку в компонент мемо. После этого поток удаляется, и в строку состояния выдается сообщение Данные получены. Остальные процедуры совсем простые, и вы можете их найти в приводимом ниже листинге примера.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, NMUDP, ComCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Memo1: TMemo;
    NMUDP1: TNMUDP;
    StatusBar1: TStatusBar;
    procedure Button1Click(Sender: TObject);
    procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    procedure NMUDP1DataSend(Sender: TObject);
    procedure NMUDP1InvalidHost(var handled: Boolean);
    procedure NMUDP1Status(Sender: TComponent; status: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyStream: TMemoryStream;
  TmpStr: String;
begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemoteHost := Edit1.Text;
  NMUDP1.RemotePort := StrToInt(Edit2.Text);
  TmpStr := Edit3.Text;
  if Length (TmpStr) = 0 then
         ShowMessage('Введите строку сообщения') else
  begin
   MyStream := TMemoryStream.Create;
   try
    MyStream.Write(TmpStr[1],Length(Edit3.Text));
    NMUDP1.SendStream (MyStream);
   finally
    MyStream.Free;
   end;
  end;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var
  MyStream: TMemoryStream;
  TmpStr: String;
begin
  MyStream := TMemoryStream.Create;
  try
    NMUDP1.ReadStream(MyStream);
    SetLength(TmpStr,NumberBytes);
    MyStream.Read(TmpStr[1],NumberBytes);
    Memo1.Lines.Add(FromIP+': '+TmpStr);
  finally
    MyStream.Free;
  end;
  StatusBar1.SimpleText := 'Данные получены'; 
end;

procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
  StatusBar1.SimpleText := 'Данные отправлены';
end;

procedure TForm1.NMUDP1InvalidHost(var handled: Boolean);
var
  TmpStr: String;
begin
  If InputQuery('Неверное имя (адрес) получателя!', 
      'Введите правильное значение:', TmpStr) then
  begin
    NMUDP1.RemoteHost := TmpStr;
    Handled := True;
  end;
end;

procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);
begin
  If StatusBar1 <> nil then
    StatusBar1.SimpleText := status;
end;

end.
Текст этого приложения можно взять здесь.

    На следующем шаге мы рассмотрим компонент TNMURL.




Предыдущий шаг Содержание Следующий шаг