有如下定义
 i,j:integer;
 iis:ISharedProperty;
 spg:ISharedPropertyGroup;
 oe:Olevariant;
begin
... ...
  iis:=spg.CreateProperty('iis',exists);
... ...
  oe:=vararraycreate([1,10],varInteger);
  for i:=1 to 10 do
    oe[i]:=0;
  iis.Value:=oe;
... ...
  oe:=iis.Value;
  for i:=1 to 10 do
    j:=oe[i];//出错
写的简单了些,但是就是出错,Variant is no an array大致意思是oe不是数组,我不明白为什么会这样,该怎么解决

解决方案 »

  1.   

    说不出来,帮你帖一段代码吧。
    procedure TForm1.Button1Click(Sender: TObject);
    type
        DBTableInfo = record
            fieldname:string;
            fieldvalue:string;
        end;
    type
        DBTable = array[0..2] of DBTableInfo;
    var
        test:IVariantArray;
        aaa:DBTable;
        bbb:DBTable;
        SendData,GettedData:OleVariant;
        Size:Int64;
        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;
        Size := 3;
        test.GetArray(Size,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;测试过的,为什么这么写,忘啦。
      

  2.   

    .....
      for i:=1 to 10 do
        oe[i]:=0;
      iis.Value:=oe;  oe:=iis.Value;
      for i:=1 to 10 do
        j:=oe[i];//出错
    ........
    //这样应该不会出错吧?iis.value的再此取得是不是有问题
      

  3.   

    楼主你的确没有说清楚
      for i:=1 to 10 do
        oe[i]:=0;
      iis.Value:=oe;
    。//这个地方你写了什么代码???
      oe:=iis.Value;
      for i:=1 to 10 do
        j:=oe[i];//出错
      

  4.   

    我彻底修改了代码,中间什么也不做,就是不行
    var
      spg:ISharedPropertyGroup;
      iis:IsharedProperty;
      exists:wordbool;
      oe:olevariant;
      i,j:integer;
    begin
      checkcallersec('manager');
      try
        spg:=CreateSharedPropertyGroup('Delphi Data');
        if spg=nil then
          raise Exception.Create('Can not Creat Shared Property Group');
      except
        setabort;
      end;
      iis:=spg.CreateProperty('iis',exists);
      oe:=vararraycreate([1,10],varInteger);
      for i:=1 to 10 do
        oe[i]:=0;
      iis.Value:=oe;
      ...  ... //这地方其实还什么都没写那,打算以后写上,应该不影响
      oe:=iis.Value;
       for i:=1 to 10 do
          j:=oe[i];
      
    eastphoenix(红苹果)的方法我试了
    可惜出来的不再是原来的数
      

  5.   

    有没有测试
    iis.Value:=vararraycreate([1,10],varInteger);
    然后循环赋值~
    取的时候进行反操作
      

  6.   

    我自己解决了,用的是eastphoenix(红苹果)的方法,不过要改一下,就是在用move过程的时候不要使用指针,而是直接写变量
    谢谢大家的关注