源,再通过接口与客户端联系,这个 COM 工程必须注册在服务器上。
首先建立一个空白的工程, 在工程里放置一个 Adoconnection 组件。
然后再建一个远程数据模块 file-gt New -gt Other -gt Multitier -gt Remote Data Module远程数据模块。
Coclass Name : libserver ,Instancing :执行模式,大部分用 Multiple Instance(多重实例)Threading Model:线程模式,建议用 Apartment(单元)产生一个窗口,在这个窗口里,可以放入数据控件。
在 Viwe -gt Type Libray 中,我们可以看到这个 COM 的一些特性。
我们也可以记下系统提供的 GUID,以备后来使用。
并设置其指向一个数据库。
加入一个 ADOTable, 再设置一个 DataSetProvider在 DataAccess页指向 ADOTable这就完成了服务器端的程序设计。
保存,编译,注册(注意,只要运行就自动在本机注册了) 。
4.3 客户端程序的建立 在 Two-Tier 模式中,客户端Client程序是直接和服务器的数据源相连的,而 Multi-Tier 模式,多个客户端连接的是一个应用程序服务器,因为收费是按客户端数计算的,所以,数据库的使用费用比较低。
1)建立一个普通的工程。
,属性:在本机注册时,可直接设置以下属性: 2)放置一个 TDCOMConnrction 控件(在 Datasnap 页)ServerName:应用程序服务器注册名(server.libserver) Connectedtrue。
这时你可以看到服务器端的 COM 程序被激活了。
如果在网络上调试,需要给出服务器名:ComputerName:服务器名(自动给出网上邻居)注意: ServerGUID 的 GUID 值是自动给出的。
3 ) 放 置 一 个 TClientDataSet 控 件 ( 在 Data Access 页 ), 属 性 RemoteServerDCOMConnrction1ProviderName:DataSetProvider1(服务器端将被激活)Activetrue (激活后将能正常连接) 4)放置 TDataSource,属性:Dataset:指向 cdsCustomer。
这样一个客户端程序就建立好了其余犹如普通的数据库设计。
4.4 客户端实现 SQL 查询 由于在客户端不存在 TQuery 控件,似乎客户服务器模式是无法做 SQL 查询的。
但是,Delphi 很好的解决了这个问题。
事实上,只要客户端连接上服务端应用程序,客户端的 TClientDataSet 就包含了一个名字为 Provider 的属性,对应到服务器端 DataSetProvider 的所有默认属性和方法,其中 DataSetProvider有 一 个 Options 属 性 , 只 要 让 其 中 的 poAllowCommandTexttrue , 那 么 , DataSetProvider 的poAllowCommandText 就可以接受前台来的 SQL 命令,并传送给 TQuery。
可以看出,真正传递数据的是 DataSetProvider 的接口,所以,用这个接口搭建传递 SQL 的桥梁是必需的。
客户端进行 SQL 查询的方法是: ClientDataSet.Close ClientDataSet.CommandText : SQL 语句 ClientDataSet.Open4.5 动态连接应用程序服务器的实现 客户端程序在运行时,需要连接应用服务器程序以取得服务。
但是,在系统实际应用的时候,运行应用服务器程序的计算机是经常改变的,因此在客户端程序启动时,应该先找到运行应用服务器程序的计算机的设置。
动态连接应用服务器的流程类似于 12.3 节的动态数据库连接,动态连接应用服务器程序的流程图 14-1 所示。
掌握了动态连接应用服务器的流程,就可以具体实现它。
下面就将分步骤介绍动态连接应用服务器的实现过程。
1 在 Delphi 中新建一个窗体,将单元文件保存为 connect.pas 窗体的 Name 属性设为 fm_serconfigCaption 属性设为”服务器配置”,运行后窗体如下图所示。
2 在“连接设置”窗体中,需要输入应用服务器主机名(或者应用服务器 IP 地址)和应用服务器的端口号,这些配置信息将用来连接应用服务器。
如果连接成功,输入的配置信息将被写入到注册表中,以后程序启动时,读取注册表配置信息,就可而已连接应用服务器程序了。
程序的具体实现部分如程序清单如下所示。
procedure BitBtn1ClickSender: TObjectprocedure Button1ClickSender: TObjectprivateprocedure WriteToRegconst bappHostbappIpaPort:string Private declarations public Public declarations endvar fm_SerConfig: Tfm_SerConfig Connected: boolean false //代表是否连接成功 implementation uses netlist data R .dfm procedure Tfm_SerConfig.BitBtn1ClickSender: TObject begin if Edt_host.Text or Edt_host.Textnull andEdt_ip.Text or Edt_host.Textnull then begin application.MessageBox请输入服务器和 IP输入错误 mb_iconinformation mb_defbutton1 exit end try strtointedt_Port.text except Application.MessageBox 请 输 入 正 确 的 端 口 号 输 入 错 误 .. mb_iconinformation mb_defbutton1 exit end statusbar1.Panels0.Text:正在连接服务器,pleale wait statusbar1.Refresh screen.Cursor:crHourGlass fm_data.Socket.Connected:false fm_data.Socket.Host:edt_host.Text fm_data.Socket.Address:edt_ip.Text fm_data.Socket.Port:strtointedt_port.Text try screen.Cursor:crdefault fm_data.Socket.Connected:true application.MessageBox连接成功图书管理系统 mb_iconinformation mb_defbutton1 connected:true except screen.Cursor:crdefault application.MessageBox连接失败图书管理系统mb_iconinformationmb_defbutton1 connected:false end //连接成功向注册表里写入应用服务器配置信息 WriteToRegedt_Host.Text edt_IP.Text edt_Port.Text close end //利用可视化窗体来选择计算机 procedure Tfm_SerConfig.Button1ClickSender: TObject begin edt_ip.Clear edt_host.Text: NetExecuteTFm_NetList end //把信息写入注册表 procedure Tfm_SerConfig.WriteToRegconst bappHostbappIpaPort:string var reg:Tregistry begin reg:Tregistry.Create reg.RootKey:HKEY_LOCAL_MACHINE if not reg.OpenKeySoftwarepzfalse then //如果可以创建目录 begin reg.CreateKeySoftwarepz reg.OpenKeySoftwarepzfalse end reg.WriteStringhostbapphost reg.WriteStringipbappip reg.WriteStringportaport reg.Free end end. 打开“连接设置”配置窗口,在打开窗体之前,函数已经将布尔变量 Connected 设为 False,而在窗体被关闭之后,将返回 Connected 变量的值,根据布尔变量 Connected 的值可以判断是否已经连接上应用服务器。
3 在连接设置主窗口中,我们为应用服务器名提供了辅助录入的方法,点击应用服务器名编辑框右边的省略号按钮(Button1) ,将弹出一个浏览局域网计算机的对话框,以方便用户选择应用服务器所在的计算机。
在此我们调用了一个 NetExecute 方法,它将返回用户选中的计算机的主机名。
这个方法是如何实现的呢?下面将介绍 NetExecute 方法的实现过程。
在 Delphi 中新建一个窗体,将窗体单元文件保存为 netlist .pas窗体的 Name 属性设为 Fm_netlist。
运行后窗体如下图所示。
在列举网络资源窗体中,将按照工作组以树型目录的形式显示局域网中的计算机。
程序的具体实现部分如下所示。
procedure FormActivateSender: TObjectprocedure TreeView1ClickSender: TObjectprocedure BitBtn1ClickSender: TObjectprivate procedure getcomputername procedure getgroupname Private declarations public Public declarations endfunction NetExecuteaFormClass: TFormClass: stringvar fm_NetList: Tfm_NetList n
上一篇:
企事业工资管理系统
下一篇:
让我掉下眼泪的