delphi - 可选的匿名方法

标签 delphi delphi-2010 anonymous-methods

我想公开一个可以采用可选匿名方法的函数:

    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
      );

编辑

似乎Assigned(ParamsProc) 可以解决问题。

最佳答案

根据 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;

希望这有帮助!

关于delphi - 可选的匿名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5856249/

相关文章:

delphi - 使用特定字符集修剪字符串

delphi - 将文件添加到 DPR 文件与 Delphi 2010 中的项目路径

c# - 匿名委托(delegate) - 使用对象集合搜索属性

c# - 在闭包中访问 'self' 对象

ios - 当我尝试在 iOS 上运行时,Delphi 说我缺少一个文件

delphi - 自动生成和自动递增内部版本号有什么区别?

delphi - AOP 和 DI : How to create an aspect-aware interfaced dependency-injected object?

delphi - 通过新 RTTI 处理索引属性时遇到问题 [D2010]

delphi - 创建进程并获取句柄

c# - 在 C# 中将匿名方法/函数作为参数传递