FMX.Controls.TControl.EnumControls
Delphi
procedure EnumControls(const Proc: TFunc<TControl, TEnumControlsResult>); overload;
function EnumControls(Proc: TEnumControlsRef; const VisibleOnly: Boolean = True): Boolean; overload;
C++
void __fastcall EnumControls(const System::DelphiInterface<System::Sysutils::TFunc__2<TControl*,Fmx::Types::TEnumProcResult> > Proc)/* overload */;
bool __fastcall EnumControls _DEPRECATED_ATTRIBUTE1("Use another version of EnumControls") (_di_TEnumControlsRef Proc, const bool VisibleOnly = true)/* overload */;
Contents
Properties
| Type | Visibility | Source | Unit | Parent | 
|---|---|---|---|---|
| procedure function | public | FMX.Controls.pas FMX.Controls.hpp | FMX.Controls | TControl | 
Description
Loops through the controls that are children of this control, and runs the specified procedure once per control, with a different control as the first parameter in each call.
- Warning: EnumControls is deprecated as a function. You should use it as a procedure instead. This page describes the syntax and use of the EnumControls procedure.
EnumControls loops not only through direct children of this control, but also through their children (grand-children), and so on, using a depth-first search algorithm.
Each time EnumControls visits a control during the search, it executes the Proc procedure. This procedure receives the visited control as argument, and it returns a value of type TEnumControlsResult. The return value defines what EnumControls does next. You may return any of the following values:
- Continue lets EnumControls keep searching the controls as usual.
- Discard makes the search skip the children of the current control (the control in the first parameter), as well as their children (grand-children) and so on.
- Stop interrupts the search loop. If EnumControls were a language-level control loop, Stop would be the Break keyword.
Example
The following is an example call to EnumControls that loops through the children of a panel (Panel1) and fills a list (ListOfVisibleControls) with all the controls that are visible:
In Delphi:
Panel1.EnumControls(function (Control: TControl): TEnumControlsResult
  begin
    if not Control.Visible then
      Result := TEnumControlsResult.Discard
    else
      begin
        ListOfVisibleControls.Add(Control);
        Result := TEnumControlsResult.Continue;
      end;
  end);
In C++:
- 1. Define a class that implements the TFunc__2 interface:
class TMethodReference : public TCppInterfacedObject<TFunc__2<TControl*,TEnumControlsResult> >
{
public:
    TEnumControlsResult __fastcall Invoke(TControl* Control)
    {
        if (!Control->Visible)
            return TEnumControlsResult::Discard;
        else {
            TForm2::ListOfVisibleControls->Add(Control);
            return TEnumControlsResult::Continue;
        }
    }
};
- 2. Then pass an instance of this class to EnumControls:
Panel1->EnumControls(new TMethodReference);