2011-05-02 15 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; 

के रूप में कभी कभी मैं एक एसक्यूएल क्वेरी को पारित करने के लिए कोई पैरामीटर है, मैं 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 आपके संपादन को उत्तर दें (यदि संभव हो: नमूना स्रोत के साथ), तो आप उत्तर स्वीकार कर सकते हैं, और लोग इसके लिए मतदान कर सकते हैं। मैं वोट दूंगा, क्योंकि यह उस क्षेत्र के लिए एक अच्छा समाधान है जिसके डेल्फी दस्तावेज 'गरीब' है। –

उत्तर

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; 

आशा इस मदद करता है!

संबंधित मुद्दे