【发布时间】:2011-08-16 21:47:58
【问题描述】:
我想公开一个可以采用可选匿名方法的函数:
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 始终具有非 nil 值。
调用示例:
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
);
编辑
看来Assigned(ParamsProc) 可以解决问题。
【问题讨论】:
-
@ZeDelaye 让您的编辑成为答案(如果可能:使用示例源),然后您可以接受答案,人们可以投票给它。我会投票,因为对于 Delphi 文档“差”的领域来说,这是一个很好的解决方案。
标签: delphi delphi-2010 anonymous-methods