Delphi trik 6: generické anonymní metody

vložil Radek Červinka 17. května 2020 22:30

V novějších Delphi, nejméně XE3 - hlouběji jsem se nedíval, je v jednotce System.SysUtils definováno pár generických a zaroveň anonymních metod.

// Generic Anonymous method declarations
type
  TProc = reference to procedure;
  TProc<T> = reference to procedure (Arg1: T);
  TProc<T1,T2> = reference to procedure (Arg1: T1; Arg2: T2);
  TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
  TProc<T1,T2,T3,T4> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);

  TFunc<TResult> = reference to function: TResult;
  TFunc<T,TResult> = reference to function (Arg1: T): TResult;
  TFunc<T1,T2,TResult> = reference to function (Arg1: T1; Arg2: T2): TResult;
  TFunc<T1,T2,T3,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3): TResult;
  TFunc<T1,T2,T3,T4,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4): TResult;

  TPredicate<T> = reference to function (Arg1: T): Boolean;

Na co to je? Jedno z použítí je třeba opakovaná funkce, která se liší jen v jedné části, takže tu jednu část jen předáme jako anonymní metodu (v ukázce Browse, která má jako druhý parametr právě generickou funkci s dvěma parametry).

procedure TForm19.Browse(q: TDataset; pLine: TProc<Integer, TField>);
var
  x: Integer;
  oField: TField;
begin
  x := 1;
  oField := q.FieldByName('Name');
  while not q.Eof do
  begin
    pLine(x, oField);
    q.Next;
    inc(x);
  end;

end;

procedure TForm19.Button1Click(Sender: TObject);
begin
  Browse(FDQuery1,
    procedure (Line: Integer; Field:TField)
    begin
      memo1.Lines.Add(Format('%d: %s', [Line, Field.AsString]));
    end
    );

  Browse(FDQuery2,
    procedure (Line: Integer; Field:TField)
    begin
      log.Lines.Add(Format('%d: %s', [Line, Field.AsString]));
    end
    );
end;

No a když už jsem v tom, tak další využití anonymních metod je třeba při vývoji pro FMX, kdy hodně asynchronních dialogů používá stejný přístup, např.

TInputCloseDialogProc = reference to procedure(const AResult: TModalResult);


TDialogService = class
…
 class procedure ShowMessage(const AMessage: string; const ACloseDialogProc: TInputCloseDialogProc);
…

Tagy:

trik

Komentáře

4.6.2020 18:17:47 #

Peter

Ešte by som zdôraznil, že takto deklarované referencie nepoužívajú const sémantiku parametrov, čo môže byť nevýhoda, ak typ parametra je manažovaný typ (string, interface, ...). Viď https://web.archive.org/web/20180315101054/https://plus.google.com/108264621339439827681/posts/W2Yejv9Heji

Peter

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců