可选的匿名方法
我想公开一个可以采用可选匿名方法的函数:
type
TParamsProc = reference to procedure(Params: TSQLParams);
TFieldsProc = reference to procedure(Fields: TSQLResult);
TDbController = class
...
public
procedure Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
end;
implementation
procedure TDbController.Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
var
Q: TUIBQuery;
begin
Q := TUIBQuery.Create(nil);
try
Q.Database := FDatabase;
Q.Transaction := FTransaction;
Q.SQL.Text := SQL;
ParamsProc(Q.Params);
Q.Open;
while not Q.Eof do
begin
FieldsProc(Q.Result);
Q.Next;
end;
finally
Q.Free;
end;
end;
由于有时我没有参数可传递给 SQL 查询,因此我希望将 ParamsProc 设为可选。
此代码不起作用:
if ParamsProc <> nil then ParamsProc(Q.Params);
也不是这个:
if @ParamsProc <> nil then ParamsProc(Q.Params);
第一个代码无法编译,第二个代码可以编译但不起作用,因为 ParamsProc 始终具有非零值。
调用示例:
FController.Select(
'select A, B, C from SOME_TABLE',
nil,
procedure(Fields: TSQLResult)
begin
FA := Fields.AsInteger[0];
FB := Fields.AsString[1];
FC := Fields.AsCurrency[2];
end
);
Edit
似乎Assigned(ParamsProc)
可以解决问题。
I would like to expose a function that can take an optional anonymous method :
type
TParamsProc = reference to procedure(Params: TSQLParams);
TFieldsProc = reference to procedure(Fields: TSQLResult);
TDbController = class
...
public
procedure Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
end;
implementation
procedure TDbController.Select(const SQL: sting; ParamsProc: TParamsProc; FieldsProc: TFieldsProc);
var
Q: TUIBQuery;
begin
Q := TUIBQuery.Create(nil);
try
Q.Database := FDatabase;
Q.Transaction := FTransaction;
Q.SQL.Text := SQL;
ParamsProc(Q.Params);
Q.Open;
while not Q.Eof do
begin
FieldsProc(Q.Result);
Q.Next;
end;
finally
Q.Free;
end;
end;
As sometimes I have no params to pass to a SQL Query, I would like to make the ParamsProc optional.
this code don't work :
if ParamsProc <> nil then ParamsProc(Q.Params);
nor this one :
if @ParamsProc <> nil then ParamsProc(Q.Params);
The first one don't compile, the second one compile but don't work because ParamsProc has always a non nil value.
Example of call :
FController.Select(
'select A, B, C from SOME_TABLE',
nil,
procedure(Fields: TSQLResult)
begin
FA := Fields.AsInteger[0];
FB := Fields.AsString[1];
FC := Fields.AsCurrency[2];
end
);
Edit
Seems that Assigned(ParamsProc)
do the trick.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据 Jeroen Pluimers 的建议,我将“编辑”设置为“答案”:
Assigned(ParamsProc)
解决这个问题:希望这会有所帮助!
Following Jeroen Pluimers advice, I make my "Edit" an "Answer" :
Assigned(ParamsProc)
do the trick :Hope this helps !