我想定义一个var或const,我可以在TClientDataSet SetRange方法中进一步使用:
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;
答案 0 :(得分:2)
这不是它的工作方式。您以不同方式创建数组:
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;