2011-05-02 71 views
7

我想暴露,可以采取一个可选的匿名方法的功能:可选的匿名方法

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; 

,因为有时候我没有PARAMS传递到一个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)做的伎俩。

+4

@ZeDelaye让你编辑一个答案(如果可能的话:带样本源),然后你可以接受答案,人们可​​以投票。我会投票,因为这是一个很好的解决方案,对于那些Delphi文档很差的地区。 – 2011-05-02 19:31:59

回答

1

继吉荣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; 

希望这有助于!