?? tclfrm.pas
字號:
{ ************************************************************************
NetTime is copyrighted by Graham Mainwaring. Permission is hereby
granted to use, modify, redistribute and create derivative works
provided this attribution is not removed. I also request that if you
make any useful changes, please e-mail the diffs to graham@mhn.org
so that I can include them in an 'official' release.
************************************************************************ }
unit tclfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, trayicon, Menus, Buttons, ExtCtrls, NetTimeCommon,
About, Options, NetTimeThread, NetTimeClient;
type
TfrmMain = class(TForm)
lblTime: TLabel;
lblGoodness: TLabel;
lblLastSync: TLabel;
Label1: TLabel;
Label2: TLabel;
mnuTray: TPopupMenu;
Properties1: TMenuItem;
N1: TMenuItem;
About1: TMenuItem;
Exit1: TMenuItem;
imgBad: TImage;
imgGood: TImage;
btnSettings: TButton;
Timer1: TTimer;
Button1: TButton;
lblSource: TLabel;
btnUpdateNow: TButton;
UpdateNow1: TMenuItem;
imgWarn: TImage;
lblServer1: TLabel;
lblServer2: TLabel;
lblServer3: TLabel;
lblServer4: TLabel;
lblServer5: TLabel;
Label8: TLabel;
btnStop: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Exit1Click(Sender: TObject);
procedure Properties1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure btnSettingsClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnUpdateNowClick(Sender: TObject);
procedure UpdateNow1Click(Sender: TObject);
procedure btnStopClick(Sender: TObject);
private
StopOnTimer: boolean;
ServerLabels: array[0..MaxServers-1] of TLabel;
procedure WMEndSession(var Msg: TWmEndSession); message WM_ENDSESSION;
public
tt: TNetTimeServerBase;
ti: TTrayIcon;
procedure DoAppStartup;
procedure TimeStateChange(Sender: TObject);
function WarnAdjust(const Sender: TObject;
const ServerTime, StationTime: TDateTime): boolean;
procedure DoExitNow(Sender: TObject);
end;
var
frmMain: TfrmMain;
implementation
{$R *.DFM}
uses Warning, timewrap, iswinnt, mutex;
procedure TfrmMain.DoAppStartup;
var
frmOpt: TfrmOptions;
begin
ti := TTrayIcon.Create(Application);
ti.ToolTip := 'Network Time Synchronization';
ti.PopupMenu := mnuTray;
ti.Icon := imgBad.Picture.Icon;
ti.OnDblClick := Properties1Click;
ti.Active := true;
if GetExclusivity(ExNameServer) then
begin
lblSource.Caption := 'Server Type: In-Process Thread';
lblSource.Visible := true;
btnStop.Visible := false;
tt := TNetTimeServer.Create;
frmOpt := TfrmOptions.Create(Application);
frmOpt.ReadFromRegistry;
frmOpt.tt := tt;
if (frmOpt.edHostname.Text = '') then
frmOpt.ShowModal;
if (frmOpt.edHostname.Text = '') then
raise Exception.Create('Hostname not specified. Application cannot start.');
frmOpt.WriteToRunning(tt);
frmOpt.Release;
(tt as TNetTimeServer).Start;
end
else
begin
lblSource.Caption := 'Server Type: Out-Of-Process Service';
lblSource.Visible := true;
btnStop.Left := lblSource.Left + lblSource.Width + 10;
btnStop.Visible := true;
tt := TNetTimeProxy.Create;
end;
tt.OnWarnAdj := WarnAdjust;
tt.OnStateChange := TimeStateChange;
tt.OnExitNow := DoExitNow;
tt.ForceUpdate;
TimeStateChange(Self);
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Self.Hide;
end;
procedure TfrmMain.Exit1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmMain.Properties1Click(Sender: TObject);
begin
Self.Show;
end;
procedure TfrmMain.BitBtn1Click(Sender: TObject);
begin
Self.Hide;
end;
procedure TfrmMain.About1Click(Sender: TObject);
var
fA: TfrmAbout;
begin
fA := TfrmAbout.Create(Application);
fA.ShowModal;
fA.Release;
end;
procedure TfrmMain.btnSettingsClick(Sender: TObject);
var
fO: TfrmOptions;
begin
fO := TfrmOptions.Create(Application);
fO.tt := tt;
fO.ShowModal;
fO.Release;
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
Timer1.Enabled := true;
TimeStateChange(Sender);
end;
procedure TfrmMain.TimeStateChange(Sender: TObject);
var
tip: string;
i: integer;
AllGood: boolean;
begin
try
tip := 'Network Time Synchronization';
if tt.LastUpdateTime = 0 then
lblLastSync.Caption := 'No synchronization yet'
else
begin
lblLastSync.Caption := datetimetostr(tt.LastUpdateTime);
tip := tip + #13#10 + 'Last Sync: '+datetimetostr(tt.LastUpdateTime);
end;
if (tt.Status.Synchronized) then
begin
lblGoodness.Caption := 'Time is synchronized.';
AllGood := true;
for i := 0 to MaxServers-1 do
if not (tt.Status.ss[i] in [ssGood, ssUnconfigured]) then
AllGood := false;
if AllGood then
ti.Icon := imgGood.Picture.Icon
else
ti.Icon := imgWarn.Picture.Icon;
end
else
begin
lblGoodness.Caption := 'CLOCK SYNC LOST!';
tip := tip + #13#10 + lblGoodness.Caption;
ti.Icon := imgBad.Picture.Icon;
end;
for i := 0 to MaxServers-1 do
begin
if tt.Status.ss[i] = ssGood then
ServerLabels[i].Caption := 'Good'
else if tt.Status.ss[i] = ssFailed then
ServerLabels[i].Caption := 'Failed'
else if tt.Status.ss[i] = ssWrong then
ServerLabels[i].Caption := 'Wrong'
else
ServerLabels[i].Caption := '';
if ServerLabels[i].Caption <> '' then
ServerLabels[i].Caption := tt.Config.Servers[i].Hostname + ': ' +
ServerLabels[i].Caption;
end;
ti.ToolTip := tip;
if IsWindowsNT then
SetProcessWorkingSetSize(GetCurrentProcess,$ffffffff,$ffffffff);
except
end;
end;
function TfrmMain.WarnAdjust(const Sender: TObject;
const ServerTime, StationTime: TDateTime): boolean;
var
fW: TfrmWarning;
begin
fW := TfrmWarning.Create(Application);
fW.lblServerTime.Caption := datetimetostr(ServerTime);
fW.lblStationTime.Caption := datetimetostr(StationTime);
fW.ShowModal;
result := not fW.rbnShutdown.Checked;
fw.Free;
end;
procedure TfrmMain.DoExitNow(Sender: TObject);
begin
StopOnTimer := true;
Timer1.Interval := 50;
Timer1.Enabled := true;
end;
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
if StopOnTimer then
begin
Timer1.Enabled := false;
if tt is TNetTimeServer then
(tt as TNetTimeServer).Stop;
tt.Free;
ti.Free;
Application.Terminate;
end
else
lblTime.Caption := datetimetostr(Now);
end;
procedure TfrmMain.FormHide(Sender: TObject);
begin
Timer1.Enabled := false;
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
Self.Hide;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
ServerLabels[0] := lblServer1;
ServerLabels[1] := lblServer2;
ServerLabels[2] := lblServer3;
ServerLabels[3] := lblServer4;
ServerLabels[4] := lblServer5;
StopOnTimer := false;
end;
procedure TfrmMain.btnUpdateNowClick(Sender: TObject);
begin
Screen.Cursor := crHourglass;
try
if not tt.UpdateNow then
ShowMessage('Error: Could not update.');
finally
Screen.Cursor := crDefault;
end;
end;
procedure TfrmMain.UpdateNow1Click(Sender: TObject);
begin
if tt.UpdateNow then
ShowMessage('Update successful. The time is now '+DateTimeToStr(Now))
else
ShowMessage('Error: Could not update.');
end;
procedure TfrmMain.WMEndSession(var Msg: TWmEndSession);
begin
Application.Terminate;
end;
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
if MessageDlg('This shut down the currently running service and exit '+
'NetTime. Are you sure you want to do this?', mtInformation,
[mbYes,mbNo], 0) = mrYes then
tt.KillEverything;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -