Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ejecutar propiedad comun a varios componentes

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ejecutar propiedad comun a varios componentes Responder citando

Buenas

El caso es que tengo varios Componentes del mismo tipo a los que he denominado de la forma:

TComponent1
TComponent2
TComponent3
.......
TComponent40

Segun la eleccion del usuario se ejecuta un metodo "CambiarCaption" en la que se llama a un procedimiento propio del Componente (la mima llamada para cada componente)


CambiarCaption()
{
TComponent1->Procedimiento();
TComponent2->Procedimiento();
TComponent3->Procedimiento();
.............................
TComponent40->Procedimiento();

}

Mi pregunta es la siguiente: Al ser el procedimiento a ejecutar igual para todos los
Componentes seria posible Evitar la tediosa operacion de ir enumerando uno a uno todos los componentes con su respectiva llamada y hacerlo de una manera mas comoda


Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si tengo por ejemplo tres botones que van a hacer lo misma función, en la llamada del OnClick pongo en los tres la de un Button1Click. No sé si es esto lo que dices.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

No lo he hecho nunca pero creo que deberias crear un objeto de nombre (name) TComponente y luego hacer un bucle para los n componentes. finalemnte llamar al procedimiento a partir de este objeto.
_________________
Be water my friend.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En primer Lugar Gracias por responderme

La solucion de botonClick la uso para otro tipo de problemas.

En este caso seria diferente : Se supone que pulso por ejemplo un Boton
y esta accion hara que otro grupo de componentes (todos de la misma clase)
deberan modificar una de sus propiedades accediendo a uno no de sus metodos

Supongamos

void __fastcall TForm1::Button1Click(TObject *Sender)
{

ModificarPropiedades();
}


void ModificarPropiedades()
{

TComponent1->Modificar();
TComponent2->Modificar();
TComponent3->Modificar();
........................ .....
TComponent40->Modificar();
}


Espero Haberme Explicado Bien

Gracias OtraVez.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Cita:
Se supone que pulso por ejemplo un Boton
y esta accion hara que otro grupo de componentes (todos de la misma clase)
deberan modificar una de sus propiedades accediendo a uno no de sus metodos

Hola neg1414. Prueba con este código. He supuesto varios componentes de tipo TLabel en los que la propiedad que se modifica es el Caption de cada uno de ellos.
Código:
 void __fastcall TForm1::Button1Click(TObject *Sender)
{

  TLabel* Etiqueta;
  for (int i = 0; i <= Form1->ComponentCount; i++)
       {
         Etiqueta = (TLabel *)FindComponent("Label" + (AnsiString)i);
         Etiqueta->Caption = "Loquesea" + (AnsiString)i;

        }

}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdón por el despiste:
inicia el bucle con i=1 y termínalo con i<ComponentCount
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por contestar .

La solucion funciona perfectamente si en el Contenedor (Form) los componentes son todos del mismo tipo (TLabel) . El problema surge si hay otros componentes (Que tambien evalua) que no son TLABEL.

Se te ocurre algo

Yo He probado con

Ansistring NombreComponent;
int i=1;

NombreComponente = "TLabel" + IntToStr(i);

for (int j=0;i<Contenedor>ControlCount);j++)
{
If (Contenedor->Controls[j]->Name ==Nombre)
{
TLabel(Contenedor->Controls[j]).Metodo();
i++; Nombre = "TLabel" + IntToStr(i);
}
}


Compila perfectamente y al ejecutar incluso ccede al Metodo()
de cada TLAbel.
El problema radica en que a la hora de la verdad no se han realizado
los cambios Propuestos en Metodo().

Me huelo que el problema radica en la instrucion:

TLabel(Contenedor->Controls[j]).Metodo();

que deberia ser :

TLabel(Contenedor->Controls[j])->Metodo();

pero no compila.

Se te ocurre algo


Gracias otra Vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Que es realmente lo que necesitas ? Cambiar por ejemplo la propiedad "Caption" a todos los controles que la tengan sin importar el tipo ? Algo así por ejemplo:
Código:
//Añadimos: #include <typinfo.hpp>
for (int i = 0; i < ControlCount; i++)
{
    TControl* control = static_cast<TControl*>(Controls[i]);
    if (IsPublishedProp(control, "Caption"))
    {
        SetPropValue(control, "Caption",
            "texto que podriamos leer de un array o un ini por ejemplo");
    }
}

Es que te veo empeñado en llamar a un método miembro de esos controles para cambiar alguna propiedad y no entiendo bien porque necesitas que sea así. Son controles creados por ti que tienen ese método miembro ? o intentas hacerlo con los controles estándar ? ..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por contestar

Haber si me explico desde el principio

He creado un
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por contestar

Haber si me explico desde el principio

He creado un Componente VCL deriva de la clase ( tcustumControl)
Este componente contiene un Metodo que entre otras accciones, cambia el aspecto del componente (Accede al metodo Paint()).
El caso es que he colocado unos 40 componentes de esa clase en TPanel
.Cuando el ususario selecciona una opcion todos esos componentes variaran de la misma forma accediendo al Metodo anterior mente citado.

Esta accion la puedo realizar a machon de la forma:

Componente1->MiMetodo()
Componente2->MiMetodo()
Componente3->MIMetodo()
.....................................
Componente40->MIMetodo()


!! TEDIOSA TAREA !!


Mediante el codigo siguiente

Ansistring NombreComponent;
int i=1;

NombreComponente = "Micomponente" + IntToStr(i);

for (int j=0;i<Contenedor>ControlCount);j++)
{
If (Contenedor->Controls[j]->Name ==Nombre)
{
TMicomponente(Contenedor->Controls[j]).Metodo();
i++; Nombre = "MiComponente" + IntToStr(i);
}
}

Accedo Tanto a los Componentes como al Metodo que deseo dentro de ellos, pero los cambios no se realizan (cambiar imagen.....)


Espero Haberme Explicado Bien Gracias OtraVez

posdata en El Contenedor (TPanel) Hay componentes de otras clases.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Supongo que el código de ejemplo que has puesto realmente no lo tienes así en tu programa sino que te has equivocado al teclear.. lo que resta un poco de claridad.

Prueba de una de estas dos maneras:

- Supongamos que el contenedor es un TPanel llamado Panel1. Usa este ejemplo si lo que quieres es que todos los controles de tipo TMiComponente contenidos en el llamen a ese método:
Código:
TWinControl* contenedor = Panel1;
for (int i = 0; i < contenedor->ControlCount; i++)
{
  TMiComponente* miComp = dynamic_cast<TMiComponente*>(contenedor->Controls[i]);
  if (miComp)
    miComp->Metodo();
}


- O usa este otro si lo que quieres es llamar a un rango conocido de componentes TMiComponente llamados MiComponente1, MiComponente2... (en el ejemplo iría desde MiComponente1 a MiComponente4):
Código:
for (int i = 1; i <= 4; i++)
{
  String nombreComp = "MiComponente" + IntToStr(i);
  TMiComponente* miComp = static_cast<TMiComponente*>(FindComponent(nombreComp));
  if (miComp)
    miComp->Metodo();
}


Tu error principal (los otros supongo que solo son al teclear el código aquí) está en la línea siguiente. En la que en realidad estas creando una nueva instancia, por eso no se refleja esta llamada en tu componente:

    TMicomponente(Contenedor->Controls[j]).Metodo();

Supongo que la confusión viene de algún ejemplo de Delphi, donde esta sintaxis se usa para hacer un casting (moldeado).
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias sencillamente Perfecto,
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.