Шаг 35.
Создание Internet-приложений в среде Delphi. Компонент TNMDayTime

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




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