代码是这样的:
procedure TFrm1.Button1Click(Sender:TObject);
var
o:OleVariant;
s1,s2:Array of string;
i,l,h,m,n:Integer;
begin
o:=TKxOleCtrlEx1.Variables(lppxAllDataSource);
l:=varArrayLowBound(o,1); //取得l=0
h:=varArrayHighBound(o,1); //取得h=29 m:=varArrayLowBound(o,2); //取得m=0
n:=varArrayLowBound(o,2); //取得n=1 其实这2句没用,只是取得维数显示一下而已
SetLength(s1,h);
SetLength(s2,h); //设置数组长度
if VarIsEmpty(o) then
Exit;
for i:=l to h do
begin
s1[i]:=o[0][i]; //运行到这里的时候出错,提示“Variant Array Index out of Bounds”
s2[i]:=o[1][i];
ShowMessage(s1[i]+' '+s2[i]);
end;
end;请高手指点一下,谢谢
procedure TFrm1.Button1Click(Sender:TObject);
var
o:OleVariant;
s1,s2:Array of string;
i,l,h,m,n:Integer;
begin
o:=TKxOleCtrlEx1.Variables(lppxAllDataSource);
l:=varArrayLowBound(o,1); //取得l=0
h:=varArrayHighBound(o,1); //取得h=29 m:=varArrayLowBound(o,2); //取得m=0
n:=varArrayLowBound(o,2); //取得n=1 其实这2句没用,只是取得维数显示一下而已
SetLength(s1,h);
SetLength(s2,h); //设置数组长度
if VarIsEmpty(o) then
Exit;
for i:=l to h do
begin
s1[i]:=o[0][i]; //运行到这里的时候出错,提示“Variant Array Index out of Bounds”
s2[i]:=o[1][i];
ShowMessage(s1[i]+' '+s2[i]);
end;
end;请高手指点一下,谢谢
这句好象是想取得datasource的参数吧,就算取值时会自动分配OleVariant的空间,但是你的二维数组又是怎么来的呢?
出错应该是在这里o[1][i];o应该是个容器数组,但是没有二维,所以i出错了,LZ可以跟踪一下,看看o[0]和o[1]分别取到的是什么东西
TKxOleCtrlEx1.Variables(lppxAllDataSource)的结果是一个OleVariant
上面的代码中分别取得了一维和二维的长度,它确实是个二维数组不管我用o[0]还是o[0][0],都会提示这个问题,困惑中
function GetValue(out x:类型;ReVariant:Variant):Boolean;
var
RePointer: Pointer;
begin
{设置X的大小}
New(RePointer);
RePointer := VarArrayLock(ReValue);
CopyMemory(X的起始地址, RePointer, X的内存大小);
VarArrayUnlock(ReValue);
end;可以试试
刚才上网查了一下,找到了一个有意思的demo
终于学习了,LZ可以参考一下
http://www.uipower.com/bbs/thread-175544-1-1.html
var A: Variant;
begin
A := VarArrayCreate([0, 4], varVariant);
A[0] := 1;
A[1] := 1234.5678;
A[2] := 'Hello world ';
A[3] := True;
A[4] := VarArrayOf([1, 10, 100, 1000]);
WriteLn(A[2]); { Hello world }
WriteLn(A[4][2]); { 100 }
end;
感觉按照这个例子,动态数组中存入的值,可能只有某一项是二维的
RePointer := VarArrayLock(ReValue);
CopyMemory(X的起始地址, RePointer, X的内存大小);
VarArrayUnlock(ReValue);
这三句,其中X的类型就是Array[0..h] of string;h:=varArrayHighBound(o,1);
VarArrayLock()和VarArrayUnlock()
一般用于初始化一个大数组。
用于将Variant转化成指针类型,Locks a variant array and returns a pointer to the data。
var
RePointer: Pointer;
begin
o:=TKxOleCtrlEx1.Variables(lppxAllDataSource);
l:=varArrayLowBound(o,1); //取得l=0
h:=varArrayHighBound(o,1); //取得h=29
SetLength(s1,h);
if VarIsEmpty(o) then
Exit;
New(RePointer);
RePointer := VarArrayLock(o);
CopyMemory(s1, RePointer,sizeof(string)*h);
VarArrayUnlock(o);
end;你试试吧