Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-09-2014
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
Cambiar la propiedad Caption de etiquetas TLabels en runtime mediante bucle for.

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:

Código:
 for(int x = 1; x <= 13; x++)
 {
    //Labelx->Caption = "Propiedad Caption cambiada a la etiqueta "+IntToStr(x);
 }
Gracias por vuestro tiempo!! Un saludo.
Responder Con Cita
  #2  
Antiguo 04-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Yugo.

Ejemplo:
Código:
{
   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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-09-2014 a las 20:36:22.
Responder Con Cita
  #3  
Antiguo 04-09-2014
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
Código:
    {    
       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?
Responder Con Cita
  #4  
Antiguo 04-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Yugo.
Cita:
Empezado por Yugo Ver Mensaje
...
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:
Código:
{
  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 , disculpame.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-09-2014 a las 22:33:09.
Responder Con Cita
  #5  
Antiguo 04-09-2014
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
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:

Código:
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.
Responder Con Cita
  #6  
Antiguo 04-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 04-09-2014
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
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...
Código:
{
  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.
Responder Con Cita
  #8  
Antiguo 04-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Yugo.
Cita:
Empezado por Yugo Ver Mensaje
...
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:
Código:
  for(int i=0; i<ComponentCount; i++) {
    CP = FindComponent("Label" + IntToStr(i+1));
Justo en este ejemplo (usando FindComponent) no importa si hacemos:
Código:
  for(int i=1; i<=ComponentCount; i++)
Pero fijate que en este caso:
Código:
{
  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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-09-2014 a las 23:06:09.
Responder Con Cita
  #9  
Antiguo 04-09-2014
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
Muchas gracias por la aclaración ecfisa. Por lo demás creo que entendí tu código. Un saludo!!
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
propiedad caption lucas05 Varios 10 25-08-2010 19:51:51
Cambiar caption componentes capo979 Varios 2 22-07-2008 09:04:23
Problema con propiedad TRadioButton.Checked en Runtime vejerf OOP 4 06-06-2008 17:09:44
Cambiar Caption Caral Varios 13 08-02-2008 14:22:13
¿Cómo hago para que la propiedad Caption de un botón tenga múltiples líneas? kakarotv5 Varios 9 25-05-2007 15:29:10


La franja horaria es GMT +2. Ahora son las 01:14:35.


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