?? options.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 Options;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, configobj, NetTimeCommon;
type
TfrmOptions = class;
TfrmOptions = class(TForm)
Label1: TLabel;
edHostname: TEdit;
Label2: TLabel;
edTimeFreq: TEdit;
Label3: TLabel;
edLostSync: TEdit;
Label4: TLabel;
edWarnAdj: TEdit;
btnFindServer: TButton;
Label5: TLabel;
edRetry: TEdit;
cbxProtocol: TComboBox;
CbxNeverWarn: TCheckBox;
btnOK: TButton;
btnCancel: TButton;
cbxServer: TCheckBox;
Label7: TLabel;
edPort: TEdit;
Label8: TLabel;
Label9: TLabel;
edHostname1: TEdit;
btnFindServer1: TButton;
cbxProtocol1: TComboBox;
edPort1: TEdit;
edHostname2: TEdit;
btnFindServer2: TButton;
cbxProtocol2: TComboBox;
edPort2: TEdit;
edHostname3: TEdit;
btnFindServer3: TButton;
cbxProtocol3: TComboBox;
edPort3: TEdit;
edHostname4: TEdit;
btnFindServer4: TButton;
cbxProtocol4: TComboBox;
edPort4: TEdit;
btnHelp: TButton;
btnAutoConfig: TButton;
cbxShowInTray: TCheckBox;
cbxServiceAutoStart: TCheckBox;
procedure FormShow(Sender: TObject);
procedure btnFindServerClick(Sender: TObject);
procedure CbxNeverWarnClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnHelpClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure cbxProtocolChange(Sender: TObject);
procedure btnAutoConfigClick(Sender: TObject);
private
co: TConfigObj;
Hostnames: array[0..MaxServers-1] of TEdit;
Protocols: array[0..MaxServers-1] of TComboBox;
Ports: array[0..MaxServers-1] of TEdit;
FindButtons: array[0..MaxServers-1] of TButton;
public
tt: TNetTimeServerBase;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadFromRegistry;
procedure ReadFromRunning(tt: TNetTimeServerBase);
procedure ReadFromObject;
procedure WriteToRegistry;
procedure WriteToRunning(tt: TNetTimeServerBase);
procedure WriteToObject;
end;
implementation
{$R *.DFM}
uses registry, findhost, timewrap, autoconfig;
constructor TfrmOptions.Create(AOwner: TComponent);
begin
inherited;
co := TConfigObj.Create;
ReadFromObject;
end;
destructor TfrmOptions.Destroy;
begin
co.Free;
inherited;
end;
procedure TfrmOptions.FormShow(Sender: TObject);
begin
if Assigned(tt) then
ReadFromRunning(tt);
end;
procedure TfrmOptions.btnFindServerClick(Sender: TObject);
var
fFH: TfrmFindServer;
s: string;
p: integer;
i: integer;
n: integer;
begin
n := -1;
for i := 0 to MaxServers-1 do
if Sender = FindButtons[i] then
n := i;
if n = -1 then
exit;
fFH := TfrmFindServer.Create(nil);
if fFH.ShowModal = mrOK then
begin
if (fFH.lstSuccess.ItemIndex >= 0) then
begin
s := fFH.lstSuccess.Items[fFH.lstSuccess.ItemIndex];
p := pos(' ',s);
if p > 0 then
s := copy(s,1,p-1);
Hostnames[n].Text := s;
Protocols[n].ItemIndex := 0;
Ports[n].Text := inttostr(NTP_Port);
end;
end;
fFH.Release;
end;
procedure TfrmOptions.ReadFromRegistry;
begin
co.ReadFromRegistry;
ReadFromObject;
end;
procedure TfrmOptions.ReadFromRunning(tt: TNetTimeServerBase);
begin
co.ReadFromRegistry;
co.ReadFromRunning(tt);
ReadFromObject;
end;
procedure TfrmOptions.ReadFromObject;
var
i: integer;
procedure ReadServer(const n: integer);
begin
Hostnames[n].Text := co.Servers[n].Hostname;
Protocols[n].ItemIndex := integer(co.Servers[n].Protocol);
Ports[n].Text := inttostr(co.Servers[n].Port);
end;
begin
for i := 0 to co.ServerCount-1 do
ReadServer(i);
edTimeFreq.Text := inttostr(co.SyncFreq);
edLostSync.Text := inttostr(co.LostSync);
edWarnAdj.Text := inttostr(co.WarnAdj);
cbxNeverWarn.Checked := (edWarnAdj.Text = '0');
edWarnAdj.Enabled := not cbxNeverWarn.Checked;
edRetry.Text := inttostr(co.Retry);
cbxServer.Checked := co.Server;
cbxShowInTray.Checked := co.LoadOnLogin;
cbxServiceAutoStart.Checked := co.ServiceOnBoot;
end;
procedure TfrmOptions.WriteToRegistry;
begin
WriteToObject;
co.WriteToRegistry;
end;
procedure TfrmOptions.WriteToRunning(tt: TNetTimeServerBase);
begin
WriteToObject;
co.WriteToRunning(tt);
end;
procedure TfrmOptions.WriteToObject;
var
i: integer;
procedure WriteServer(const n: integer);
var
Srv: TServerDef;
begin
if Hostnames[n].Text = '' then
exit;
Srv.Hostname := Hostnames[n].Text;
Srv.Protocol := TTimeProto(Protocols[n].ItemIndex);
Srv.Port := strtoint(Ports[n].Text);
co.AddServer(Srv);
end;
begin
co.ClearServerList;
for i := 0 to MaxServers-1 do
WriteServer(i);
co.SyncFreq := strtoint(edTimeFreq.Text);
co.LostSync := strtoint(edLostSync.Text);
co.WarnAdj := strtoint(edWarnAdj.Text);
co.Retry := strtoint(edRetry.Text);
co.Server := cbxServer.Checked;
co.LoadOnLogin := cbxShowInTray.Checked;
co.ServiceOnBoot := cbxServiceAutoStart.Checked;
end;
procedure TfrmOptions.CbxNeverWarnClick(Sender: TObject);
begin
if CbxNeverWarn.Checked then
begin
EdWarnAdj.Text := '0';
EdWarnAdj.Enabled := false;
end
else
begin
if EdWarnAdj.Text = '0' then
EdWarnAdj.Text := inttostr(DefaultRetry);
EdWarnAdj.Enabled := true;
end;
end;
procedure TfrmOptions.btnOKClick(Sender: TObject);
var
Problems: string;
begin
WriteToObject;
Problems := '';
if (co.SyncFreq < 600) or (co.Retry < 600) then
Problems := Problems + '* Update intervals lower than ten minutes are strongly '+
'discouraged when synchronizing to public servers, in order to avoid excessive '+
'bandwidth costs for the server operators.' + #13#10 + #13#10;
if co.Retry < co.SyncFreq then
Problems := Problems + '* The retry interval is the time to wait when a server is '+
'down. This should be higher than the normal sync interval, to avoid '+
'creating heavy traffic to a server that can''t handle it.' + #13#10 + #13#10;
if co.LostSync < (co.SyncFreq + (co.Retry * 2)) then
Problems := Problems + '* The Max Free Run interval is the maximum amount of time '+
'that can elapse before we consider the local clock to be out of sync. It is '+
'recommended that this be long enough to allow at least two retries.' + #13#10 + #13#10;
if Problems <> '' then
if MessageDlg('The following problems were found with your configuration:' + #13#10 + #13#10 +
Problems + 'Do you want to correct these problems automatically?',
mtWarning, [mbYes,mbNo], 0) = mrYes then
begin
if co.SyncFreq < 600 then
co.SyncFreq := 600;
if co.Retry < 600 then
co.Retry := 600;
if co.Retry < co.SyncFreq then
co.Retry := co.SyncFreq;
if co.LostSync < (co.SyncFreq + (co.Retry * 2)) then
co.LostSync := (co.SyncFreq + (co.Retry * 2));
ReadFromObject;
end;
WriteToRegistry;
if Assigned(tt) then
WriteToRunning(tt);
end;
procedure TfrmOptions.btnHelpClick(Sender: TObject);
begin
Application.HelpCommand(HELP_CONTEXT,Self.HelpContext);
end;
procedure TfrmOptions.FormCreate(Sender: TObject);
begin
Hostnames[0] := edHostname;
Hostnames[1] := edHostname1;
Hostnames[2] := edHostname2;
Hostnames[3] := edHostname3;
Hostnames[4] := edHostname4;
Protocols[0] := cbxProtocol;
Protocols[1] := cbxProtocol1;
Protocols[2] := cbxProtocol2;
Protocols[3] := cbxProtocol3;
Protocols[4] := cbxProtocol4;
Ports[0] := edPort;
Ports[1] := edPort1;
Ports[2] := edPort2;
Ports[3] := edPort3;
Ports[4] := edPort4;
FindButtons[0] := btnFindServer;
FindButtons[1] := btnFindServer1;
FindButtons[2] := btnFindServer2;
FindButtons[3] := btnFindServer3;
FindButtons[4] := btnFindServer4;
end;
procedure TfrmOptions.cbxProtocolChange(Sender: TObject);
var
i: integer;
begin
for i := 0 to MaxServers-1 do
if Sender = Protocols[i] then
Ports[i].Text := inttostr(
DefaultPortForProtocol(TTimeProto(Protocols[i].ItemIndex)));
end;
procedure TfrmOptions.btnAutoConfigClick(Sender: TObject);
var
fAC: TfrmAutoConfigure;
function UpToComma(const s: string): string;
var
p: integer;
begin
p := pos(',',s);
if p = 0 then
result := s
else
result := copy(s,1,p-1);
end;
procedure SetItUp(const idx: integer; const hn: string);
begin
if hn <> '' then
begin
Hostnames[idx].Text := hn;
Protocols[idx].ItemIndex := 0;
Ports[idx].Text := inttostr(NTP_Port);
end
else
begin
Hostnames[idx].Text := '';
Protocols[idx].ItemIndex := -1;
Ports[idx].Text := '';
end;
end;
begin
fAC := TfrmAutoConfigure.Create(Application);
try
if fAC.ShowModal = mrOK then
begin
SetItUp(0,UpToComma(fAC.lblServer1.Caption));
SetItUp(1,UpToComma(fAC.lblServer2.Caption));
SetItUp(2,UpToComma(fAC.lblServer3.Caption));
SetItUp(3,UpToComma(fAC.lblServer4.Caption));
SetItUp(4,UpToComma(fAC.lblServer5.Caption));
end;
finally
fAC.Free;
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -