代码是这样的:
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;请高手指点一下,谢谢

解决方案 »

  1.   

    真没这么用过 ,但是从你的代码看TKxOleCtrlEx1.Variables(lppxAllDataSource);
     这句好象是想取得datasource的参数吧,就算取值时会自动分配OleVariant的空间,但是你的二维数组又是怎么来的呢?
    出错应该是在这里o[1][i];o应该是个容器数组,但是没有二维,所以i出错了,LZ可以跟踪一下,看看o[0]和o[1]分别取到的是什么东西
      

  2.   

    TKxOleCtrlEx1是一个Codesoft的控件
    TKxOleCtrlEx1.Variables(lppxAllDataSource)的结果是一个OleVariant
    上面的代码中分别取得了一维和二维的长度,它确实是个二维数组不管我用o[0]还是o[0][0],都会提示这个问题,困惑中
      

  3.   


    function GetValue(out x:类型;ReVariant:Variant):Boolean;
    var
     RePointer: Pointer;
    begin
      {设置X的大小}
      New(RePointer);
      RePointer := VarArrayLock(ReValue);
      CopyMemory(X的起始地址, RePointer, X的内存大小);
      VarArrayUnlock(ReValue);
    end;可以试试
      

  4.   

    看来是我out了
    刚才上网查了一下,找到了一个有意思的demo
    终于学习了,LZ可以参考一下
    http://www.uipower.com/bbs/thread-175544-1-1.html
      

  5.   

    对了还有这个
    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;
    感觉按照这个例子,动态数组中存入的值,可能只有某一项是二维的
      

  6.   

    关键的就是
      RePointer := VarArrayLock(ReValue);
      CopyMemory(X的起始地址, RePointer, X的内存大小);
      VarArrayUnlock(ReValue);
    这三句,其中X的类型就是Array[0..h] of string;h:=varArrayHighBound(o,1);
      

  7.   

    在给你贴详细点吧
    VarArrayLock()和VarArrayUnlock()
    一般用于初始化一个大数组。
    用于将Variant转化成指针类型,Locks a variant array and returns a pointer to the data。
      

  8.   

    嗯,今天又day day up了,^^
      

  9.   


    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;你试试吧