Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

In Delphi, an anonymous method is a procedure or function value declared with a reference to type. You can store it, pass it to another routine, or return it from a function. When it closes over a local variable, Delphi keeps that variable’s managed frame alive with the method reference—so the closure sees the variable, including later changes, rather than a frozen copy.

Define an anonymous method type and assign a function

Start by declaring the signature the callable value must match. The reference to syntax creates a managed method-reference type; it is not the same thing as a traditional procedure of object pointer.

type
  TIntToInt = reference to function(X: Integer): Integer;

var
  DoubleIt: TIntToInt;
begin
  DoubleIt := function(X: Integer): Integer
  begin
    Result := X * 2;
  end;
end;

Once assigned, DoubleIt can be invoked like a function. Anonymous methods are useful when a small piece of behavior belongs at its point of use, rather than needing a separately named routine.

Pass behavior into a function

A higher-order function accepts another function or procedure as an argument, or returns one. This lets one algorithm use different policies without creating a separate named method for each variation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
type
  TStringTransform = reference to function(const S: string): string;

function ApplyTransform(const S: string; F: TStringTransform): string;
begin
  Result := F(S);
end;

Callers can pass an anonymous method directly or store it in a variable of type TStringTransform before passing it. Embarcadero’s Anonymous Methods in Delphi documentation demonstrates the same pattern with a function parameter.

Return a closure that remembers a value

A function can return a method reference. In this example, MakeAdder returns a function that adds the value of Y to its argument:

type
  TFuncOfInt = reference to function(X: Integer): Integer;

function MakeAdder(Y: Integer): TFuncOfInt;
begin
  Result := function(X: Integer): Integer
  begin
    Result := X + Y;
  end;
end;

Conceptually, MakeAdder(20)(22) produces 42. The returned function remains able to access Y after MakeAdder has returned. The official documentation uses this closure pattern in its MakeAdder example.

Understand what a closure captures

Delphi captures variable storage from the defining scope, not an immutable snapshot of each variable’s value. If the outer variable changes while a method reference remains alive, invoking the anonymous method reads the changed variable.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Captured locals are kept in managed, heap-backed frame storage for as long as the anonymous-method reference needs them. The storage can be released when the last managed method reference is finalized. This lifetime support does not prevent reference cycles: if captured state directly or indirectly owns the anonymous method that captures it, the cycle can keep both alive and leak memory.

  • Capture only the state the callback needs; avoid capturing an object that also retains the callback unless you have a plan to break the ownership cycle.
  • If a closure reads or writes state shared with other code, reason about synchronization separately. Capturing a variable does not make concurrent access thread-safe.

Use anonymous methods in Delphi code

Parameterize a generic-list sort

A sorting routine can accept a comparison policy as a method reference, allowing the same sorting operation to order values differently. For a generic collection, define the callback signature required by the collection’s sort API and provide the comparison behavior as an anonymous method when that API accepts the corresponding method-reference type. Verify the exact signature in the documentation for your Delphi version and collection type.

Represent a callback or event

A property or API designed to hold a reference to type can use an anonymous method as its callback. This is convenient when the response is short and local to the registration site. It does not mean an anonymous method can be assigned to every Delphi event type: traditional events commonly use method-pointer types, which have different type and lifetime semantics.

Provide work to parallel operations

Parallel-library patterns can accept anonymous methods for operations such as Parallel For loops, tasks, and futures. The callback syntax can keep the work close to the operation that schedules it. If multiple workers access captured state, protect that state using an appropriate synchronization strategy; a closure is a way to package behavior, not a concurrency guarantee. The Embarcadero Academy Anonymous Methods in Delphi course includes sorting generic collections, threading, Parallel For, tasks, and futures.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Choose between a closure, a routine, and a method pointer

Choice Captures outer state? Lifetime model Best fit
Anonymous method (reference to) Yes Managed and reference-counted Inline policies, callbacks, closures, and higher-order utilities
Named routine No implicit closure capture Normal routine rules Reusable, discoverable business logic
Method pointer (procedure of object) No closure frame Unmanaged pointer semantics Traditional object events and stable method callbacks

Anonymous methods cannot be assigned to regular method-pointer types: Embarcadero documents method references as managed types and method pointers as unmanaged. Use the callback type the receiving API actually declares, rather than assuming the two forms are interchangeable.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Check compiler and platform support

RAD Studio’s language feature matrix lists anonymous methods/closures and generics as supported language and runtime features. That establishes current feature support, but it is not a complete version-by-version behavior or performance matrix. Check the target compiler and platform—especially when supporting multiple Delphi releases—before relying on identical behavior or performance across targets.

For a deeper language reference, Marco Cantù’s Object Pascal Handbook product page describes a 500-page ebook for Delphi 11 Alexandria. Its version label makes it a useful reference for that generation, not proof of every detail in later releases.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.