请教如何直接写Variant数组的数据 
  
我要实现这样的一个函数:{
  输入一个元素为Variant的一维数组 (调用者确保)
  输出一个元素为Variant的一维数组,但在数组的首部插入一个字符串类型的Variant
}
function BuildResult(
        aVarArray: Variant       
  ): Variant;
var
  I, L, H, ElmtCnt: Integer;
begin
  L := VarArrayLowBound(aVarArray);
  H := VarArrayHighBound(aVarArray);  
  ElmtCnt := H - L + 1;  Result := VarArrayCreate([0..ElmtCnt], varVariant);  Result[0] := 'MySignature';
  for I := L to H do
    Result[I-L+1] := aVarArray[I];
end;上面的函数中,主要是当ElmtCnt比较大的时候
A[I+1] := aVarArray[I];
这一句执行的总开销比较大,因此我想优化一下它,于是我想到VarArrayLock
我想请教一下这种情况下,我可以用VarArrayLock吗,怎么做才能利用VarArrayLock?
  
下面的代码应该怎样完成?
{
  输入一个元素为Variant的一维数组 (调用者确保)
  输出一个元素为Variant的一维数组,但在数组的首部插入一个字符串类型的Variant
}
function BuildResult2(
        aVarArray: Variant       
  ): Variant;
var
  L, H, ElmtCnt: Integer;
  PSource, PResult: ? //这个应该是什么结构呢?
begin
  H := VarArrayHighBound(aVarArray);  
  L := VarArrayLowBound(aVarArray);
  ElmtCnt := H - L + 1;  Result := VarArrayCreate([0..ElmtCnt], varVariant);    {$O-}
  PResult := nil;
  {$O+}  Result[0] := 'MySignature';
  PSource := VarArrayLock(aVarArray);
  try
    PResult := VarArrayLock(Result);
  
    //???
    //怎样将aResultArray的内容快速复制到Result中?
    //???
  finally
    VarArrayUnlock(aVarArray);
    if PResult <> nil then
      VarArrayUnlock(Result);
  end;
end;有答案了,一定加多100分,谢谢

解决方案 »

  1.   

    要快就不用Variant,如果是调用外部程序必须用的话,用的时候再转换。
      

  2.   

    PSource, PResult: ? //这个应该是什么结构呢?就定义variant就可以了
      

  3.   

    var
       A: Variant;
       i:integer;
    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]);
      for i:=0 to 3 do
       memo1.Lines.Add(string(a[i]));
      for i:=0 to 3 do
      begin
        memo1.Lines.Add(string(a[4][i]));
      end;
    end;
      

  4.   

    function BuildResult2(
            aVarArray: Variant
      ): Variant;
    begin
      Result := VarArrayCreate([0,1], varVariant);
      Result[0] := 'MySignature';
      result[1]:=aVarArray;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      A,B: Variant;
      i,j,iH,iL,jH,jL:integer;
    begin
      A := VarArrayCreate([0, 3], varVariant);
      A[0] := 1;
      A[1] := 1234.5678;
      A[2] := 'Hello world';
      A[3] := True;
      B:=BuildResult2(A);
      Memo1.Lines.Clear;
      iL:=VarArrayLowBound(B,1);
      iH:=VarArrayHighBound(B,1);
      for i:=iL to iH do
      begin
       Memo1.Lines.Add(inttostr(i));
       if varisArray(B[i]) then
       begin
         for j:=0 to 3 do
         begin
           Memo1.Lines.Add(string(B[i][j]));
         end;   end
       else
         Memo1.Lines.Add(string(B[i]));
      end;end;
    我的结果反回来了
      

  5.   

    谢谢,但是,我这里有个要求就是function BuildResult2(
            aVarArray: Variant
      ): Variant;
    的返回值必须是一个一维的Variant的数组,
    并且每一个数组元素都不能又是一个数组比如,输入aVarArray为
    [1.5, 'ABc', 'def']
    那么结果应该为
    ['MySignature', 1.5, 'ABc', 'def']