На этом шаге мы рассмотрим пример использования компонента 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.