На этом шаге мы рассмотрим компонент TNMDayTime.
Компонент TNMDayTime предназначается для получения даты и времени от серверов даты и времени в Интернет и интранет в соответствии col стандартом RFC 867, называемым "Протокол времени суток" (Daytime Protocol, 1983). Если у вас в "подчинении" один домашний компьютер,то время на нем можно периодически подводить по своим часам - здесь точность не требуется. Но если вы администратор малой или большой сети или у вас есть многопользовательская программа, то для синхронизации времени на машинах нужно использовать некий механизм. Например, эту возможность, предоставляемую Интернет.
В Интернет используются четыре временных протокола. Протокол, используемый в TNMDayTime, достаточно простой и дает время с погрешностью в 1 секунду. Этому компоненту требуется наличие 32-битного стека протоколов TCP/IP (библиотеки WSOCK32.DLL), поставляемой с операционными системами Windows 95/98/NT. За протоколом даты/времени закреплен порт 13.
Перед тем, как использовать этот компонент, вы должны знать имя или IP-адрес соответствующего сервера Интернет и присвоить это значение свойству Host, в которое помещается имя сервера или разделенный точками его IP-адрес. После того, как вы сделали это и установили соединение, вам остается считать полученное значение из свойства DayTimeStr.
У этого компонента нет собственных методов, все наследуются. Свойства также наследуются, кроме одного - DayTimeStr.
Чтобы создать рассматриваемый нами пример с компонентом TNMDayTime, вам нужно поместить в форму нового приложения панель и на панели разместить кнопку, две метки, два окна редактирования и компонент TNMDayTime. Кроме того на форму нужно добавить еще одну метку и строку состояния. Назначение этих компонентов понятно из рисунка 1.
Рис.1. Приложение на этапе проектирования
Затем нужно записать в обработчике события OnClick кнопки следующий текст:
procedure TForm1.Button1Click(Sender: TObject); begin NMDayTime1.ReportLevel := Status_Basic; NMDayTime1.TimeOut := 30000; NMDayTime1.Host := Edit1.Text; NMDayTime1.Port := StrToInt(Edit2.Text); Label3.Caption := 'Текущие дата и время: '+NMDayTime1.DayTimeStr; end;
В этом примере свойство ReportLevel имеет значение Status_Basic, обеспечивающее стандартную детализацию информации о состоянии объекта. Свойству TimeOut присвоено значение 30 секунд (30000 миллисекунд). Это свойство задает максимальное время ожидания ответа от сервера. Если здесь задать маленькое число, а у вас очень медленное соединение с Интернет, то ваша программа может не дождаться ответа. По умолчанию этому свойству присваивается нулевое значение, означающее бесконечное ожидание ответа, - пока не получим. Но в этом случае, если ответ по каким-то причинам не придет, то ваша программа "зависнет". Свойство Host получает значение из окна редактирования Edit1, которому мы задаем значение "www.netmastersllc.com" на этапе разработки. На этом сервере запущен сервер даты-времени. Аналогичным образом задается значение для свойства Port. И, наконец, значение свойства DayTimeStr компонента TNMDayTime присваивается свойству Caption метки Label3. Формат строки времени и даты, возвращаемой свойством DayTimeStr, определяется самим сервером.
Ниже приводится текст программы, в котором присутствуют еще понятные элементы оформления. Речь идет о строке состояния - компоненте TStatusBar. В этом примере, как и во всех остальных, во время разработки программы присваивайте свойству SimplePanel этого компонента значение True.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Psock, NMDayTim, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; NMDayTime1: TNMDayTime; StatusBar1: TStatusBar; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure NMDayTime1Connect(Sender: TObject); procedure NMDayTime1Disconnect(Sender: TObject); procedure NMDayTime1HostResolved(Sender: TComponent); procedure NMDayTime1Status(Sender: TComponent; Status: String); procedure NMDayTime1ConnectionFailed(Sender: TObject); procedure NMDayTime1InvalidHost(var Handled: Boolean); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin NMDayTime1.ReportLevel := Status_Basic; NMDayTime1.TimeOut := 30000; NMDayTime1.Host := Edit1.Text; NMDayTime1.Port := StrToInt(Edit2.Text); Label3.Caption := 'Текущие дата и время: '+NMDayTime1.DayTimeStr; end; procedure TForm1.NMDayTime1Connect(Sender: TObject); begin StatusBar1.SimpleText := 'Соединились'; end; procedure TForm1.NMDayTime1Disconnect(Sender: TObject); begin StatusBar1.SimpleText := 'Соединение завершено'; end; procedure TForm1.NMDayTime1HostResolved(Sender: TComponent); begin StatusBar1.SimpleText := 'Найден сервер'; end; procedure TForm1.NMDayTime1Status(Sender: TComponent; Status: String); begin If StatusBar1 <> nil Then StatusBar1.SimpleText := Status; end; procedure TForm1.NMDayTime1ConnectionFailed(Sender: TObject); begin ShowMessage('Не удалось установить соединение с сервером'); end; procedure TForm1.NMDayTime1InvalidHost(var Handled: Boolean); Var S:String; begin If InputQuery('Имя сервера указано неправильно!', 'Задайте новое имя', S) Then Begin NMDayTime1.Host := S; Edit1.Text := S; Handled := True; End; end; end.
На следующем шаге мы рассмотрим компонент TNMTime.