PDA

Ver la Versión Completa : Funcion para leer compomentes


emeritos
18-05-2018, 09:08:23
Buenas dilferos.

¿ Existe alguna funcion, procedimiento... que pueda leer todos los nombres de los compomentes visuales que existan en un From?

Gracias.

newtron
18-05-2018, 09:34:40
Hola, mira a ver si esto es lo que necesitas.


procedure TForm1.Button1Click(Sender: TObject);
var
N: SmallInt;
begin
for N := 0 to ComponentCount - 1 do begin
ShowMessage(Components[N].Name);
end;

end;


Saludos

emeritos
18-05-2018, 10:56:16
Gracias me sirve, pero como puedo leer dentro de ese componente sus propiedades como por ejemplo Height.

Lo que estoy intentando hacer es una funcion donde lo se paso los nombres de los componentes visuales y el me pueda leer y cambiar algunas propiedades. Lo hago para cuando se cambia la resolucion poder adaptar el from a el (No encuentro un procedimiento ya realizado para que al cambiar la resolucion o las dimensiones del from en tiempo de ejecucion pueda adaptarlo automaticamente).


Gracias.

newtron
18-05-2018, 12:45:45
Hola de nuevo.

A ver si esto te sirviera:


procedure TForm1.Button1Click(Sender: TObject);
var
N: SmallInt;
begin
for N := 0 to ComponentCount -1 do begin
if Components[N].Name = 'Edit1' then begin
(Components[N] as TEdit).width := 100;
end;
end;
end;


Igual que modificas las propiedades de un edit puedes cambiar las propiedades de cualquier control, incluido el formulario.

Saludos

Casimiro Notevi
18-05-2018, 13:27:24
Hola de nuevo.
A ver si esto te sirviera:

procedure TForm1.Button1Click(Sender: TObject);
var
N: SmallInt;
begin
for N := 0 to ComponentCount -1 do begin
if Components[N].Name = 'Edit1' then begin
(Components[N] as TEdit).width := 100;
end;
end;
end;
Igual que modificas las propiedades de un edit puedes cambiar las propiedades de cualquier control, incluido el formulario.
Saludos
Por seguridad, en lugar de comparar por el nombre, se debería comparar por el tipo/clase al que pertenece. En lugar de esto:

if Components[N].Name = 'Edit1' then begin
Mejor de esta forma:
if Components[N] is TEdit then begin
Si el "Edit1" es una TLabel, por ejemplo, se produciría un error "gordo".
No sé si todo el mundo nombra los componentes según su clase, pero es más seguro la opción que he citado, creo.

newtron
18-05-2018, 13:32:27
Por seguridad, en lugar de comparar por el nombre, se debería comparar por el tipo/clase al que pertenece. En lugar de esto:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)if Components[N].Name = 'Edit1' then begin

Mejor de esta forma:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)if Components[N] is TEdit then begin

Si el "Edit1" es una TLabel, por ejemplo, se produciría un error "gordo".
No sé si todo el mundo nombra los componentes según su clase, pero es más seguro la opción que he citado, creo.

En eso estamos de acuerdo pero entiendo que si buscas el componente por su nombre sabes a qué clase pertenece, ¿no?

:rolleyes:

Casimiro Notevi
18-05-2018, 13:40:41
En eso estamos de acuerdo pero entiendo que si buscas el componente por su nombre sabes a qué clase pertenece, ¿no?
:rolleyes:
Ummm... no :)

¿Cómo sabes que Edit1 es un TEdit?
Y si en lugar de Edit1 lo has nombrado: CodigoDelCliente ¿cómo sabes de qué clase es?
Incluso lo más habitual: edCodigoCliente, lbCodigoCliente, etc. ¿cómo sabes que el primero es un TEdit y el segundo un TLabel?
Y lo mismo para otros prefijos edtCodCli, lblCodCli, etc.

No existe un método fijo para nombrar los componentes, y por su nombre es imposible saber de qué tipo es.


Aunque lo mismo tengo la cabeza en otro sitio (que la tengo) y no me he dado cuenta de lo que dices :rolleyes:

newtron
18-05-2018, 14:03:07
¿Cómo sabes que Edit1 es un TEdit?



Hombre.... si yo que estoy creando un formulario incluyo un Edit al que llamo Edit1 ¿sé que es un edit? :confused::confused:

iMia
18-05-2018, 15:28:31
Tal y como lo plantea Casimiro, yo lo veo como mejor opción... Más abstracto, más genérico. más elegante, trasladable, reaprovechable, etc...
Por que si no no hace falta hacer un bucle que se recorra todos los objetos... con hacer n llamadas a FindComponent('Editn').With := x; ya estaría...


procedure TForm1.Button1Click(Sender: TObject);
var
N: SmallInt;
begin
for N := 0 to pred(ComponentCount) do
if (Components[N] is TEdit)
or (Components[N] is TMemo)
or .... then
(Components[N] as TWinControl).height := (Components[N] as TWinControl).height *2;
end;

Casimiro Notevi
18-05-2018, 15:34:31
Hombre.... si yo que estoy creando un formulario incluyo un Edit al que llamo Edit1 ¿sé que es un edit? :confused::confused:
Es que no todos tenemos costumbres de ese tipo, ya digo que he visto personas que nombra los componentes como codigocliente, telefonomovil, tarifamedia, etc. ¿y de qué tipo es cada uno? cualquiera sabe.

newtron
18-05-2018, 16:59:23
Cheeeeeeeeeeeeeeeeeeeeeeeee.... pues si que estoy tonto.


Si sabes el nombre del componente lo atacas directamente. :o

Casimiro Notevi
18-05-2018, 18:13:46
Si sabes el nombre del componente lo atacas directamente.Pues sí, tú sí que lo sabes, pero no suele ser buen método ese.
Cualquier día le cambias el nombre por cualquier motivo y deja de funcionar.

Pero, bueno, para un caso puntual como este puede servir perfectamente.

orodriguezca
19-05-2018, 14:39:30
Si sabes el nombre del componente lo atacas directamente. :o

Hay ocasiones en la que no sabes el nombre del componente porque el formulario se crea de forma dinámica, ya sea a partir de un archivo .ini o de una base de datos. En esos casos lo sensato es saber a que clase pertenece el componente para asignar valor a alguna de sus propiedades porque el nombre del componente simplemente no lo conoces.