Optional Anonymous Method

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.

7
задан Robert Love 3 May 2011 в 13:52
поделиться