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.
@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'. –