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

通讯编程

开发平台:

Visual Basic

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, Spin, StdCtrls, ExtCtrls, unit2, OleCtrls,  CheckLst;
  6. type
  7.   TForm1 = class(TForm)
  8.     Label1: TLabel;
  9.     Timer1: TTimer;
  10.     memLogs: TMemo;
  11.     Label2: TLabel;
  12.     Label3: TLabel;
  13.     spePeriod: TSpinEdit;
  14.     lblTimer: TLabel;
  15.     btnCount: TButton;
  16.     clbDevices: TCheckListBox;
  17.     btnAddDevice: TButton;
  18.     btnDelDevice: TButton;
  19.     procedure Timer1Timer(Sender: TObject);
  20.     procedure FormCreate(Sender: TObject);
  21.     procedure spePeriodChange(Sender: TObject);
  22.     procedure btnCountClick(Sender: TObject);
  23.     procedure btnAddDeviceClick(Sender: TObject);
  24.     procedure btnDelDeviceClick(Sender: TObject);
  25.     procedure clbDevicesDrawItem(Control: TWinControl; Index: Integer;
  26.       Rect: TRect; State: TOwnerDrawState);
  27.     procedure clbDevicesClickCheck(Sender: TObject);
  28.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  29.     procedure FormDestroy(Sender: TObject);
  30.   private
  31.     { Private declarations }
  32.     Connected: array[0..1000] of boolean;
  33.   public
  34.     { Public declarations }
  35.     procedure AddLogs(logs: tstrings);
  36.     procedure UpdateState(obj: tobject; Connect: Boolean);
  37.   end;
  38. var
  39.   Form1: TForm1;
  40. implementation
  41. uses unit3;
  42. {$R *.dfm}
  43. procedure TForm1.AddLogs(logs: tstrings);
  44. begin
  45.   memLogs.Lines.AddStrings(logs);
  46. end;
  47. procedure TForm1.Timer1Timer(Sender: TObject);
  48. begin
  49.   lblTimer.Caption := timetostr(now);
  50. end;
  51. procedure TForm1.FormCreate(Sender: TObject);
  52. var
  53.   i: integer;
  54. begin
  55.   memLogs.Lines.Clear;
  56.   for i := 0 to 1000 do
  57.     Connected[i]:= false;
  58. end;
  59. procedure TForm1.spePeriodChange(Sender: TObject);
  60. var
  61.   i: integer;
  62. begin
  63.   for i := 0 to clbDevices.Items.Count-1 do
  64.     (clbDevices.Items.Objects[i] as TLogReader).Period := spePeriod.Value;
  65. end;
  66. procedure TForm1.btnCountClick(Sender: TObject);
  67. begin
  68.   MessageDlg(format('There are %d transaction logs.',
  69.     [memLogs.Lines.Count]), mtInformation, [mbOK], 0);
  70. end;
  71. procedure TForm1.UpdateState(obj: tobject; Connect: Boolean);
  72. var
  73.   i: integer;
  74. begin
  75.   for i := 0 to clbDevices.Items.Count -1 do
  76.   begin
  77.     if clbDevices.Items.Objects[i]=obj then
  78.     begin
  79.       Connected[i] := Connect;
  80.       clbDevices.Invalidate;
  81.       break;
  82.     end;
  83.   end;
  84. end;
  85. procedure TForm1.btnAddDeviceClick(Sender: TObject);
  86. var
  87.   LogReader: TLogReader;
  88.   i: integer;
  89. begin
  90.   form3 := tform3.create(self);
  91.   try
  92.     if form3.ShowModal=mrok then
  93.     begin
  94.       if clbDevices.Items.IndexOf(form3.Edit1.Text+':'+form3.Edit2.Text)>=0 then
  95.         MessageDlg('Device in the list already.', mtWarning, [mbCancel], 0)
  96.       else
  97.       begin
  98.         if form3.rgrpConnect.itemindex=0 then
  99.           LogReader:= TLogReader.Create(strtoint(copy(form3.Edit1.Text, 4,2)),
  100.             strtoint(form3.Edit2.Text), strtoint(form3.Edit3.Text))
  101.         else
  102.           LogReader:= TLogReader.Create(form3.Edit1.Text,
  103.             strtoint(form3.Edit2.Text));
  104.         LogReader.Period := spePeriod.Value;
  105.         clbDevices.AddItem(form3.Edit1.Text+':'+form3.Edit2.Text, LogReader);
  106.         clbDevices.Checked[clbDevices.Items.Count-1]:=true;
  107.         LogReader.Active := true;
  108.       end;
  109.     end;
  110.   finally
  111.     form3.Free;
  112.   end;
  113. end;
  114. procedure TForm1.btnDelDeviceClick(Sender: TObject);
  115. var
  116.   LogReader: TLogReader;
  117. begin
  118.   if clbDevices.ItemIndex<0 then
  119.   begin
  120.     MessageDlg('Select a device please.', mtWarning, [mbCancel], 0);
  121.     exit;
  122.   end;
  123.    
  124.   LogReader := TLogReader(clbDevices.Items.Objects[clbDevices.ItemIndex]);
  125.   if LogReader=nil then exit;
  126.   LogReader.Terminate;
  127.   //Wait for the reader thread terminated.
  128.   WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  129.   LogReader.Free;
  130.   clbDevices.Items.Delete(clbDevices.ItemIndex);
  131. end;
  132. procedure TForm1.clbDevicesDrawItem(Control: TWinControl; Index: Integer;
  133.   Rect: TRect; State: TOwnerDrawState);
  134. var
  135. Offset: Integer;      { text offset width }
  136. begin
  137. with (Control as TCheckListBox).Canvas do  { draw on control canvas, not on the form }
  138. begin
  139.     if Connected[Index] then
  140.       Font.Color := clGreen
  141.     else
  142.       Font.Color := clRed;
  143.     FillRect(Rect);       { clear the rectangle }
  144.     Offset := 2;          { provide default offset }
  145.     TextOut(Rect.Left + Offset, Rect.Top, (Control as TCheckListBox).Items[Index])  { display the text }
  146. end;
  147. end;
  148. procedure TForm1.clbDevicesClickCheck(Sender: TObject);
  149. var
  150.   i: integer;
  151. begin
  152.   for i := 0 to clbDevices.Items.Count-1 do
  153.     (clbDevices.Items.Objects[i] as TLogReader).Active := clbDevices.Checked[i];
  154. end;
  155. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  156. var
  157.   LogReader: TLogReader;
  158.   i: integer;
  159. begin
  160.   for i := 0 to clbDevices.Items.Count-1 do
  161.   begin
  162.     LogReader := TLogReader(clbDevices.Items.Objects[i]);
  163.     if LogReader<>nil then LogReader.Terminate;
  164.   end;
  165. end;
  166. procedure TForm1.FormDestroy(Sender: TObject);
  167. var
  168.   LogReader: TLogReader;
  169. begin
  170.   while clbDevices.Items.Count>0 do
  171.   begin
  172.     LogReader := TLogReader(clbDevices.Items.Objects[0]);
  173.     //Wait for the reader thread terminated.
  174.     WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  175.     LogReader.Free;
  176.     clbDevices.Items.Delete(0);
  177.   end;
  178. end;
  179. end.