Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2004
sergio_015 sergio_015 is offline
Miembro
 
Registrado: jul 2003
Ubicación: Aguascalientes, Ags.
Posts: 46
Poder: 0
sergio_015 Va por buen camino
Manejar Componetes

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
__________________
Sergio Esquivel Arredondo
T.S.U. Informatica
Responder Con Cita
  #2  
Antiguo 24-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Utilizando FindComponent puedes obtener un componente a partir de su nombre; En la ayuda de Delphi tienes el siguiente ejemplo:

Código Delphi [-]
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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 24-11-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Aquí tienes otro ejemplo:
Código Delphi [-]
 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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 24-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 24-11-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Cita:
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 24-11-2004
sergio_015 sergio_015 is offline
Miembro
 
Registrado: jul 2003
Ubicación: Aguascalientes, Ags.
Posts: 46
Poder: 0
sergio_015 Va por buen camino
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????
__________________
Sergio Esquivel Arredondo
T.S.U. Informatica
Responder Con Cita
  #7  
Antiguo 24-11-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #8  
Antiguo 24-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En el ejemplo de Marcos no requieres conocer el nombre de la componente. No sé cuál sea el problema.

// Saludos
Responder Con Cita
  #9  
Antiguo 24-11-2004
sergio_015 sergio_015 is offline
Miembro
 
Registrado: jul 2003
Ubicación: Aguascalientes, Ags.
Posts: 46
Poder: 0
sergio_015 Va por buen camino
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
__________________
Sergio Esquivel Arredondo
T.S.U. Informatica
Responder Con Cita
  #10  
Antiguo 24-11-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #11  
Antiguo 24-11-2004
sergio_015 sergio_015 is offline
Miembro
 
Registrado: jul 2003
Ubicación: Aguascalientes, Ags.
Posts: 46
Poder: 0
sergio_015 Va por buen camino
ok, intentare realizarlo, gracias por la yuda
__________________
Sergio Esquivel Arredondo
T.S.U. Informatica
Responder Con Cita
  #12  
Antiguo 25-11-2004
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola

Cita:
Empezado por sergio_015
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 ). Siguiendo el ejemplo que te puso Marcos (con la corrección de Román ):

Código Delphi [-]
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
__________________
Guía de Estilo

Última edición por andres1569 fecha: 25-11-2004 a las 09:53:59.
Responder Con Cita
  #13  
Antiguo 25-11-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
puedes hacer un array de TShapes al principio para evitar hacer un for i to component.count cada vez que quieras recorrer los shapes.
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:30:26.


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
Copyright 1996-2007 Club Delphi