D7 WebService TRemotable 在 WebService 接口函数中传递对象是否需要释放 Free

50 views
Skip to first unread message

电脑玩家

unread,
Oct 6, 2009, 6:30:52 AM10/6/09
to 挨踢技术
Delphi 7 的 WebService 接口函数中,如果要传递 Record 类型的数据,必须把它封装为一个继承自 TRemotable
的类。

在客户端:
1. 如果是向服务器端发送数据,则是创建对象,赋值,调用接口函数,最后要释放对象;
2. 如果是从服务器接收数据,则是定义一个变量,调用接口函数获取数据,即这个变量已经是一个对象实例了。用完这个变量,最后要释放。

在服务器端,按照 HELP 所说,TRemotable 对象是自动释放的。但是,如果返回的 TRemotable 内部有字段是另一个
TRemotable 类的实例的数组,比如:

TSalary = class(TRemotable)
private
FID: Integer;
FSalary: Integer;
published
property ID: Integer read FID write FID;
property Salary: Integer read FSalary write FSalary;
end;

TSalaryList = array of TSalary;

TRen = class(TRemotable)
private
FRName: string;
FID: Integer;
FSalarys: TSalaryList;
public
procedure SetSalaryLength(const i: Integer);
published
property ID: Integer read FID write FID;
property RName: string read FRName write FRName;
property Salarys: TSalaryList read FSalarys write FSalarys;
end;

那么,在服务器端的实现代码里,需要这样做:

function TOPFTest.GetRen: TRen;
var
ASalary: TSalary;
ASalarys: TSalaryList;
ID: Integer;
begin
Result := TRen.Create;
Result.ID := 2;
Result.RName := 'pcplayer - 哈哈';

Result.SetSalaryLength(3);

ASalary := TSalary.Create;
ASalary.ID := Result.ID;
ASalary.Salary := 1200;
Result.Salarys[0] := ASalary;
Result.DataContext.AddObjectToDestroy(ASalary);

ASalary := TSalary.Create;
ASalary.ID := Result.ID;
ASalary.Salary := 1201;
Result.Salarys[1] := ASalary;
Result.DataContext.AddObjectToDestroy(ASalary);

ASalary := TSalary.Create;
ASalary.ID := Result.ID;
ASalary.Salary := 1202;
Result.Salarys[2] := ASalary;
Result.DataContext.AddObjectToDestroy(ASalary); 《----- 这里要用这个方法,则
Result 这个对象被服务器端自动释放的时候,它会释放DataContext内部的对象。否则,根据测试代码的观察,有内存泄漏,也就是
ASalary 对象没有被自动释放。
end;

Reply all
Reply to author
Forward
0 new messages