uMain.pas
上传用户:fuyouda
上传日期:2015-08-19
资源大小:6876k
文件大小:10k
源码类别:

家庭/个人应用

开发平台:

Visual C++

  1. unit uMain;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls, ActiveX, StdCtrls;
  6. type
  7.   PItem=^TItem;
  8.   TItem=record
  9.     Handle: DWORD;
  10.     Name: string;
  11.   end;
  12.   
  13.   TForm1 = class(TForm)
  14.     MainMenu1: TMainMenu;
  15.     lvItems: TListView;
  16.     mnOperate: TMenuItem;
  17.     mnConnect: TMenuItem;
  18.     mnDisconnect: TMenuItem;
  19.     mnExit: TMenuItem;
  20.     N6: TMenuItem;
  21.     mnHelp: TMenuItem;
  22.     StatusBar1: TStatusBar;
  23.     N3: TMenuItem;
  24.     mnGroupStatus: TMenuItem;
  25.     mnItemAdd: TMenuItem;
  26.     mnItemRemove: TMenuItem;
  27.     N11: TMenuItem;
  28.     mnItemWrite: TMenuItem;
  29.     mnItemRead: TMenuItem;
  30.     mnServerStatus: TMenuItem;
  31.     mnItemRefresh: TMenuItem;
  32.     mnAbout: TMenuItem;
  33.     mnItemProperties: TMenuItem;
  34.     procedure mnConnectClick(Sender: TObject);
  35.     procedure FormCreate(Sender: TObject);
  36.     procedure FormDestroy(Sender: TObject);
  37.     procedure mnDisconnectClick(Sender: TObject);
  38.     procedure mnExitClick(Sender: TObject);
  39.     procedure mnItemAddClick(Sender: TObject);
  40.     procedure mnItemRemoveClick(Sender: TObject);
  41.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  42.     procedure mnItemWriteClick(Sender: TObject);
  43.     procedure lvItemsClick(Sender: TObject);
  44.     procedure mnItemReadClick(Sender: TObject);
  45.     procedure mnGroupStatusClick(Sender: TObject);
  46.     procedure mnServerStatusClick(Sender: TObject);
  47.     procedure mnItemPropertiesClick(Sender: TObject);
  48.   private
  49.     FServer, FGroup: THandle;
  50.     FGroupName: string;
  51.     procedure Clear;
  52.   public
  53.     procedure RefreshData(ItemHandle: DWORD; pVar: Variant; timestamp: TFILETIME; quality: WORD);
  54.     procedure AddItem(ItemName: string);
  55.     function GetItem(Handle: THandle): TListItem;
  56.     procedure ShutDownRequest;
  57.   end;
  58. var
  59.   Form1: TForm1;
  60. implementation
  61. uses DACLTSDK, uServerBrowser, uGroupStatus, uItemBrowser, uServerStatus, uItemStatus;
  62. {$R *.dfm}
  63. function FileTimeToString(AFileTime: TFileTime): string;
  64. var
  65.   FileTime: TFileTime;
  66.   SystemTime: TSystemTime;
  67.   D: TDatetime;
  68.   Year, Month, Day, Hour, Min, Sec, MSec: Word;
  69. begin
  70.   FileTimeToLocalFileTime(AFileTime, FileTime);
  71.   FileTimeToSystemTime(FileTime, SystemTime);
  72.   D := SystemTimeToDateTime(SystemTime);
  73.   DecodeDate(D, Year, Month, Day);
  74.   DecodeTime(D, Hour, Min, Sec, MSec);
  75.   Result := Format('%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d', [Year, Month, Day, Hour,
  76.     Min, Sec, MSec]);
  77. end;
  78. procedure ShutDownProc(ServerHandle: DWORD); stdcall;
  79. begin
  80.   Form1.ShutDownRequest;
  81. end;
  82. procedure DataChangeProc(hServer,GroupHandle,ItemHandle:DWORD;pVar:Variant; timestamp:TFILETIME; quality:WORD); stdcall;
  83. begin
  84.   Form1.RefreshData(ItemHandle, pVar, timestamp, quality);
  85. end;
  86. { TForm1 }
  87. procedure TForm1.mnConnectClick(Sender: TObject);
  88. var
  89.   Browser: TServerBrowser;
  90. begin
  91.   Browser:= TServerBrowser.Create(nil);
  92.   try
  93.     if Browser.ShowModal = mrOK then
  94.     begin
  95.       FServer:= ASDAC_Connect(PChar(Browser.Selected.Node),PChar(Browser.Selected.ClassID),Browser.Selected.Version);
  96.       if FServer>0 then
  97.       begin
  98.         ASDAC_SetDataChangeProc(FServer, @DataChangeProc);
  99.         ASDAC_SetShutdownProc(FServer, @ShutdownProc);
  100.         mnConnect.Enabled:= False;
  101.         mnDisconnect.Enabled:= true;
  102.         mnServerStatus.Enabled:= true;
  103.         FGroup:= ASDAC_AddGroup(FServer, PChar(FGroupName), true, 1000,0,0,0);
  104.         if FGroup>0 then
  105.         begin
  106.           mnGroupStatus.Enabled:= true;
  107.           mnItemAdd.Enabled:= true;
  108.         end;
  109.       end;
  110.     end;
  111.   finally
  112.     Browser.Free;
  113.   end;
  114. end;
  115. procedure TForm1.FormCreate(Sender: TObject);
  116. begin
  117.   FGroupName:= 'GROUP';
  118.   ASDAC_Init;
  119. end;
  120. procedure TForm1.FormDestroy(Sender: TObject);
  121. begin
  122.   Clear;
  123.   ASDAC_Uninit;
  124. end;
  125. procedure TForm1.mnDisconnectClick(Sender: TObject);
  126. begin
  127.   Clear;
  128.   if FServer>0 then
  129.   begin
  130.     if ASDAC_Disconnect(FServer) then
  131.     begin
  132.       FServer:= 0;
  133.       FGroup:= 0;
  134.       FGroupName:= 'GROUP';
  135.       mnConnect.Enabled:= true;
  136.       mnDisconnect.Enabled:= False;
  137.       mnServerStatus.Enabled:= False;
  138.       mnGroupStatus.Enabled:= False;
  139.       mnItemAdd.Enabled:= False;
  140.       mnItemRemove.Enabled:= False;
  141.       mnItemRead.Enabled:= False;
  142.       mnItemWrite.Enabled:= False;
  143.       mnItemRefresh.Enabled:= False;
  144.     end;
  145.   end;
  146. end;
  147. procedure TForm1.RefreshData(ItemHandle:DWORD;pVar:Variant;
  148.     timestamp:TFILETIME; quality:WORD);
  149. var
  150.   lsItem: TListItem;
  151. begin
  152.   lsItem:= GetItem(ItemHandle);
  153.   if Assigned(lsItem) then
  154.   begin
  155.     lsItem.SubItems[0]:= pVar;
  156.     lsItem.SubItems[1]:= Format('%d',[quality]);
  157.     lsItem.SubItems[2]:= FileTimeToString(timestamp);
  158.   end;
  159. end;
  160. procedure TForm1.mnExitClick(Sender: TObject);
  161. begin
  162.   Close;
  163. end;
  164. procedure TForm1.mnItemAddClick(Sender: TObject);
  165. var
  166.   Browser: TItemBrowser;
  167. begin
  168.   Browser:= TItemBrowser.Create(nil);
  169.   Browser.Server:= FServer;
  170.   Browser.OnAddItem:= AddItem;
  171.   Browser.ShowModal;
  172.   Browser.Free;
  173. end;
  174. procedure TForm1.AddItem(ItemName: string);
  175. var
  176.   item: PItem;
  177.   lsItem: TListItem;
  178.   h: THandle;
  179. begin
  180.   h:= ASDAC_AddItem(FServer, FGroup, PChar(ItemName));
  181.   if h>0 then
  182.   begin
  183.     new(item);
  184.     try
  185.       item^.Handle:= h;
  186.       item.Name:= ItemName;
  187.       lsItem:= lvItems.Items.Add;
  188.       lsItem.Caption:= ItemName;
  189.       lsItem.SubItems.Add('Bad');
  190.       lsItem.SubItems.Add('');
  191.       lsItem.SubItems.Add('');
  192.       lsItem.Data:= Item;
  193.     except
  194.       on Exception do ;
  195.     end;
  196.   end;
  197. end;
  198. procedure TForm1.mnItemRemoveClick(Sender: TObject);
  199. var
  200.   lvItem: TListItem;
  201. begin
  202.   lvItem:= lvItems.Selected;
  203.   if Assigned(lvItem) then
  204.   begin
  205.     ASDAC_RemoveItem(FServer, FGroup, PItem(lvItem.Data).Handle);
  206.     Dispose(lvItems.Selected.Data);
  207.     lvItems.Selected.Delete;
  208.   end;
  209. end;
  210. function TForm1.GetItem(Handle: THandle): TListItem;
  211. var
  212.   I: Integer;
  213. begin
  214.   for I:=0 to lvItems.Items.Count-1 do
  215.   begin
  216.     result:= lvItems.Items[I];
  217.     if PItem(result.Data).Handle=Handle then Exit;
  218.   end;
  219.   result:= nil;
  220. end;
  221. procedure TForm1.ShutDownRequest;
  222. begin
  223.   Close;
  224. end;
  225. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  226. begin
  227.   if mnDisconnect.Enabled then
  228.     mnDisconnectClick(Sender);
  229. end;
  230. procedure TForm1.mnItemWriteClick(Sender: TObject);
  231. var
  232.   lvItem: TListItem;
  233.   Data: string;
  234.   v: Variant;
  235. begin
  236.   lvItem:= lvItems.Selected;
  237.   if Assigned(lvItem) then
  238.   begin
  239.     if InputQuery('提示','写入数值:',Data) then
  240.     begin
  241.       VarClear(v);
  242.       TVarData(v).VType:= varSingle;
  243.       TVarData(V).VSingle:= StrToFloat(Data);
  244.       if ASDAC_WriteItem(FServer, FGroup, PItem(lvItem.Data).Handle, v, true) then
  245.         lvitem.SubItems[0]:= v;
  246.     end;
  247.   end;
  248. end;
  249. procedure TForm1.lvItemsClick(Sender: TObject);
  250. begin
  251.   if Assigned(lvItems.Selected) then
  252.   begin
  253.     mnItemWrite.Enabled:= true;
  254.     mnItemRead.Enabled:= true;
  255.     mnItemRemove.Enabled:= true;
  256.     mnItemRefresh.Enabled:= true;
  257.     mnItemProperties.Enabled:= true;
  258.   end;
  259. end;
  260. procedure TForm1.mnItemReadClick(Sender: TObject);
  261. var
  262.   lvItem: TListItem;
  263.   Data: Variant;
  264.   ft: TFileTime;
  265.   Quality: WORD;
  266. begin
  267.   lvItem:= lvItems.Selected;
  268.   if Assigned(lvItem) then
  269.   begin
  270.     VarClear(Data);
  271.     if ASDAC_ReadItem(FServer, FGroup, PItem(lvItem.Data).Handle, @Data,@ft, @Quality) then
  272.     begin
  273.       lvItem.SubItems[0]:= Data;
  274.       lvItem.SubItems[1]:= IntTostr(Quality);
  275.       lvItem.SubItems[2]:= FileTimeToString(ft);
  276.     end;
  277.   end;
  278. end;
  279. procedure TForm1.Clear;
  280. var
  281.   I: Integer;
  282. begin
  283.   for I:=0 to lvItems.Items.Count-1 do Dispose(PItem(lvItems.Items[I].Data));
  284.   lvItems.Clear;
  285. end;
  286. procedure TForm1.mnGroupStatusClick(Sender: TObject);
  287. var
  288.   Editor: TGroupStatus;
  289.   UpdateRate: DWORD;
  290.   Active: BOOL;
  291.   TimeBias: LONGINT;
  292.   DeadBand: Single;
  293.   dwLCID: DWORD;
  294. begin
  295.   Editor:= TGroupStatus.Create(nil);
  296.   try
  297.     if ASDAC_GetGroupStat(FServer, FGroup, @UpdateRate, @Active, @TimeBias, @DeadBand, @dwLCID) then
  298.     begin
  299.       Editor.Name.Text:= FGroupName;
  300.       Editor.UpdateRate.Text:= IntToStr(UpdateRate);
  301.       Editor.DeadBand.Text:= Format('%4.2f',[DeadBand*100]);
  302.       Editor.Active.Checked:= Active;
  303.       Editor.TimeBias.Text:= IntToStr(TimeBias);
  304.     end;
  305.     if Editor.ShowModal=mrOK then
  306.     begin
  307.       Active:= Editor.Active.Checked;
  308.       TimeBias:= StrToInt(Editor.TimeBias.Text);
  309.       DeadBand:= StrToFloat(Editor.DeadBand.Text) / 100;
  310.       UpdateRate:= StrToInt(Editor.UpdateRate.Text);
  311.       if CompareText(Editor.Name.Text, FGroupName)<>0 then
  312.       begin
  313.         if ASDAC_SetGroupName(FServer, FGroup, PChar(Editor.Name.Text)) then
  314.           FgroupName:= Editor.Name.Text;
  315.       end;
  316.       ASDAC_SetGroupStat(FServer, FGroup, UpdateRate,Active, TimeBias, DeadBand, dwLCID);
  317.     end;
  318.   finally
  319.     Editor.Free;
  320.   end;
  321. end;
  322. procedure TForm1.mnServerStatusClick(Sender: TObject);
  323. var
  324.   Editor: TServerStatus;
  325.   ftStart, ftCurrent, ftUpdate: TFileTime;
  326.   dwBandWidth, dwGroupCount: DWORD;
  327.   wState: WORD;
  328.   vendor: PChar;
  329.   wMajor, wMinor, wBuild: WORD; 
  330. begin
  331.   Editor:= TServerStatus.Create(nil);
  332.   try
  333.     vendor:= strAlloc(128);
  334.     try
  335.       if ASDAC_GetServerStatus(FServer, @ftStart, @ftCurrent, @ftUpdate, @wState,
  336.         @dwBandWidth, @dwGroupCount, @wMajor, @wMinor, @wBuild, vendor, 128) then
  337.       begin
  338.         Editor.StartTime.Text   := FileTimeToString(ftStart);
  339.         Editor.CurrentTime.Text := FileTimeToString(ftCurrent);
  340.         Editor.LastUpdate.Text  := FileTimeToString(ftUpdate);
  341.         Editor.ServerState.Text := IntToStr(wState);
  342.         Editor.GroupCount.Text  := IntToStr(dwGroupCount);
  343.         Editor.BandWidth.Text   := IntToStr(dwBandWidth);
  344.         Editor.MajorVersion.Text:= IntToStr(wMajor);
  345.         Editor.MinorVersion.Text:= IntToStr(wMinor);
  346.         Editor.BuildVersion.Text:= IntToStr(wBuild);
  347.       end;
  348.       Editor.ShowModal;
  349.     finally
  350.       strDispose(vendor);
  351.     end;
  352.   finally
  353.     Editor.Free;
  354.   end;
  355. end;
  356. procedure TForm1.mnItemPropertiesClick(Sender: TObject);
  357. var
  358.   Editor: TItemStatus;
  359. begin
  360.   if Assigned(lvItems.Selected) then
  361.   begin
  362.     Editor:= TItemStatus.Create(nil);
  363.     try
  364.       Editor.Server:= FServer;
  365.       Editor.ItemName:= lvitems.Selected.Caption;
  366.       Editor.ShowModal;
  367.     finally
  368.       Editor.Free;
  369.     end;
  370.   end;
  371. end;
  372. end.