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