Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion para leer compomentes (https://www.clubdelphi.com/foros/showthread.php?t=93104)

emeritos 18-05-2018 09:08:23

Funcion para leer compomentes
 
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.

Código:

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:

Código:

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

Cita:

Empezado por newtron (Mensaje 526378)
Hola de nuevo.
A ver si esto te sirviera:
Código:

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:

Código Delphi [-]
if Components[N].Name =  'Edit1' then begin
Mejor de esta forma:
Código Delphi [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 526380)
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 [-]if Components[N].Name = 'Edit1' then begin

Mejor de esta forma:
Código Delphi [-]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

Cita:

Empezado por newtron (Mensaje 526381)
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

Cita:

Empezado por Casimiro Notevi (Mensaje 526382)
¿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...

Código:

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

Cita:

Empezado por newtron (Mensaje 526383)
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

Cita:

Empezado por newtron (Mensaje 526392)
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

Cita:

Empezado por newtron (Mensaje 526392)
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.


La franja horaria es GMT +2. Ahora son las 06:44:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi