怎样设定中间层方法和客户端调用该方法时的参数?(100分)

  • 主题发起人 wang3003
  • 开始时间
W

wang3003

Unregistered / Unconfirmed
GUEST, unregistred user!
我在中间层写了一个方法,起目的是生成一批字符串(可看成字符串数组)然后将其返回
给客户端。我想问的是中间层的方法中用什么类型的参数,同时客户端又该传递一个什么
类型的参数呢?中间层所生成的字符串的个数并不能确定,因为每次调用是的结果是不
一样的。而客户端又不能用TStringList这种类型来进行传递参数。请高手指点一二!!!
 
to Another_eYes:
能否抽空写几句简单的例子代码?
我想传的是TreeView中的Nodes数据,但现在只想到用 ClientDataSet 传个固定格式的
DataSet,如果能用OleVariant 传就好了。给些建议。
 
我该用了另外一招来解决这个问题,因为中间层生成的每个字符串的长度总是相等的,所以在
中间层的方法中将Input,Output参数设为BSTR** 类型,然后生成一个新字符串就将其再加入
到这个参数所对应的Parameters.ParamByName('参数名').Values中,在客户端调用时用
的参数为String类型,然后根据所需的字符串的对应长度(因为长度固定,所以好解决)
将其从String类型的变量中一一取出来并放入另外一个TStringList类型的变量中,
这样就解决了该问题.但若是中间层的所生成的每个字符串的长度不一样又该如何呢?
 
to wang3003:
你这样说我便想起来一个办法来传TStringList:
参数就定为一个字符串类型。因为TStringList有一个属性为Text,是所有Strings[]
的和。Text属性的类型为String, 将它当做参数传回给客户端,客户端再将该值赋至
自己的一个TStringList.Text中去,不就成了吗?
不知道这样做有没有错?
 
将字符串打包到客户端进行解包
 
用 VARIANT ARRAY 形式的 OLEVARIANT
 
用不着这么麻烦, stringlist1.text->string->stringlist2.text
可以通过一个string传递TStringlist,分别在中间层和客户端展开、收起这
个TStringList就可以实现。
 
在server端将各个字符串拼接起来,串之间用一个特殊字符做分隔符,
然后在client端用pos定位之后拆分,既简单又不会出错。
 
让俺来给你抄一个例子:
AppServer:
procedure TSystemHelp.DriveInfo(out TotalCount: Integer;
out DriveInfo: Variant);
const
Size = 28 * 5;
// 26 letters times plenty of room for letters
var
DriveStrings, TempDriveStrings: PChar;
DriveType: string;
SectorsPerCluster, BytesPerSector: Cardinal;
NumberOfFreeClusters, TotalNumberOfClusters: Cardinal;
FreeAvailable, TotalSpace: LargeInt;
TotalFree: LargeInt;
DriveInfoRec: TDriveInfoRec;
ADrive: Variant;
TempVar: Variant;
TempPtr: Pointer;
begin
TotalCount := 0;
DriveInfo := VarArrayCreate([0, 28], VarVariant);
GetMem(DriveStrings, Size);
GetLogicalDriveStrings(Size, DriveStrings);
TempDriveStrings := DriveStrings;
while StrLen(TempDriveStrings) <> 0do
begin
ADrive := VarArrayCreate([0, 3], VarVariant);
case GetDriveType(TempDriveStrings) of
DRIVE_UNKNOWN: DriveType := 'Unknown';
DRIVE_NO_ROOT_DIR: DriveType := 'Not a root drive';
DRIVE_REMOVABLE: DriveType := 'Removable';
DRIVE_FIXED: DriveType := 'Hard Drive';
DRIVE_REMOTE: DriveType := 'Network';
DRIVE_CDROM: DriveType := 'CDROM';
DRIVE_RAMDISK: DriveType := 'RAMDisk';
else
DriveType := 'Error';
end;

ADrive[0] := AnsiString(TempDriveStrings);
ADrive[1] := DriveType;
GetDiskFreeSpace(TempDriveStrings, SectorsPerCluster, BytesPerSector,
NumberOfFreeClusters, TotalNumberOfClusters);
DriveInfoRec.SectorsPerCluster := SectorsPerCluster;
DriveInfoRec.BytesPerSector := BytesPerSector;
DriveInfoRec.NumberOfFreeClusters := NumberOfFreeClusters;
DriveInfoRec.TotalNumberOfClusters := TotalNumberOfClusters;
GetDiskFreeSpaceEx(TempDriveStrings, FreeAvailable, TotalSpace, @TotalFree);
DriveInfoRec.FreeAvailable := FreeAvailable;
DriveInfoRec.TotalSpace := TotalSpace;
DriveInfoRec.TotalFree := TotalFree;
TempVar := VarArrayCreate([0, SizeOf(TDriveInfoRec)], VarByte);
TempPtr := VarArrayLock(TempVar);
Move(DriveInfoRec, TempPtr^, SizeOf(TDriveInfoRec));
VarArrayUnlock(TempVar);
ADrive[2] := TempVar;
DriveInfo[TotalCount] := ADrive;
Inc(TempDriveStrings, StrLen(TempDriveStrings) + 1);
Inc(TotalCount);
end;
FreeMem(DriveStrings, Size);
end;
Client:
procedure TForm1.ReportOnDriveStatus;
const
Size = 28 * 5;
// 26 letters plus A and B times plenty of room for letters
var
TotalCount, i: Integer;
ADrive, DriveInfo: Variant;
DriveInfoRec: TDriveInfoRec;
TempVar: Variant;
TempPtr: Pointer;
begin
if FSystemHelp = nil then
Exit
else
FSystemHelp.DriveInfo(TotalCount, DriveInfo);

Memo1.Clear;
for i := 0 to TotalCount - 1do
begin

ADrive := DriveInfo;
Memo1.Lines.Add('[' + ADrive[0] + '] ' + ADrive[1]);
TempVar := ADrive[2];
TempPtr := VarArrayLock(TempVar);
Move(TempPtr^, DriveInfoRec, SizeOf(TDriveInfoRec));
with Memo1.Lines, DriveInfoRecdo
begin
Memo1.Lines.Add('Sectors Per Cluster: ' + IntToStr(SectorsPerCluster));
Memo1.Lines.Add('Bytes Per Sector: ' + IntToStr(BytesPerSector));
Memo1.Lines.Add('Number of Free Clusters: ' +
IntToStr(NumberOfFreeClusters));
Memo1.Lines.Add('Total Number of Clusters: ' +
IntToStr(TotalNumberOfClusters));
Memo1.Lines.Add('Free Avalable: ' + IntToStr(FreeAvailable));
Memo1.Lines.Add('Total Space: ' + IntToStr(TotalSpace));
Memo1.Lines.Add('Total Free: ' + IntToStr(TotalFree));
Memo1.Lines.Add('');
end;

end;
end;

 
可以使用IStrings接口,IString接口与TStrings类可以相互转换。
 
例子是从《Delphi 4 技术内幕》上抄的
 
--)z_cd 真笨,本来就是抄的(让俺来给你抄一个例子)
 
接受答案了.
 
顶部