个问题与RDM无关,这是远程接口返回数组或对象的问题。
远程接口返回数组是简单的,使用Variant*类型返回就可以了,不过先要将数组转成一个Variant变量,接口返回这个变量后再将其解析。
而对象比较复杂,正常的用法应该看TFont、TPicture之类的例子,这在DELPHI源码中是有的,要用帮助类、接口什么的,我也没搞懂。下面是一个使用数组变形处理对象列表的例子:
procedure TPermission.FromVariant(AValues: OleVariant);
var
TmpError: EPrescient;
begin
try
ModuleName:= AValues[0];
StrToVersion(AValues[1], ModuleVersion);
Permission:= AValues[2];
StrToVersion(AValues[3], PermissionVersion);
PermissionTitle:= AValues[4];
PermissionValue:= AValues[5];
except
on E: Exceptiondo
begin
TmpError:= EPrescient.Create(E.Message);
TmpError.Msg:= '导入权限信息出错!变体类型结构异常!';
TmpError.Dispose:= [edRecord, edShow];
TmpError.ID:= 0;
TmpError.Throw:= 'TPermission.FromVariant(AValues: OleVariant);';
TmpError.Level:= elFatal;
TmpError.Types:= etSystem;
raise TmpError;
end;
end;
end;
function TPermission.ToVariant: OleVariant;
begin
Result:= VarArrayCreate([0,5], varVariant);
Result[0] := ModuleName;
Result[1] := VersionToStr(ModuleVersion);
Result[2] := Permission;
Result[3] := VersionToStr(PermissionVersion);
Result[4] := PermissionTitle;
Result[5] := PermissionValue;
end;
将一个对象转成数组放入Variant和将一个对象从Variant中取出。
procedure TPermissionList.FromVariant(AValues: OleVariant);
var
iLoop: integer;
TmpPermission: TPermission;
begin
if not VarIsArray(AValues) then
Exit;
for iLoop:= VarArrayLowBound(AValues, 1) to VarArrayHighBound(AValues, 1)do
begin
TmpPermission:= TPermission.Create;
try
TmpPermission.FromVariant(AValues[iLoop]);
Add(TmpPermission);
Except
TmpPermission.Free;
raise;
end;
end;
end;
function TPermissionList.ToVariant: OleVariant;
var iLoop: integer;
begin
if Count = 0 then
Exit;
Result:= VarArrayCreate([0, Count - 1], varVariant);
For iLoop:= 0 to Count - 1do
Result[iLoop] := PermissionList[iLoop].ToVariant;
end;
将一个对象列表转入数组放入Variant和从数组中取出。这中间调用了单个对象的转换,最后Variant里包含了数组的数组,单个数组可以是一个变量也可以是一个结构。整个的就是一个对象列表也可以是结构列表也可以是二维数组。
自己试试吧