7
我想暴露,可以采取一个可选的匿名方法的功能:可选的匿名方法
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;
,因为有时候我没有PARAMS传递到一个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
);
编辑
似乎Assigned(ParamsProc)
做的伎俩。
@ZeDelaye让你编辑一个答案(如果可能的话:带样本源),然后你可以接受答案,人们可以投票。我会投票,因为这是一个很好的解决方案,对于那些Delphi文档很差的地区。 – 2011-05-02 19:31:59