ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:110.82KB ,
资源ID:4628585      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4628585.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RemObjects文档翻译3.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

RemObjects文档翻译3.docx

1、RemObjects文档翻译3这个文档展示了RemObjects SDK3.0框架的几个新特性.这个文档只讨论代码和类级别的特性. 其它的特性像均衡负载,容错,多服务器支持和服务器事件将在其它稳定中介绍. 这个文档中的范例代码可以在Chat范例和升级的MegaMemo,DispatchNotifier范例中找到. 对象的生存期当你在服务器上写一个返回复杂类型的方法时(或者返回,或者Var参数),RemObjects框架将其流化发送到客户端后将自动释放他们. 假定你写一个简单的方法: function TChatService.GetLoggedUsers: TUserInfoArray;beg

2、in result := TUserInfoArray.Create; result.Add; result.Add;end;在方法调用后,实例给返回结果赋值,发送到客户端,并释放.但是有时我们并不希望这样.假设你的服务器是使用TROSingletonClassFactory 控件创建的Singleton模式的,这时需要像GetLoggedUsers方法一样返回一个内部对象: type TChatService TChatService = class(TRORemoteDataModule, IChatService) private fUsers : TUserInfoArray;.fun

3、ction TChatService.GetLoggedUsers: TUserInfoArray;begin result := fUsers;end;但是这样的话无论你返回什么都将被框架释放. 在RemObjects 2.0中,只有拷贝一个新的fUsers变量返回(例如 result := fUsers.Clone;). RemObjects SDK 3.0中提供了一个新特性可以让我们自己觉得什么对象自动释放什么对象不自动释放. 防止fUsers被释放,我们可以使用一个简单的方法 procedure RetainObject(const anObject : TObject);下面的代码举

4、例说明: function TChatService.GetLoggedUsers: TUserInfoArray;begin result := fUsers; RetainObject(fUsers);end;在方法调用完毕后,fUsers不会释放.但在服务器关闭时必须释放掉fUsers实例. Object retention is a feature that the framework is capable of using if your objects implement the following interface: IROObjectRetainer IROObjectRet

5、ainer = interface1DFCCCAB-CD61-415F-ADFB-258C067E9A59 procedure RetainObject(const anObject : TObject); procedure ReleaseObject(const anObject : TObject); function IsRetained(const anObject : TObject) : boolean;end;类TRORemotable 和TRORemoteDataModule被强化,支持IROObjectRetainer接口. 对象生命周期也在客户端通过触发服务器事件实现了.

6、我们讲再以后讨论更多细节. Variant支持 由于客户要求我们介绍一下对Variant数据类型的支持.你可以创建接受和返回Variant类型的服务器方法.下面的代码展示了使用Variant类型的接口服务器方法: INewService = interface 509D1C6D-51DF-4269-A160-DB5B5B671874 function Sum(const A: Integer; const B: Integer): Integer; function GetServerTime: DateTime; procedure EchoVariant(const InputVarian

7、t: Variant; out OutputVariant: Variant);end;下面的截图展示了在客户端使用EchoVariant方法的例子. 客户端发送不同类型的Variant类型: integers, strings, datetime, boolean 和bytes数组. 注意这时TROSOAPMessage控件不支持Byte数组. TROArray and TROCollection Search and GetIndex methods 当你在Service Builder中建立数组类型时, RemObjects 可以自动在XXX_INtf.pas中生成两个类. 一个是标准的

8、TCollection对象, 它可以使用RTTI反射机制,第二个是继承于TROArray的类. 下面的代码是在Chat范例中自动产生的: TUserInfo TUserInfo = class(TROComplexType)private fUserID: String; fSessionID: String;public procedure Assign(iSource: TPersistent); override;published property UserID:String read fUserID write fUserID; property SessionID:String r

9、ead fSessionID write fSessionID;end; TUserInfoCollection TUserInfoCollection = class(TROCollection)protected constructor Create(aItemClass: TCollectionItemClass); overload; .public constructor Create; overload; function Add: TUserInfo; reintroduce; procedure SaveToArray(anArray: TUserInfoArray); pro

10、cedure LoadFromArray(anArray: TUserInfoArray); property ItemsIndex: integer:TUserInfo read GetItems write SetItems; default;end; TUserInfoArray TUserInfoArray = class(TROArray)private .protected .public . function Add: TUserInfo; overload; function Add(const Value: TUserInfo):integer; overload;prope

11、rty Count : integer read GetCount; property ItemsIndex: integer:TUserInfo read GetItems write SetItems; default;end;使用这种类型你需要查找特定的项,例如要查找第一个UserID是Jack的项,代码如下: funcion SearchByUserID(anArray : TROUserInfoArray; const aUserID : string) : TUserInfo;var i : integer;begin result := NIL; for i := 0 to (u

12、serarray.Count-1) do if SameText(userarrayi.UserID, JACK) then begin result := userarrayi; Exit; end;end;不是很复杂,但是使用每个集合体都要写这些是很枯燥的. TROCollection 和TROArray类现在支持GetIndex方法和查询,允许只写一行代码就能查找集合体或数组. 在RemObjects SDK 3.0中我们作上面的查询,可以这样: myuser := TUserInfo(userarray.Search(UserID, JACK);Search 和GetIndex方法声明

13、如下: function Search(const aPropertyName : string; const aPropertyValue : Variant; StartFrom : integer = 0; Options : TROSearchOptions = soIgnoreCase) : TCollectionItem;function GetIndex(const aPropertyName : string; const aPropertyValue : Variant; StartFrom : integer = 0; Options : TROSearchOptions

14、= soIgnoreCase) : integer;Search方法返回一个集合或数组的一项.没有没有匹配的就返回Nil.GetIndex方法返回集合或数组的索引.附件的参数StartFrom和Options可以更灵活的控制查找条件. 自定义异常 The RemObjects SDK 3.0增强了对自定义异常的支持并可以在新的异常类中添加自定义成员.你可以创建一个新的包含自定义类型成员的异常类型,并可以不用写序列化和解析代码就能完全的发送到客户端.MegaDemo范例中使用了这种特性. 在MegaDemo范例目录中的NewService_Impl.pas文件可以发现如下方法:procedure

15、 TNewService.RaiseTestException;begin raise ETestException.Create( This is the exception message, 666, Some extra info here);end;在Service Builder中异常ETestException类型包含一个ErrorCode整型数型和AdditionalInfo字符串属性. 在NewLibrary_Intf单元中RemObjects自动生成的代码如下: Exceptions ETestException = class(EROException)private .p

16、ublic constructor Create(const anExceptionMessage : string; aErrorCode: Integer; const aAdditionalInfo: String);published property ErrorCode: Integer read fErrorCode write fErrorCode; property AdditionalInfo: String read fAdditionalInfo write fAdditionalInfo;end;可以看到ErrorCode 和AdditionalInfo已经加入到了类和

17、构造函数中,我们只需要一行代码就能抛出异常.此外,注册自定义异常的代码也自动在NewLibrary_Intf单元的Initialization结中生成. unit NewLibrary_Intf;.initialization . RegisterExceptionClass(ETestException); .finalization . UnregisterExceptionClass(ETestException); . end.原来支持的标准异常也被扩展了,Delphi中的标准异常都没有在RemObjects框架中注册,在客户端抛出EROUnregisteredException 类型

18、的异常. MegaDemo范例中的RaiseError方法,抛出一个Delphi异常: procedure TNewService.RaiseError;begin / Generic and unregistered exceptions raise EDivByZero.Create(A fake div by zero!);end;客户端用简单的代码如下: function TClientForm.InvokeRaiseError(const aService : INewService) : integer;.begin try . if not cbCustomException.C

19、hecked then aService.RaiseError() else aService.RaiseTestException; except on E:ETestException do begin result := GetTickCount-start; LogMessage(ETestException - Message:%s ErrorCode:%d+ AdditionalInfo:%s, E.Message, E.ErrorCode, E.AdditionalInfo, result, true); end; on E:Exception do beginresult :=

20、 GetTickCount-start; LogMessage(Generic exception - +E.ClassName+ Message: + E.Message, , result, true); end; end;end;很多异常都被改进并从EROException继承.上面谈到很多都是EROException子类的信息. 联合服务器(Combo Servers)在RemObjects项目类型中有一个新的模板Combo Standalone. 这个服务器是标准VCL Standalone 和NT Service 应用程序的联合形式,你可以运行这个服务器项目做其它的事情. 使用/i

21、nstall命令行参数可以在Windows NT/2000的服务列表中注册服务.如果要在Windows 9x下就直接运行程序就可以了.使用/uninstall 卸载NT service. 可以在TeamRO 的成员Reinhold Erlacher 中看到这个模板! IROStreamAccess 接口RemObjects 服务器允许你通过自定义类或实现了IRODispatchNotifier接口的类在一些方法执行前后去做一些控制.可以在DispatchNotifier范例中看到这两种方式. TRORemoteDataModule类后来提供了OnGetDispatchInfo事件而简化了第二种

22、方式. 事件OnGetDispatchInfo声明为: procedure(const aTransport : IROTransport; const aMessage : IROMessage) of object;当我们有一个传输通道来接受远程请求时,通过aMessage参数可以读取消息名称(例如Sum和GetServerTime),但是这种方式只能限于SOAP消息其他的方式无法读出消息的值. 原因在于二进制消息使用的是顺序流,所以有时这样做: aMessage.Read(aMessage, TypeInfo(string), textmessage, );我们移动指针并中断调试这个消息

23、. RemObjects 3.0通过实现IROStreamAccess接口扩充了TROBINMessage.IROStreamAccess接口定义如下: IROStreamAccess = interfaceDF3D000F-7EB3-4981-AA01-921553CAFF52 function GetStream : TStream; property Stream : TStream read GetStream;end;通过这个接口我们可以将消息流保存到文件,定为当前指针等.新的DispatchNotifier 范例在GetDispatchInfo方法中利用这个特性: procedur

24、e TDispService.GetDispatchInfo(const aTransport: IROTransport; const aMessage: IROMessage);var tcpinfo : IROTCPTransport; textmessage : string; streamaccess : IROStreamAccess;begin if Supports(aTransport, IROTCPtransport, tcpinfo) then ServerForm.Log(Client +tcpinfo.GetClientAddress+ connected!); wi

25、th aTransport do ServerForm.Log(Got a reference to a +GetTransportObject.ClassName); with aMessage do begin ServerForm.Log(About to invoke +InterfaceName+.+MessageName); if (MessageName=SendMessage) then begin aMessage.Read(aMessage, TypeInfo(string), textmessage, ); ServerForm.Log(The text message

26、was +textmessage+); New RemObjects 3.0: now you can reset the position of the message stream if Supports(aMessage, IROStreamAccess, streamaccess) then streamaccess.Stream.Position := 0; end; end; ServerForm.Log();end;TROSOAPMessage.OnEnvelopeComplete event 新版本的TROSOAPMessage 控件为服务器提供了更好的兼容性,并有一个新的事件

27、OnEnvelopeComplete. OnEnvelopeComplete定义如下: procedure(Sender : TROSOAPMessage) of object;这个事件允许我们在将SOAP包发送到客户端或服务器之前做更正或写入. 新的MegaDemo范例在客户端利用这个新特性在SOAP添加Test报头,其值为”1234”. 下面的代码证明了这点: procedure TClientForm.SOAPMessageEnvelopeComplete(Sender: TROSOAPMessage);begin Sender.Header.Add(Test).Value := 123

28、4; memo1.Lines.Text := Sender.EnvNode.XML;end;TROSOAPMessage也允许我们存取其他节点: property EnvNode : IXMLNode read GetEnvNode; property BodyNode: IXMLNode read GetBodyNode; property MessageNode: IXMLNode read GetMessageNode; property FaultNode : IXMLNode read GetFaultNode; property Header : IXMLNode read Get

29、Header;有一些属性可能不赋值,所以要在使用前检测其值是否为NIL.例如不要去存取FaultNode 节点,它只用于向客户端反馈服务器端异常和错误信息. New RemObjects_WebBroker package RemObjects SDK以前的版本有一个单元包含TROWebBrokerServer是RemObjects_Core 包得一部分.它依赖于INet 包,而与BPDX 或Indy 组件无关. RemObjects 3.0 有一个新的包叫做RemObjects_WebBroker,这样你可以编译相关的INet包了. New Events 为了开发者在消息序列化前后提供更好的

30、控制, RemObjects 3.0增加了如下事件: OnInitializeMessage, OnFinalizeMessage, OnWriteMessageParameter 和OnReadMessageParameter. 下面代码是MegaDemo范例的客户端,展示了如何使用这些事件: procedure TClientForm.BINMessageInitializeMessage(Sender: TROMessage; const aTransport: IROTransport; const anInterfaceName, aMessageName: String);begin if cbVerbose.Checked then LogMessage(Sender.Name+ is initialized, );end;procedure TClientForm.BINMessageFinalizeMessage(Sender: TROMessage);begin if cbVerbose.Checked then LogMessage(Sender.Name+ is finalized, );end;procedure TClientForm.BINMessageReadMessageParameter(Sen

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1