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.   application.ProcessMessages;
  57.   for i := 0 to 1000 do
  58.     Connected[i]:= false;
  59. end;
  60. procedure TForm1.spePeriodChange(Sender: TObject);
  61. var
  62.   i: integer;
  63. begin
  64.   for i := 0 to clbDevices.Items.Count-1 do
  65.     (clbDevices.Items.Objects[i] as TLogReader).Period := spePeriod.Value;
  66. end;
  67. procedure TForm1.btnCountClick(Sender: TObject);
  68. begin
  69.   MessageDlg(format('There are %d transaction logs.',
  70.     [memLogs.Lines.Count]), mtInformation, [mbOK], 0);
  71. end;
  72. procedure TForm1.UpdateState(obj: tobject; Connect: Boolean);
  73. var
  74.   i: integer;
  75. begin
  76.   for i := 0 to clbDevices.Items.Count -1 do
  77.   begin
  78.     if clbDevices.Items.Objects[i]=obj then
  79.     begin
  80.       Connected[i] := Connect;
  81.       clbDevices.Invalidate;
  82.       break;
  83.     end;
  84.   end;
  85. end;
  86. procedure TForm1.btnAddDeviceClick(Sender: TObject);
  87. var
  88.   LogReader: TLogReader;
  89.   i: integer;
  90. begin
  91.   form3 := tform3.create(self);
  92.   try
  93.     if form3.ShowModal=mrok then
  94.     begin
  95.       if clbDevices.Items.IndexOf(form3.Edit1.Text+':'+form3.Edit2.Text)>=0 then
  96.         MessageDlg('Device in the list already.', mtWarning, [mbCancel], 0)
  97.       else
  98.       begin
  99.         if form3.rgrpConnect.itemindex=0 then
  100.           LogReader:= TLogReader.Create(strtoint(copy(form3.Edit1.Text, 4,2)),
  101.             strtoint(form3.Edit2.Text), strtoint(form3.Edit3.Text))
  102.         else
  103.           LogReader:= TLogReader.Create(form3.Edit1.Text,
  104.             strtoint(form3.Edit2.Text));
  105.         LogReader.Period := spePeriod.Value;
  106.         clbDevices.AddItem(form3.Edit1.Text+':'+form3.Edit2.Text, LogReader);
  107.         clbDevices.Checked[clbDevices.Items.Count-1]:=true;
  108.         LogReader.Active := true;
  109.       end;
  110.     end;
  111.   finally
  112.     form3.Free;
  113.   end;
  114. end;
  115. procedure TForm1.btnDelDeviceClick(Sender: TObject);
  116. var
  117.   LogReader: TLogReader;
  118. begin
  119.   if clbDevices.ItemIndex<0 then
  120.   begin
  121.     MessageDlg('Select a device please.', mtWarning, [mbCancel], 0);
  122.     exit;
  123.   end;
  124.    
  125.   LogReader := TLogReader(clbDevices.Items.Objects[clbDevices.ItemIndex]);
  126.   if LogReader=nil then exit;
  127.   LogReader.Terminate;
  128.   //Wait for the reader thread terminated.
  129.   WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  130.   LogReader.Free;
  131.   clbDevices.Items.Delete(clbDevices.ItemIndex);
  132. end;
  133. procedure TForm1.clbDevicesDrawItem(Control: TWinControl; Index: Integer;
  134.   Rect: TRect; State: TOwnerDrawState);
  135. var
  136. Offset: Integer;      { text offset width }
  137. begin
  138. with (Control as TCheckListBox).Canvas do  { draw on control canvas, not on the form }
  139. begin
  140.     if Connected[Index] then
  141.       Font.Color := clGreen
  142.     else
  143.       Font.Color := clRed;
  144.     FillRect(Rect);       { clear the rectangle }
  145.     Offset := 2;          { provide default offset }
  146.     TextOut(Rect.Left + Offset, Rect.Top, (Control as TCheckListBox).Items[Index])  { display the text }
  147. end;
  148. end;
  149. procedure TForm1.clbDevicesClickCheck(Sender: TObject);
  150. var
  151.   i: integer;
  152. begin
  153.   for i := 0 to clbDevices.Items.Count-1 do
  154.     (clbDevices.Items.Objects[i] as TLogReader).Active := clbDevices.Checked[i];
  155. end;
  156. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  157. var
  158.   LogReader: TLogReader;
  159.   i: integer;
  160. begin
  161.   for i := 0 to clbDevices.Items.Count-1 do
  162.   begin
  163.     LogReader := TLogReader(clbDevices.Items.Objects[i]);
  164.     if LogReader<>nil then LogReader.Terminate;
  165.   end;
  166. end;
  167. procedure TForm1.FormDestroy(Sender: TObject);
  168. var
  169.   LogReader: TLogReader;
  170. begin
  171.   while clbDevices.Items.Count>0 do
  172.   begin
  173.     LogReader := TLogReader(clbDevices.Items.Objects[0]);
  174.     //Wait for the reader thread terminated.
  175.     WaitForSingleObject(LogReader.Handle, (spePeriod.Value+1)*1000);
  176.     LogReader.Free;
  177.     clbDevices.Items.Delete(0);
  178.   end;
  179. end;
  180. end.