初めまして。ヘリーナと申します。delphi始めてちょうど一月になります。
NTPサーバにアクセスして正確な時間を取得して、PCの時計を合わせる
というプログラムを作ろうと思っているのですが、どうしたらいいのか
わかりません。コンポーネントがあるらしいのですが、使い方が・・・。
ver.6のprofessionalです。できればソースコードを載せていただけると
ありがたいのですが。誰か教えてください。お願いします。
TIdSNTPで出来ませんか?
Delphi7Proでは、プロパティを設定してSyncTimeを呼ぶだけで時刻合わせできました。
Delphi6で出来るかは未確認です。
にしのさん、レスありがとうございます。
TIdSNTPというコンポーネントがありました。
しかし、私はネットワークの知識に明るくないので
プロパティの設定やどのようなソースを書いたらいいのか
よくわかりません。ヘルプやネットで調べましたが
サンプルソースなどが載っていないので困っています。
できれば詳しく教えていただけるとありがたいです。
また、それについて詳しく解説しているホームページなどが
ありましたら教えてください。
よろしくお願いします。
例えば、Hostプロパティにntp1.jst.mfeed.ad.jpと入れるだけです。
ヘルプには載っていませんか?Delphi7Proには英語版のヘルプがあり、Updateに日本語版が公開されていました。
どうしてもサーバから時刻が取れません。
以下のようなソースを書いています。
procedure TForm1.Timer1Timer(Sender: TObject);
var
SDT: String;
begin
//PCの現在の時刻を表示
Label2.Caption := DateToStr(Date);
Label4.Caption := TimeToStr(Time);
IdSNTP1.Host := 'clock.nc.fukuoka-u.ac.jp';
IdSNTP1.Port := 123;
IdSNTP1.Active := True;
Label6.Caption := DateTimeToStr(IdSNTP1.DateTime);
IdSNTP1.Active := False;
if IdSNTP1.SyncTime then
ShowMessage('TRUE')
else
ShowMessage('FALSE');
IdSNTP1.free;
end;
サーバから取得される日は1899/12/30になっています。
SyncTimeもFALSEを返してきます。
TimerでIdSNTP1.free;していますが、どこかでIdSNTP1を再作成しているのでしょうか。
よく知りませんが、
IdSNTP1.SyncTimeは、
ActiveをFalseにした後でもTrueが返ってくるものですか?
二度と使わないならFreeでも構わないと思いますけど。
2度と使わないのであれば、Timer.EnabledはいつFalseになるのでしょう。
ここに提示されたものだけでは、何度も呼び出されそうな気がしますので。
Activeはあまり関係ないですね。
ソースを見ると、DateTimeを取得して、取得できたら同期を取るようです。
DateTimeは、readにGetDateTimeが設定されていて、GetDateTimeで時刻を取得しています。
2つめの発言で、
> Delphi7Proでは、プロパティを設定してSyncTimeを呼ぶだけで時刻合わせできました。
と書いたときにも、ActiveはFalseのまま試してから書いているので、やはり関係なさそうです。
Active関係なかったですね。
これでどうでしょうか?
function GetSNTPTime(Server: String): TDateTime;
begin
with TIdSNTP.Create(Self) do
try
Port:= 123;
Host:= Server;
Result:= DateTime;
finally
Free;
end;
end;
//使う時の例
Label1.Caption:=
FormatDateTime('YY/MM/DD HH:MM:SS',GetSNTPTime('clock.nc.fukuoka-u.ac.jp'));
皆さん、ありがとうございます。
時間が取れました!
ソースの書き方に問題があったようです。
ツイート | ![]() |