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;
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;
是建2维数组,不是一维的。
类似:
funtion Var2DArrayCreate(const b1,b2:array of integer;
vartype:integer)
数组范围用SetLength()指定。
funtion Var2DArrayCreate(const bound1,bound2:array of integer;
vartype:integer): Array of Array of (SomeType)
如果函数能返回变类型的更好。
有没有那位有空指点一下。写个源代码出来。
table,stringgridprocedure TForm1.BitBtn1Click(Sender: TObject);
var
vData: array of array of Variant;
iFields,iRowCount,i,j:integer;
begin
iFields := tbl.FieldCount;
iRowCount := tbl.RecordCount;
stringgrid1.RowCount := iRowCount+1;
stringgrid1.ColCount := iFields+1;
SetLength(vData, iRowCount); // 设置第一维的长度
// 根据第一维的长度进行循环
tbl.first;
tbl.Prior;
for I := low(vData) to HIGH(vData) do
begin
tbl.Next;
SetLength(vData[I], iFields); // 设置第二维的长度
// 根据第二维的长度进行循环
for J := 0 to iFields-1 do
begin
Vdata[i][j]:=tbl.Fields[j].AsVariant;
end;
end; for i:= 0 to iRowCount-1 do
begin
for j:=0 to iFields-1 do
begin
stringgrid1.Cells[j+1,i+1] := vdata[i][j];
end;
end;
end;
vararraycreate([1,Row,1,col],varvariant)就可以了
//得到一个二维变体数组
function TfrmVariantArray.GetArray: Variant;
var
V: Variant;
I, J: integer;
begin
//建立多维用VarArrayCreate,一维可用VarArrayOf
V := VarArrayCreate([0, 5, 0, 5], varInteger);
for I := 0 to 5 do
for J := 0 to 5 do
V[I, J] := I * J;
Result := V;
end;//显示Variant数组的信息
procedure TfrmVariantArray.ShowInfo(V: Variant);
var
I, DimCount: integer;
strMsg: string;
begin
strMsg := '';
//得到Variant数组的维数
DimCount := VarArrayDimCount(V);
strMsg := #13 + 'DimCount: ' + IntToStr(DimCount) + #13;
for I := 1 to DimCount do
begin
//VarArrayHighBound(V,I)得到I维的上限
strMsg := strMsg + 'HighBound: ' + IntToStr(VarArrayHighBound(V, I)) + #13;
//VarArrayLowBound(V,I)得到I维的下限
strMsg := strMsg + 'LowBound: ' + IntToStr(VarArrayLowBound(V, I)) + #13;
end;
ShowMessage(strMsg);
end;procedure TfrmVariantArray.btnNormalArrayyClick(Sender: TObject);
var
I, J: integer;
V: Variant;
begin
V := GetArray;
ShowInfo(V);
for I := VarArrayLowBound(V, 1) to VarArrayHighBound(V, 1) do
for J := VarArrayLowBound(V, 2) to VarArrayHighBound(V, 2) do
StringGrid1.Cells[I, J] := V[I, J];
//可以直接赋值
end;procedure TfrmVariantArray.btnLockedArrayClick(Sender: TObject);
type
TIntArray = array[0..5, 0..5] of integer;
var
V: Variant;
I, J:integer;
Data: ^TIntArray;
begin
V := GetArray;
ClearGrid;
//Variant数组是消耗相当数量的系统开销。若要迅速处理数组,可以使用两个函数:
//VarArrayLock、VarArrayUnLock。VarArrayLock返回一个标准Pasacal数组
//注意该数组必须用一个标准数组清楚进行申明,(Integer,Bool,String等)
Data := VarArrayLock(V);
for I := 0 to 5 do
for J := 0 to 5 do
begin
StringGrid1.Cells[I, J] := IntToStr(Data[I, J]);
Data[I, J]) := Data[I, J]) * 2;
end;
//别忘了Unlock,否则要产生异常噢!
VarArrayUnlock(V);
end;最后没说得就是VarArrayRedim。用途吗?见名知其意...