声明和初始化 TVarRec(const 数组)参数

Declaring and initializing TVarRec (array of const) params

我想定义一个可以在 TClientDataSet SetRange 方法中进一步使用的 var 或 const:

var
  lRangeStart : array of TVarRec;
  lRangeEnd   : array of TVarRec;

procedure SetRange;
begin

   SetLength (lRangeStart, 2);
   SetLength (lRangeEnd  , 2);

  lRangeStart [0] := Field1; // Incompatible types tVarRect and Integer
  lRangeStart [1] := Field2; // Incompatible types tVarRect and Integer
  lRangeEnd   [0] := Field1; // Incompatible types tVarRect and Integer
  lRangeEnd   [1] := Field2; // Incompatible types tVarRect and Integer

   MyDataSet.SetRange (lRangeStart, lRangeEnd);

end;

这不是它的工作方式。您以不同方式创建数组:

MyDataSet.SetRange([Field1, Field2], [Field1, Field2]);

编译器负责为您生成各种 TVarRec 记录。

如果索引中的列属于不同类型,您也可以使用混合类型:

MyDataSet.SetRange([1, 'Testing'], [1, 'Testing']);

要改为使用用户输入,只需将用户输入分配给变量,进行任何必要的类型转换,然后传入变量。

var
  Val1, Val2: Integer;
begin
  Val1 := StrToInt(Edit1.Text);
  Val2 := StrToInt(Edit2.Text);
  MyDataSet.SetRange([Val1, Val2], [Val1, Val2]);
end;

或者,您可以在线进行转换,但由于无效类型导致的异常是一个问题:

MyDataSet.SetRange([StrToInt(Edit1.Text), StrToInt(Edit2.Text)],
                    StrToInt(Edit1.Text), StrToInt(Edit2.Text)]);

为了自己这样做,您必须明确地分配给每个元素的适当类型(这违背了使用 const 数组的大部分目的,即能够在- 加入你的代码并混合类型):

SetLength(lRangeStart, 2);
lRangeStart[0].vInteger := 1;
lRangeStart[1].vInteger := 2;