2011-05-02 8 views
7

me gustaría exponer una función que puede tener un método anónimo opcional:Opcional Anónimo Método

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; 

Como a veces no tengo params para pasar a una consulta SQL, me gustaría hacer el ParamsProc opcional.

este código no funcionan:

 if ParamsProc <> nil then ParamsProc(Q.Params); 

ni éste:

 if @ParamsProc <> nil then ParamsProc(Q.Params); 

El primero no compile, la segunda compilación, pero no funcionan porque siempre tiene ParamsProc un valor no nulo.

Ejemplo de llamada:

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

Editar

Parece que Assigned(ParamsProc) hacer el truco.

+4

@ZeDelaye haga su edición una respuesta (de ser posible: con fuente de muestra), entonces puede aceptar la respuesta, y la gente puede votar por ella. Yo votaría, ya que es una buena solución para un área en la que la documentación de Delphi es 'pobre'. –

Respuesta

1

Siguiendo el consejo Jeroen Pluimers, hago mi "Editar" una "respuesta":

Assigned(ParamsProc) hacer el truco:

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; 

Espero que esto ayude!

Cuestiones relacionadas