PDA

Ver la Versión Completa : Cambiar la propiedad Caption de etiquetas TLabels en runtime mediante bucle for.


Yugo
04-09-2014, 20:21:11
Hola a todos, os pongo en situación. Resulta que tengo en un Form 13 etiquetas (Label1..Label13) donde la propiedad Caption es la que trae por defecto (p.ej. "Label1"). Básicamente lo que trato de hacer es cambiar dicha propiedad Caption de cada una de las 13 etiquetas en tiempo de ejecución mediante el uso de un bucle for de la siguiente manera:

for(int x = 1; x <= 13; x++)
{
//Labelx->Caption = "Propiedad Caption cambiada a la etiqueta "+IntToStr(x);
}Gracias por vuestro tiempo!! Un saludo.

ecfisa
04-09-2014, 20:29:22
Hola Yugo.

Ejemplo:

{
TLabel *LB = NULL;

for(int i=0; i<ComponentCount; i++) {
if(LB = static_cast<TLabel*>(FindComponent("Label"+IntToStr(i))));
LB->Caption = "Nuevo valor" + IntToStr(i);
}
}


Saludos :)

Yugo
04-09-2014, 21:30:04
{
TLabel *LB=NULL;

for(int i=0; i<ComponentCount; i++)
{
if(LB = static_cast<TLabel*>(FindComponent("Label"+IntToStr(i))));
LB->Caption = "Nuevo valor" + IntToStr(i);
}
}Fenómeno ecfisa!! funciona correctamente. Sólo una cosita, al compilar me salta un mensaje de precaución en la línea que marco en negrita:

"[C++ Warning] Unit1.cpp(23): W8060 Possibly incorrect assignment"

Por otro lado, hay algo que no entiendo. La variable ComponentCount del bucle for, ¿contiene el número de componentes que posee nuestro Form? Porque de ser así, al tener también un botón en el Form y cuente como un componente más para la propiedad ComponentCount del Form, ¿puede ser que la precaución que salte sea por este motivo, ya que el bucle for se ejecutaría una vez más de lo que realmente haría falta?

ecfisa
04-09-2014, 21:42:45
Hola Yugo.

...
Sólo una cosita, al compilar me salta un mensaje de precaución en la línea que marco en negrita:

"[C++ Warning] Unit1.cpp(23): W8060 Possibly incorrect assignment"

Tenes razón, mejor de este modo:

{
TComponent *CP=NULL;

for(int i=0; i<ComponentCount; i++) {
CP = FindComponent("Label" + IntToStr(i));
if (CP != NULL && CP->ClassNameIs("TLabel"))
(static_cast<TLabel*>(CP))->Caption = "Nuevo valor" + IntToStr(i);
}
}

Escribí el código del mensaje anterior sin probarlo :o, disculpame.

Saludos :)

Yugo
04-09-2014, 21:58:34
Bueno pues dicho mensaje de precaución desaparece al realizar la siguiente asignación !=0 a la condición if por si el puntero cast falla:

if( (LB = static_cast<TLabel*>(FindComponent("Label"+IntToStr(i)))) !=0 );

Pero sigo sin tener claro la forma en que se recorre el bucle for, por la condición interpuesta en el mismo dada por ComponentCount.

ecfisa
04-09-2014, 22:02:51
Hola Yugo.

Seguramente no viste mi último mensaje mientras escribias el tuyo. Usa el código que figura en ese ya que el anterior no es seguro, por que asigna en la comparación sin que aún se sepa si es un TLabel.

Saludos :)

Yugo
04-09-2014, 22:45:12
Cierto ecfisa, justo tras enviar mi último mensaje vi tu respuesta, gracias.

He estado revisando un poco tu código, que funciona igualmente muy bien...
{
TComponent *CP=NULL;

for(int i=0; i<ComponentCount; i++) {
CP = FindComponent("Label" + IntToStr(i));
if (CP != NULL)
(static_cast<TLabel*>(CP))->Caption = "Nuevo valor" + IntToStr(i);
}
}

y analizándolo un poco me hago a la idea de que consiste básicamente en recorrer todos y cada uno de los componentes que tenga nuestro Form, es decir, si tengo 50 componentes y de ellos sólo hay por ejemplo 5 TLabels, se harán 50 iteraciones comprobando si existen los Label1, Label2, Label3,...,Label50. Y cuando haya un encuentro, entonces cambia la propiedad Caption. ¿Estoy en la cierto? Porque veo que si por ejemplo la etiqueta Label4 no existe en el Form, entonces el puntero CP sigue apuntando a NULL y salta de nuevo a la siguiente iteración del bucle for.

Otra cosa ecfisa, al inicializar la variable i del bucle for a i=0, también podríamos haberla inicializado a i=1 cuando el nombre de la primera etiqueta es Label1. ¿No?

Por cierto, no tengo nada que disculparte, te agradezco muchísimo tu ayuda.

ecfisa
04-09-2014, 22:54:30
Hola Yugo.

...
Otra cosa ecfisa, al inicializar la variable i del bucle for a i=0, también podríamos haberla inicializado a i=1 cuando el nombre de la primera etiqueta es Label1. ¿No?

En realidad el índice de la propiedad vectorial Components tiene un rango que va de cero a ComponentCount-1, es decir que si lo que deseas buscar es "Label1" en adelante, es mejor acostumbrarse a hacer:

for(int i=0; i<ComponentCount; i++) {
CP = FindComponent("Label" + IntToStr(i+1));


Justo en este ejemplo (usando FindComponent) no importa si hacemos:

for(int i=1; i<=ComponentCount; i++)


Pero fijate que en este caso:

{
for(int i=1; i<=ComponentCount; i++)
if (Components[i]->ClassNameIs("TLabel"))
(static_cast<TLabel*>(Components[i]))->Color = clRed;
}

obtendríamos un error de índice fuera de rango...


Saludos :)

Yugo
04-09-2014, 23:04:30
Muchas gracias por la aclaración ecfisa. Por lo demás creo que entendí tu código. Un saludo!!