可选匿名方法

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;

有时候我没有参数需要传递给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)能解决问题。


4
请将此编辑提交为答案(如可能,请提供示例源代码),然后您可以接受该答案,人们可以投票支持。我会投票,因为这是一个解决Delphi文档“不足”的好方案。 - Jeroen Wiert Pluimers
1个回答

1
根据Jeroen Pluimers的建议,我将我的“编辑”改为“答案”:

Assigned(ParamsProc)就可以解决问题:

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;
    if Assigned(ParamsProc) then
      ParamsProc(Q.Params);
    Q.Open;
    while not Q.Eof do
    begin
      FieldsProc(Q.Result);
      Q.Next;
    end;
  finally
    Q.Free;
  end;
end;

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接