На этом шаге мы рассмотрим компонент TNMTime и приведем пример его использования.
Компонент TNMTime получает данные от серверов времени в соответствии с протоколом RFC 868.
Перед тем, как запросить время у сервера времени, необходимо в свойстве Host указать имя сервера или его IP-адрес. Свойство Port изменяется только в том случае, если сервер, к которому обращается программа, "слушает" нестандартный порт.
После задания имени сервера читается содержание свойства TimeStr, в которое записывается полученное от сервера времени, значение.
У этого компонента нет собственных методов и событий, и только два своих свойства TimeStr и TimeInt, остальные наследуются от TComponent и TPowersock.
Чтобы создать рассматриваемую программу с компонентом TNMTime, нужно поместить в форму нового приложения панель и на панели разместить кнопку, две метки, окна редактирования и компонент TNMTime. Кроме этого, на форму нужно добавить еще одну метку и строку состояния. Назначение этих компонентов понятно из рисунка 1.
Рис.1. Приложение на этапе проектирования
Затем следует записать в обработчик события OnClick кнопки Button1 следующий текст:
NMTime1.Host := Edit1.Text; NMTime1.Port := StrToInt(Edit2.Text); NMTime1.TimeOut := 30000; Labe13.Caption := StdCap+NMTime1.TimeStr;
Перед тем, как нажать на кнопку "Получить время", вводится имя сервера "time.nist.gov". Время ожидания задается равным 30 секундам.
Текст программы приводится ниже.
unit TiraeDem; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Psock, ExtCtrls, NMTime, ComCtrls; type TForm1 = class(TForm) Pane11: TPane1; Edit2: TEdit; //окно ввода номера порта Labe11: TLabe1; //"Сервер" Labe12: TLabe1; //"Порт" Button1: TButton; //"Получить время" Labe13: TLabe1; //текущее время NMTime1: TNMTime; StatusBar1: TStatusBar; Edit1: TEdit; //окно ввода имени сервера procedure Button1Click(Sender: TObject); procedure NMTime1Connect(Sender: TObject); procedure NMTime1ConnectionFailed(Sender: TObject); procedure NMTime1Disconnect(Sender: TObject); procedure NMTime1HostResolved(Sender: TComponent); procedure NMTime1InvalidHost(var handled: Boolean); procedure NMTime1Status(Sender: TComponent; Status: String); private { Private declarations } public { Public declarations } end; const StdCap = 'Текущее время : '; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin NMTime1.Host := Edit1.Text; NMTime1.Port := StrToInt(Edit2.Text) ; NMTime1.Timeout := 30000; Labe13.Caption := StdCap+NMTime1.TimeStr; end; procedure TForm1.NMTime1Connect(Sender: TObject); begin StatusBar1.SimpleText := 'Соединение установлено'; end; procedure TForm1.NMTime1ConnectionFailed(Sender: TObject); begin ShowMessage('Ошибка соединения'); end; procedure TForm1.NMTime1Disconnect(Sender: TObject); begin if StatusBar1 <> nil then StatusBar1.SimpleText:= 'Соединение завершено'; end; procedure TForm1.NMTime1HostResolved(Sender: TComponent); begin StatusBar1.SimpleText := 'Соединение с узлом'; end; procedure TForm1.NMTime1InvalidHost(var handled: Boolean); var TmpStr: String; begin if (InputQuery('Указано неверное имя сервера', 'Введите правильное имя', TmpStr)) then begin NMTime1.Host := TmpStr; Edit 1.Text := TmpStr; handled := true; end; end; procedure TForm1.NMTime1Status(Sender: TComponent; Status: String); begin if (StatusBar1 <> nil) then StatusBar1.SimpleText := Status; end; end.
На следующем шаге мы рассмотрим компоненты TNMMsg и TNMMsgServ.