PDA

Ver la Versión Completa : Manejar Componetes


sergio_015
24-11-2004, 17:55:13
Q tal, quisiera saber como puedo mandar llamar un objeto por medio de una variable, lo q pasa es que tengo alrededor de 200 shapes, lo q necesito es llamar de uno por uno para asignarle al color del objeto un valor, lo que quiero es evitar llamar uno por uno, en vez de hacer esto:

Shape1.brush.Color:=clgreen;
Shape2.brush.Color:=clgreen;
Shape3.brush.Color:=clgreen;

y asi hasta llegar a 200 manejar una especie como esta

contador:=contador+1;
componente:='Shape'+contador;
componente.brush.color:=clgreen;

pero como declaro que "componente" es un Shape, no se si me entendi. agradeceria respuestas, lo hago asi porq el shape lo meto a un if, si cumple una condicion entonces q cambie de color

Neftali [Germán.Estévez]
24-11-2004, 18:18:04
Utilizando FindComponent puedes obtener un componente a partir de su nombre; En la ayuda de Delphi tienes el siguiente ejemplo:


var
i: Integer;
const
NamePrefix = 'MyEdit';
begin
for i := 1 to 20 dobegin
TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
begin
Left := 10;
Top := i * 20;
Parent := self;
end;
end;


Es casi idéntico al tuyo, simplemente que trabaja con TEdit, y la propiedad que modifica es otra, pero vamos es casi "pastado". Pruébalo y si tienes problemas ya dirás...

marcoszorrilla
24-11-2004, 18:29:12
Aquí tienes otro ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
Var
nConta:Integer;
begin
for nConta:=0 to form1.ComponentCount -1 do
begin
if form1.Components[nConta] is TShape then
begin
(Components[nConta] as TShape).brush.Color:=ClGreen;
end
end;
end;



Un Saludo.

roman
24-11-2004, 18:44:23
Recomiendo el método de Marcos ya que FindComponent usa él mismo un ciclo que recorre las componentes hasta encontrar una con el nombre indicado de manera que se estaráa repitiendo el mismo ciclo por cada iteración del ciclo for externo.

Lo único es que

(Components[nConta] as TShape).brush.Color:=ClGreen;

quedaría un poco mejor así:

TShape(Components[nConta]).brush.Color:=ClGreen;

ya que el operador as invlucra una llamada implícita al operador is innecesaria ya que se hace previamente.

// Saludos

marcoszorrilla
24-11-2004, 19:30:11
TShape(Components[nConta]).brush.Color:=ClGreen;
Realmente es lo que estaba buscando, pero estoy "in work time" y carente de soporte literario y no me salía, por lo que lo dejé como quedó, es decir regular.

Un Saludo.

sergio_015
24-11-2004, 20:16:58
muchas gracias, si funciono, solo por cuestiones de programacion tuve que cambiar el nombre del componente, Shape1 es NOMBRE10, shape2 es NOMBRE15, el nombre del componente es lo que quiero manejar, de hecho solo cambia el numero, ese numero es el que quiero enviar a la variable.

Es decir, los nombres del shape se conforma asi:
NOM1 (Shape1)
NOM5 (Shape2)
NOM6 (Shape3)
NOM7 (Shape4)

por lo cual shape2, no necesariamente es NOM2, es NOM5, como manipulo eso????

marcoszorrilla
24-11-2004, 20:23:26
Pues el ejemplo que yo puse y que oportunamente corrigio Román te sirve, porque no estamos tratando con el nombre del componente, que se puede llamar como tu quieras, sino que estamos buscando todos los componentes de una clase en este caso TShape y cada componente de esta clase que encontremos, independientemente de cual sea su nombre le cambiamos el color.


Un Saludo.

roman
24-11-2004, 20:24:28
En el ejemplo de Marcos no requieres conocer el nombre de la componente. No sé cuál sea el problema.

// Saludos

sergio_015
24-11-2004, 20:46:47
ok, disculpen, estoy de acuerdo con ustedes, solo falto mencionarles que no necesariamente tengo que aplicar la propiedad a todos, eso depende si cumple una condicion, es decir:

while comparar < 200 do
begin
if comparar=condicion then //Comparo si el numero es igual a una condicion
TShape(Components[comparar]).brush.Color:=ClGreen; { Si es igual entonces que cambie el shape con el numero de cuerdo a la variable comparar}
comparar:=comparar+1;
end;

O sea que si comparar=58 y cumple con la condicion entonces cambiara un shape, pero y el shape se llama NOM58 que coincidiria con el valor de comparar, un poco revoltoso pero es necesario :(, es por eso q aclaraba lo del nombre

marcoszorrilla
24-11-2004, 20:49:41
Sigo sin ver la relación, si además de recorrer todos los componentes y evaluar los del tipo TShape, le añadimos que cumplan cierta condición, tampoco tiene nada que ver el nombre que tengan en si la cumplen o no.

Antes de hacer el cambio bastará con aplicar un If.
If Condicion = True then
Lo_Que_sea;

Un Saludo.

sergio_015
24-11-2004, 21:40:55
ok, intentare realizarlo, gracias por la yuda

andres1569
25-11-2004, 09:50:21
Hola

O sea que si comparar=58 y cumple con la condicion entonces cambiara un shape, pero y el shape se llama NOM58 que coincidiria con el valor de comparar, un poco revoltoso pero es necesario :(, es por eso q aclaraba lo del nombre
Intuyo que aparte de comprobar si es un TShape, miras el número con que lo has nombrado (58 en el ejemplo) para ver si cumple cierta condición (digamos menor de 200 o algo así). Para no complicarte la vida dando nombres a todos los TShapes, incluso para agilizar las comparaciones, quizás te convenga hacer uso de la propiedad Tag, común a todos los descendientes de TComponent. Está pensada para cosas como estas, basta con que asignes (y de un tirón mediante el Object Inspector tras seleccionar los TShapes deseados) un número concreto (pongamos el 7) y ya tienes diferenciados los shapes, incluso puedes crear más categorías (... tantas como números alberga un tipo Integer :D :D ). Siguiendo el ejemplo que te puso Marcos (con la corrección de Román ;) ):

procedure TForm1.Button1Click(Sender: TObject);
Var
nConta : Integer;
AComponent : TComponent;
begin
for nConta:=0 to form1.ComponentCount -1 do
begin
AComponent := form1.Components[nConta];
if (AComponent is TShape) AND (AComponent.Tag = 7) then
TShape(AComponent).brush.Color := ClGreen;
end;
end;
En el ejemplo utilizo la variable AComponent para guardar el valor de form1.Components[nConta], para evitar llamar varias veces la misma propiedad Components[n], manías mías ;).

Saludos

ruina
25-11-2004, 11:01:47
puedes hacer un array de TShapes al principio para evitar hacer un for i to component.count cada vez que quieras recorrer los shapes.