Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.01.03 20:27 
Schon oben. ´s lagert hier (4,23k). Ist nur der Quellcode; ich denke: Delphi-Versions unabhängig; für Nicht-Visual Studio-Besitzer (ich erstelle die Dialogressourcen damit!) liegt eine "dialog.NoVS.rc" bei.

btw: Ich bin ein bisschen unsicher wg. dieser Zeile:
ausblenden Quelltext
1:
st.wYear := 1970;					

Bei Burgpflanze steht im Code (s. erste Seite) "1900", aber die ganzen Infos zum Protokoll beziehen sich auf die abgelaufenen Sekunden seit dem 1. Januar 1970, Null Uhr. Wie dem auch sei - auf die Zeit hat´s keinen Einfluss. Ich lasse das Ding gerade laufen, und es wird mir auch 18 Uhr 31 (UTC) angezeigt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.01.03 22:56 
Wenn ich da 1900 eintrage dann stimmt auch das Datum. Im laufe des Abends wird von mir noch ein Programm kommen um dann die Systemzeit mit dem Zeitserver abzugleichen.

Kennt in diesem Zusammenhang jemand eine Liste mit zeitservern? Einer kann ja mal down sein.

Hier mal der aktuelle Stand der Dinge (noch ohne Soße, da noch nicht fertig): INetTime

Ungepackte Exe da nonVCL. :wink:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 09:47 
Zitat:
Wenn ich da 1900 eintrage dann stimmt auch das Datum.

Ja, das habe ich auch gemerkt. Nun wissen wir auch, warum 1900 da stehen muss ...

Zitat:
Im laufe des Abends wird von mir noch ein Programm kommen um dann die Systemzeit mit dem Zeitserver abzugleichen.

Irgendwie habe ich genau das ... äh ... befürchtet ... :wink:

Zitat:
Kennt in diesem Zusammenhang jemand eine Liste mit zeitservern?

Nein. Aber ich hoffe, du machst es von Anfang an so, dass alle Zeitserver in einer externen INI liegen. Dann kann der Anwender deine Vorgaben rausschmeißen und eigene benutzen, oder eigene hinzufügen, usw.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 16:16 
MathiasSimmack hat folgendes geschrieben:
Bei Burgpflanze steht im Code (s. erste Seite) "1900", aber die ganzen Infos zum Protokoll beziehen sich auf die abgelaufenen Sekunden seit dem 1. Januar 1970, Null Uhr.

Sorry, mein Fehler. Im Time Protocol heißt es ganz klar:
Zitat:
The time is the number of seconds since 00:00 (midnight) 1 January 1900 GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this base will serve until the year 2036.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 17:35 
MathiasSimmack hat folgendes geschrieben:
Aber ich hoffe, du machst es von Anfang an so, dass alle Zeitserver in einer externen INI liegen. Dann kann der Anwender deine Vorgaben rausschmeißen und eigene benutzen, oder eigene hinzufügen, usw.

Tztztz, was denkst du von mir? :cry:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 18:46 
Es war ja nur ein Gedanke, Luckie. Anhand der Exe kann man ja nicht sehen, ob da schon INI-Funktionalität drin ist ... Ich hab´s mal ausprobiert für das DateTime-Beispiel aus den Tutorials.
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
//
// Liste mit den Zeitservern aus der INI-Datei lesen
//
const
  szDateTimeIni = 'DateTime.ini';
  szIniKey      = 'serverlist';
  BUFSIZE       = 16348;

procedure LoadTimeServers(hCombobox: HWND);
var
  buf, p        : pchar;
  kl            : array of string;
  i             : integer;
begin
  // Inhalt der Combobox leeren
  SendMessage(hCombobox,CB_RESETCONTENT,0,0);

  // Topicnamen aus der INI lesen
  GetMem(buf,BUFSIZE);
  try
    SetLength(kl,0);
    if(GetPrivateProfileString(szIniKey,nil,nil,buf,BUFSIZE,
      pchar(ExtractFilePath(paramstr(0)) + szDateTimeIni)) <> 0) then
    begin
      p := buf;
      while(p^ <> #0) do begin
        SetLength(kl,length(kl)+1);
        kl[length(kl)-1] := p;

        inc(p,strlen(p)+1);
      end;
    end;
  finally
    FreeMem(buf,BUFSIZE);
  end;

  // Werte aus der INI lesen, & in die Combobox eintragen
  if(length(kl) > 0) then begin
    GetMem(buf,BUFSIZE);
    try
      for i := 0 to length(kl)-1 do begin
        ZeroMemory(buf,BUFSIZE);
        if(GetPrivateProfileString(szIniKey,@kl[i][1],nil,
          buf,BUFSIZE,pchar(ExtractFilePath(paramstr(0)) + szDateTimeIni)) <> 0) then

        SendMessage(hCombobox,CB_ADDSTRING,0,LPARAM(buf));
      end;
    finally
      FreeMem(buf,BUFSIZE);
    end;

    SetLength(kl,0);
  end;

  // Eintrag auswählen, wenn vorhanden
  if(SendMessage(hCombobox,CB_GETCOUNT,0,0) > 0) then
    SendMessage(hCombobox,CB_SETCURSEL,0,0);
end;

Ein paar Server, die ich noch so gefunden habe:
ausblenden Quelltext
1:
2:
3:
4:
5:
[serverlist]
svr1=ntpserv.fh-magdeburg.de
svr2=ntps1-0.cs.tu-berlin.de
svr3=ntps1-1.cs.tu-berlin.de
svr4=ntps1-1.uni-erlangen.de

Allerdings hab´ ich´s mir verkniffen, jede Sekunde zu checken. Da leidet die Performance. Ein Buttonklick wäre sinnvoller.

Ach ja, als Tipp für dein Programm: bitte nicht selbst wählen lassen! Ich würde prüfen, ob eine Verbindung besteht, und dann anbieten, die Zeit von einem Server zu holen, usw.
Mir gefällt´s nämlich nicht, wenn sich jedes itsy-bitsy Programm ins Web wählt. Ist aber nur meine Meinung. :)

So, bleibt nur noch die Frage: was bedeutet der Multiplikator "10.000.000"? Warum gerade 10Mio? Bzw. was bedeutet dieser Wert?
Wer mir das erklärt, wird von mir namentlich im Update des DateTime-Beitrags von Luckies Tutorials erwähnt ... :wink:

Hm, is´ wahrscheinlich kein Anreiz? :twisted:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 20:32 
So hier ist es: www.auq.de/viewtopic.php?t=5857

Es wählt sich nur leider selber ein. mal sehen, was sich da machen läßt. :wink:
Aber in einem extra Thread checken, ob eine Verbindung betseht, halte ich für etwas übertrieben.
Burgpflanze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: So 12.01.03 21:18 
Unter den folgenden Links findet ihr eine ganze Reihe von
Zeitservern aus aller Welt:
www.eecis.udel.edu/~mills/ntp/clock1a.html
www.eecis.udel.edu/~mills/ntp/clock2a.html

Die beiden wichtigsten deutschen sind:
ptbtime1.ptb.de und ptbtime2.ptb.de .
(Beide Physikalisch-technische Universität Braunschweig)


Gruss, Burgpflanze
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 22:15 
Luckie hat folgendes geschrieben:
Aber in einem extra Thread checken, ob eine Verbindung betseht, halte ich für etwas übertrieben.

Wie: extra Thread? Da ich im genannten DateTime-Beispiel aus den Tutorials einen 1sec-Timer habe (der ja die lokale und UTC-Zeit im System liest und anzeigt), spricht nichts dagegen, in dieser WM_TIMER-Abfrage mit InternetGetConnectedState den Web-Status zu prüfen und den Button für die Server-Zeit entsprechend freizuschalten ... Ach was red´ ich; ich bastel noch ein bisserl am Quellcode rum, dann schick´ ich´s dir einfach mal. :)
Burgpflanze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: Mo 13.01.03 05:39 
@Matthias

Oder benutze ein asynchrones socket, dann brauchst du das nicht in
einen extra Thread packen :wink:

@Luckie

Das einzigste, was ich bisher zu "10.000.000" in Erfahrung bringen konnte:
- Dieser Wert steht für die Anzahl von 100-Nanosekunden-Intervallen pro Sekunde
(1 sec = 1.000 millisec = 1.000.000 microsec = 10.000.000 100-nanosec-Intervalle)

@All

Und hier meine überarbeitete Funktion - nun wird auch die Zeitzone berücksichtigt:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
// time ist schon der "gedrehte" Wert
procedure SyncTime(time: Cardinal);
const
  SYSTEM_SECONDS = 10000000;
var
  bias: Integer;
  ft: TFileTime;
  st: TSystemTime;
  li: TULargeInteger;
  tz: TTimeZoneInformation;
begin
  st.wYear := 1900;
  st.wMonth := 1;
  st.wDayOfWeek := 0;
  st.wDay := 1;
  st.wHour := 0;
  st.wMinute := 0;
  st.wSecond := 0;
  st.wMilliseconds := 0;

  if not SystemTimeToFileTime(st, ft) then Exit;

  case GetTimeZoneInformation(tz) of
    TIME_ZONE_ID_DAYLIGHT: bias := tz.Bias + tz.DaylightBias;
    TIME_ZONE_ID_STANDARD: bias := tz.Bias + tz.StandardBias;
    TIME_ZONE_ID_UNKNOWN: bias := 0;
  else
    Exit;
  end;
  bias := -bias;

  li.QuadPart := Int64(time) * SYSTEM_SECONDS + Int64(bias * 60) * SYSTEM_SECONDS;
  li.QuadPart := li.QuadPart + TULargeInteger(ft).QuadPart;

  if not FileTimeToSystemTime(TFileTime(li), st) then Exit;

  SetLocalTime(st);
  SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;


Mfg Burgpflanze


(PS: Vielleicht erwähnt mich Luckie auch in seinem iTime :wink: )