Unit1.~pas
上传用户:lzd18710
上传日期:2009-11-26
资源大小:3595k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual Basic

  1. unit Unit1;
  2. interface
  3. {$define onlysynctime}
  4. uses
  5.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6.   Dialogs, Spin, StdCtrls, ExtCtrls, unit2, OleCtrls, zkemkeeper_TLB,
  7.   CheckLst, iniFiles,strutils;
  8. const CfgFn='DevList.cfg';
  9. type
  10.   TForm1 = class(TForm)
  11.     Label1: TLabel;
  12.     Timer1: TTimer;
  13.     memLogs: TMemo;
  14.     Label2: TLabel;
  15.     Label3: TLabel;
  16.     spePeriod: TSpinEdit;
  17.     lblTimer: TLabel;
  18.     btnCount: TButton;
  19.     clbDevices: TCheckListBox;
  20.     btnAddDevice: TButton;
  21.     btnDelDevice: TButton;
  22.     CheckBox1: TCheckBox;
  23.     procedure Timer1Timer(Sender: TObject);
  24.     procedure FormCreate(Sender: TObject);
  25.     procedure spePeriodChange(Sender: TObject);
  26.     procedure btnCountClick(Sender: TObject);
  27.     procedure btnAddDeviceClick(Sender: TObject);
  28.     procedure btnDelDeviceClick(Sender: TObject);
  29.     procedure clbDevicesDrawItem(Control: TWinControl; Index: Integer;
  30.       Rect: TRect; State: TOwnerDrawState);
  31.     procedure clbDevicesClickCheck(Sender: TObject);
  32.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  33.     procedure FormDestroy(Sender: TObject);
  34.     procedure CheckBox1Click(Sender: TObject);
  35.   private
  36.     { Private declarations }
  37.     Connected: array[0..1000] of boolean;
  38.     cfgFile:TiniFile;
  39.     cfn:string;
  40.     function SaveCfg():boolean;
  41.   public
  42.     { Public declarations }
  43.     procedure AddLogs(logs: tstrings);
  44.     procedure UpdateState(obj: tobject; Connect: Boolean);
  45.   end;
  46.   
  47. var
  48.   Form1: TForm1;
  49. implementation
  50. uses unit3;
  51. {$R *.dfm}
  52. procedure TForm1.AddLogs(logs: tstrings);
  53. begin
  54.   memLogs.Lines.AddStrings(logs);
  55. end;
  56. procedure TForm1.Timer1Timer(Sender: TObject);
  57. begin
  58.   lblTimer.Caption := timetostr(now);
  59. end;
  60. procedure TForm1.FormCreate(Sender: TObject);
  61. var
  62.   LogReader: TLogReader;
  63.   i: integer;
  64.   SectionList:TStrings;
  65.   s,sTemp,par1,par2,par3:string;
  66. begin
  67.   {$ifdef onlysynctime}
  68.   Form1.Caption := 'Sync time for BioClock';
  69.   {$endif}
  70.   memLogs.Lines.Clear;
  71.   for i := 0 to 1000 do
  72.     Connected[i]:= false;
  73.   cfn := ExtractFilePath(Application.ExeName) + CfgFn;
  74.   if FileExists(cfn) then
  75.   begin
  76.     CfgFile:= tinifile.Create(cfn);
  77.   end;
  78.   CheckBox1.Checked := False;
  79.   if cfgFile.ReadString('Options','SyncOnStart','') = 'T' then
  80.     CheckBox1.Checked := true;
  81.   SectionList := TStringList.Create;
  82.   CfgFile.ReadSection('DevList',SectionList);
  83.   with clbDevices do
  84.   begin
  85.     for i:= 0 to SectionList.Count-1 do
  86.     begin
  87.       s:=CfgFile.ReadString('DevList',SectionList.Strings[i],'');
  88.       if s<> '' then
  89.       begin
  90.         sTemp := s;
  91.         par1 := leftstr(sTemp,pos(':',s)-1);
  92.         sTemp := rightstr(sTemp,length(sTemp)-length(par1)-1);
  93.         if pos(':',sTemp)>0 then
  94.         begin
  95.           par2 := leftstr(sTemp,pos(':',sTemp)-1);
  96.         end
  97.         else
  98.           Par2 := sTemp;
  99.         sTemp := rightstr(sTemp,length(sTemp)-length(par2)-1);
  100.         par3 := sTemp;
  101.       end;
  102.       if (par1='') or (par2='') then exit;
  103.       if pos('COM',uppercase(s))=0 then
  104.       begin
  105.         LogReader:= TLogReader.Create(par1,strtoint(par2) );
  106.       end
  107.       else
  108.         LogReader:= TLogReader.Create(strtoint(copy(par1, 4,2)),
  109.         strtoint(par2), strtoint(par3));
  110.       LogReader.Period := spePeriod.Value;
  111.       clbDevices.AddItem(s, LogReader);
  112.       if CheckBox1.Checked then
  113.       begin
  114.         clbDevices.Checked[clbDevices.Items.Count-1]:=true;
  115.         LogReader.Active := true;
  116.       end;
  117.     end;
  118.   end;
  119. end;
  120. procedure TForm1.spePeriodChange(Sender: TObject);
  121. var
  122.   i: integer;
  123. begin
  124.   for i := 0 to clbDevices.Items.Count-1 do
  125.     (clbDevices.Items.Objects[i] as TLogReader).Period := spePeriod.Value;
  126. end;
  127. procedure TForm1.btnCountClick(Sender: TObject);
  128. begin
  129.   MessageDlg(format('There are %d transaction logs.',
  130.     [memLogs.Lines.Count]), mtInformation, [mbOK], 0);
  131. end;
  132. procedure TForm1.UpdateState(obj: tobject; Connect: Boolean);
  133. var
  134.   i: integer;
  135. begin
  136.   for i := 0 to clbDevices.Items.Count -1 do
  137.   begin
  138.     //clbDevices.item
  139.     if clbDevices.Items.Objects[i]=obj then
  140.     begin
  141.       Connected[i] := Connect;
  142.       clbDevices.Invalidate;
  143.       {$ifdef onlysynctime}
  144.       if obj=nil then exit;
  145.       if (obj as TLogReader).Active then
  146.         (obj as TLogReader).terminate;
  147.       //Wait for the reader thread terminated.
  148.       //WaitForSingleObject((obj as TLogReader).Handle, (spePeriod.Value+1)*1000);
  149.       //(obj as TLogReader).Free;
  150.       {$endif}
  151.       break;
  152.     end;
  153.   end;
  154. end;
  155. procedure TForm1.btnAddDeviceClick(Sender: TObject);
  156. var
  157.   LogReader: TLogReader;
  158.   i: integer;
  159.   s:string;
  160. begin
  161.   form3 := tform3.create(self);
  162.   try
  163.     if form3.ShowModal=mrok then
  164.     begin
  165.       if clbDevices.Items.IndexOf(form3.Edit1.Text+':'+form3.Edit2.Text)>=0 then
  166.         MessageDlg('Device in the list already.', mtWarning, [mbCancel], 0)
  167.       else
  168.       begin
  169.         if form3.rgrpConnect.itemindex=0 then
  170.         begin
  171.           LogReader:= TLogReader.Create(strtoint(copy(form3.Edit1.Text, 4,2)),
  172.             strtoint(form3.Edit2.Text), strtoint(form3.Edit3.Text));
  173.         end
  174.         else
  175.           LogReader:= TLogReader.Create(form3.Edit1.Text,
  176.             strtoint(form3.Edit2.Text));
  177.         s :=  form3.Edit1.Text+':'+form3.Edit2.Text;
  178.         if form3.rgrpConnect.itemindex=0 then
  179.           s:= s+ ':' + form3.Edit3.Text;
  180.         //asgDevList.row
  181.         LogReader.Period := spePeriod.Value;
  182.         clbDevices.AddItem(s, LogReader);
  183.         clbDevices.Checked[clbDevices.Items.Count-1]:=true;
  184.         LogReader.Active := true;
  185.         SaveCfg;
  186.       end;
  187.     end;
  188.   finally
  189.     form3.Free;
  190.   end;
  191. end;
  192. procedure TForm1.btnDelDeviceClick(Sender: TObject);
  193. var
  194.   LogReader: TLogReader;
  195. begin
  196.   if clbDevices.ItemIndex<0 then
  197.   begin
  198.     MessageDlg('Select a device please.', mtWarning, [mbCancel], 0);
  199.     exit;
  200.   end;
  201.    
  202.   LogReader := TLogReader(clbDevices.Items.Objects[clbDevices.ItemIndex]);
  203.   if LogReader=nil then exit;
  204.   LogReader.Terminate;
  205.   //Wait for the reader thread terminated.
  206.   WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  207.   LogReader.Free;
  208.   clbDevices.Items.Delete(clbDevices.ItemIndex);
  209.   SaveCfg;
  210. end;
  211. procedure TForm1.clbDevicesDrawItem(Control: TWinControl; Index: Integer;
  212.   Rect: TRect; State: TOwnerDrawState);
  213. var
  214. Offset: Integer;      { text offset width }
  215. begin
  216. with (Control as TCheckListBox).Canvas do  { draw on control canvas, not on the form }
  217. begin
  218.     if Connected[Index] then
  219.       Font.Color := clGreen
  220.     else
  221.       Font.Color := clRed;
  222.     FillRect(Rect);       { clear the rectangle }
  223.     Offset := 2;          { provide default offset }
  224.     TextOut(Rect.Left + Offset, Rect.Top, (Control as TCheckListBox).Items[Index])  { display the text }
  225. end;
  226. end;
  227. procedure TForm1.clbDevicesClickCheck(Sender: TObject);
  228. var
  229.   i: integer;
  230. begin
  231.   for i := 0 to clbDevices.Items.Count-1 do
  232.     (clbDevices.Items.Objects[i] as TLogReader).Active := clbDevices.Checked[i];
  233. end;
  234. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  235. var
  236.   LogReader: TLogReader;
  237.   i: integer;
  238. begin
  239.   for i := 0 to clbDevices.Items.Count-1 do
  240.   begin
  241.     LogReader := TLogReader(clbDevices.Items.Objects[i]);
  242.     if LogReader<>nil then LogReader.Terminate;
  243.   end;
  244.   CfgFile.Free;
  245. end;
  246. procedure TForm1.FormDestroy(Sender: TObject);
  247. var
  248.   LogReader: TLogReader;
  249. begin
  250.   while clbDevices.Items.Count>0 do
  251.   begin
  252.     LogReader := TLogReader(clbDevices.Items.Objects[0]);
  253.     //Wait for the reader thread terminated.
  254.     WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  255.     LogReader.Free;
  256.     clbDevices.Items.Delete(0);
  257.   end;
  258. end;
  259. function TForm1.SaveCfg: boolean;
  260. var i:integer;
  261. begin
  262.   CfgFile.EraseSection('DevList');
  263.   for i:= 0 to clbDevices.Items.Count -1 do
  264.   begin
  265.     CfgFile.WriteString('DevList','Dev' + inttostr(i),clbDevices.Items.Strings[i]);
  266.   end;
  267. end;
  268. procedure TForm1.CheckBox1Click(Sender: TObject);
  269. begin
  270.   if CheckBox1.Checked then
  271.     cfgFile.WriteString('Options','SyncOnStart','T')
  272.   else
  273.     cfgFile.WriteString('Options','SyncOnStart','F')
  274. end;
  275. end.