可选的匿名方法

发布于 2024-11-04 20:40:18 字数 1559 浏览 0 评论 0原文

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

    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月静好 2024-11-11 20:40:18

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

希望这会有所帮助!

Following Jeroen Pluimers advice, I make my "Edit" an "Answer" :

Assigned(ParamsProc) do the trick :

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;

Hope this helps !

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文