procedure TForm1.Button1Click(Sender: TObject); type DBTableInfo = record fieldname:string; fieldvalue:string; end; type DBTable = array[0..2] of DBTableInfo;type DBTable = array[0..2] of DBTableInfo; var test:IVariantArray; aaa:DBTable; bbb:DBTable; SendData,GettedData:OleVariant; msgString:string; i:integer; v:Variant; p:Pointer; begin test := CoVariantArray.Create; v := VarArrayCreate([0,sizeof(DBTable)],varByte); aaa[0].fieldname := 'bookid'; aaa[0].fieldvalue := '0'; aaa[1].fieldname := 'bookname'; aaa[1].fieldvalue := '射雕英雄传'; aaa[2].fieldname := 'bookauthor'; aaa[2].fieldvalue := '金庸'; p := VarArrayLock(v); Move(aaa,p^,sizeof(DBTable)); VarArrayUnLock(v); sendData := v; test.GetArray(SendData,GettedData); v := GettedData; p := VarArrayLock(v); Move(p^,bbb,sizeof(DBTable)); VarArrayUnLock(v);
msgString := ''; for i := 0 to Size - 1 do begin msgString := ''; msgString := bbb[i].fieldname + ' ' + bbb[i].fieldvalue; showmessage(msgString); end; test := nil; end; 今天下午的一个测试用的代码,有点乱,粘到delphi中看得清楚些。 服务器端的GetArray(SendData,GettedData);只不过把两个数据换了一下,没大用处。
糟,多删了一个size:integer. for循环里size = 3.
再转一篇简单的,未测试Server(COM/DCOM程序)端: procedure TTestDCOM.Send4(Size: Integer; D1: OleVariant); type TData=array [0..999] of Byte; Var Data:TData; i:Integer; begin for i:=0 to Size-1 do begin Data[i]:=D1[i]; end; end; Cleint端: Var D1:OleVariant; begin D1:=VarArrayCreate([0,99],varByte); { D1[1]:=45; .... //将值存入D1中 } S.Send4(99,D1); //S是TestDCOM对象 end;
其实传递多维数组很简单!只需要按Delphi中个一多维数组赋值的方法。如: var RetVarArray,RowVarArray:OleVariant; i,j:integer; begin RetVarArray:=varArrayCreate([1,m],varVariant); RowVarArray:=varArrayCreate([1,n],varVariant); for i:=o to m-1 do begin for j:=0 to n-1 do beign RowVarArray[j]:=i*j; end; RetVarArray[i]:=RowVarArray; end; 道理上讲更简单,是因为Variant类型本身支持数组类型 end;
VarArrayGet
VarArrayHighBound
具体使用看联机帮助
我就是搞不定才请教大家的
联机帮助我看了好多遍了,搞不定阿to:del_c_sharp(摩托~◎~◎~◎)
我不知道用什么,反正能用起来就可以了能否给我一个例子或者一段代码?
type
DBTableInfo = record
fieldname:string;
fieldvalue:string;
end;
type
DBTable = array[0..2] of DBTableInfo;type
DBTable = array[0..2] of DBTableInfo;
var
test:IVariantArray;
aaa:DBTable;
bbb:DBTable;
SendData,GettedData:OleVariant;
msgString:string;
i:integer;
v:Variant;
p:Pointer;
begin
test := CoVariantArray.Create;
v := VarArrayCreate([0,sizeof(DBTable)],varByte); aaa[0].fieldname := 'bookid';
aaa[0].fieldvalue := '0';
aaa[1].fieldname := 'bookname';
aaa[1].fieldvalue := '射雕英雄传';
aaa[2].fieldname := 'bookauthor';
aaa[2].fieldvalue := '金庸'; p := VarArrayLock(v);
Move(aaa,p^,sizeof(DBTable));
VarArrayUnLock(v); sendData := v; test.GetArray(SendData,GettedData);
v := GettedData; p := VarArrayLock(v);
Move(p^,bbb,sizeof(DBTable));
VarArrayUnLock(v);
msgString := '';
for i := 0 to Size - 1 do
begin
msgString := '';
msgString := bbb[i].fieldname + ' ' + bbb[i].fieldvalue;
showmessage(msgString);
end;
test := nil;
end;
今天下午的一个测试用的代码,有点乱,粘到delphi中看得清楚些。
服务器端的GetArray(SendData,GettedData);只不过把两个数据换了一下,没大用处。
for循环里size = 3.
type
TData=array [0..999] of Byte;
Var
Data:TData;
i:Integer;
begin
for i:=0 to Size-1 do begin
Data[i]:=D1[i];
end;
end;
Cleint端: Var
D1:OleVariant;
begin
D1:=VarArrayCreate([0,99],varByte); {
D1[1]:=45;
.... //将值存入D1中 }
S.Send4(99,D1); //S是TestDCOM对象 end;
var
RetVarArray,RowVarArray:OleVariant;
i,j:integer;
begin
RetVarArray:=varArrayCreate([1,m],varVariant);
RowVarArray:=varArrayCreate([1,n],varVariant);
for i:=o to m-1 do
begin
for j:=0 to n-1 do
beign
RowVarArray[j]:=i*j;
end;
RetVarArray[i]:=RowVarArray;
end;
道理上讲更简单,是因为Variant类型本身支持数组类型
end;