Enumerar, recorrer, listar objetos de un TFMXObject | Puro Delphi

Cursos, artículos, noticias y herramientas Delphi VCL (Visual Component Library) / FMX (Firemonkey)

Enumerar, recorrer, listar objetos de un TFMXObject

FireMonkey-MediumCuando de FireMonkey se trata y se quieren recorrer objetos que se encuentran dentro de un contenedor nuestra tendencia es utilizar el típico:

Eso está bien si recorrer los componentes de ese panel, llamado Panel1, fuera lo único que queremos recorrer, pero, ¿Si queremos recorrer los objetos de otro contenedor, como por ejemplo un TForm, un TTabControl o incluso otro TPanel distinto llamado Panel2?, es más en FireMonkey podemos hacer que cualquier control sea el Parent de cualquier otro. Por ejemplo, un TLabel podría tener un TLayout dentro.

Entonces, ¿Cómo recorrerlo?, la primera vez que me planteé este asunto he creado un ClassHelper a la clase TFMXObject, aprovechando su propiedad Children que corresponde a la lista de objetos asociados, quedando así:

Para utilizarlo (Suponiendo que quiero buscar el primer TLabel que hay dentro de un TTabControl e imprimir en pantalla una señal de victoria), bastaba con hacer algo como lo siguiente:

Pero esto me mostraría el mensaje de “victoria” para cada TLabel encontrado, no solamente para el primero, que es lo que realmente necesito, así que tocaría poner una especie de contador, jugar con el break; o alguna otra cosa que determine que el ShowMessage se ejecute únicamente la primera vez.

Estaba pensando precisamente en una solución para dicho planteamiento cuando encontré por Twitter un interesante artículo donde muestran que ya FMX trae la solución al respecto y es precisamente a partir de la clase TFMXObject, logrando solucionar el problema que he planteado anteriormente, con el método EnumObject, el cuál se utilizaría de la siguiente manera para el caso mencionado del TLabel:

Como se puede notar, en lugar de un TProc<TFMXObject>EnumObjects implementa un TFunc<TFMXObject>:TEnumProcResult, entregandonos así el manejo sobre si debe continuar o no explorando el objeto en cuestión (En este caso el TabControl1).

TEnumProcResult tiene los siguientes posibles valores:

Valor Descripción
Continue Es el valor a fijar si queremos que continúe explorando el objeto
Stop Es el valor a fijar si queremos que pare de explorar el objeto
Discard Es el valor a fijar si queremos que ignore el actual contenido pero que salte al siguiente

Y bueno, eso es todo por ahora, espero les sirva de algo, si tienen dudas, sugerencias, comentarios… no duden en escribir, hasta luego.

 


Escriba un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

  • RSS

  • Categorías

  • Nube de etiquetas

  • Usuario