| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mie 05 Dic, 2007 3:46 pm Asunto: Ejecutar propiedad comun a varios componentes |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
best_guitar Lt


Registrado: 12 Nov 2005Mensajes: 92
|
Publicado: Mie 05 Dic, 2007 7:01 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 06 Dic, 2007 2:57 pm Asunto: |
|
|
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 |
|
 |
migro Cdt

Registrado: 19 Ago 2007Mensajes: 9Ubicación: Cádiz
|
Publicado: Sab 08 Dic, 2007 3:30 pm Asunto: |
|
|
| 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 |
|
 |
migro Cdt

Registrado: 19 Ago 2007Mensajes: 9Ubicación: Cádiz
|
Publicado: Sab 08 Dic, 2007 11:31 pm Asunto: |
|
|
Perdón por el despiste:
inicia el bucle con i=1 y termínalo con i<ComponentCount |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 09 Dic, 2007 12:11 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 09 Dic, 2007 1:43 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 09 Dic, 2007 3:16 pm Asunto: |
|
|
Gracias por contestar
Haber si me explico desde el principio
He creado un |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 09 Dic, 2007 3:27 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 09 Dic, 2007 4:05 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 09 Dic, 2007 5:08 pm Asunto: |
|
|
| Gracias sencillamente Perfecto, |
|
| Volver arriba |
|
 |
|