具有可变参数的函数
Function with Variant Parameter
我创建了一个函数来刷新带有参数的查询,然后找到一个特定的字段。
function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
当 AValue 为整数时它起作用,当我将其更改为 Variant
我得到一个列表索引越界 1699364 错误。
函数本身如下所示:
function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
var AfterOpen,AfterScroll,BeforeOpen : TDataSetNotifyEvent;
AList : TStringList;
i : integer;
begin
result:=false;
AfterOpen := AQuery.AfterOpen;
AfterScroll := AQuery.AfterScroll;
BeforeOpen := AQuery.BeforeOpen;
AQuery.AfterOpen:=nil;
AQuery.AfterScroll:=nil;
AQuery.BeforeOpen:=nil;
AList := TStringList.Create;
AList.Delimiter:=';';
AList.DelimitedText:=AParam;
if AQuery.Active then AQuery.Close;
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
else
for i := 0 to AList.Count-1 do
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue[i];
AQuery.Open;
if not AQuery.Locate(AField, AValue, []) then
result:=false
else
result:=true;
AQuery.AfterOpen:=AfterOpen;
AQuery.AfterScroll:=AfterScroll;
AQuery.BeforeOpen:=BeforeOpen;
if Assigned(AQuery.AfterScroll) then
AQuery.AfterScroll(AQuery);
AList.Free;
end;
我是这样用的:
if RefreshQuery(CityQuery,'id',CityQueryID.Value,'Active',not(CheckBox1.Checked).ToInteger+2) = false then
begin
MessageDlg('blabla!',mtWarning, [mbOK], 0);
Exit;
end;
在上面的例子中 CityQueryID.Value 是整数类型。但有时我想使用 String 。所以我想更改函数以使用变体。
错误发生是因为在语句
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
你还没有给 i
赋值,因为它是一个局部变量,它会有一个随机值,这取决于调用 RefreshQuery
之前堆栈上的内容。
将语句更改为
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[0]).Value:=AParamValue
应该可以解决问题。
完成后,您应该会发现可以毫无问题地将 AValue
的参数类型更改为 variant
。
我创建了一个函数来刷新带有参数的查询,然后找到一个特定的字段。
function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
当 AValue 为整数时它起作用,当我将其更改为 Variant
我得到一个列表索引越界 1699364 错误。
函数本身如下所示:
function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
var AfterOpen,AfterScroll,BeforeOpen : TDataSetNotifyEvent;
AList : TStringList;
i : integer;
begin
result:=false;
AfterOpen := AQuery.AfterOpen;
AfterScroll := AQuery.AfterScroll;
BeforeOpen := AQuery.BeforeOpen;
AQuery.AfterOpen:=nil;
AQuery.AfterScroll:=nil;
AQuery.BeforeOpen:=nil;
AList := TStringList.Create;
AList.Delimiter:=';';
AList.DelimitedText:=AParam;
if AQuery.Active then AQuery.Close;
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
else
for i := 0 to AList.Count-1 do
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue[i];
AQuery.Open;
if not AQuery.Locate(AField, AValue, []) then
result:=false
else
result:=true;
AQuery.AfterOpen:=AfterOpen;
AQuery.AfterScroll:=AfterScroll;
AQuery.BeforeOpen:=BeforeOpen;
if Assigned(AQuery.AfterScroll) then
AQuery.AfterScroll(AQuery);
AList.Free;
end;
我是这样用的:
if RefreshQuery(CityQuery,'id',CityQueryID.Value,'Active',not(CheckBox1.Checked).ToInteger+2) = false then
begin
MessageDlg('blabla!',mtWarning, [mbOK], 0);
Exit;
end;
在上面的例子中 CityQueryID.Value 是整数类型。但有时我想使用 String 。所以我想更改函数以使用变体。
错误发生是因为在语句
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
你还没有给 i
赋值,因为它是一个局部变量,它会有一个随机值,这取决于调用 RefreshQuery
之前堆栈上的内容。
将语句更改为
if AList.Count = 1 then
AQuery.Parameters.ParamByName(AList[0]).Value:=AParamValue
应该可以解决问题。
完成后,您应该会发现可以毫无问题地将 AValue
的参数类型更改为 variant
。