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 

Modificar la propiedad de un componente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Modificar la propiedad de un componente Responder citando

Hola a todos.

Necesito consejo. Vamos a ver, necesito acceder a cierto componente (debo de leer de un fichero el componente que es) y cambiarle la propiedad Caption.

Dicho de otra forma, en un fichero de texto tengo por ejemplo:
LabeledEdit1=Directorio

Entonces debo acceder al componente LabeledEdit1 y en la propiedad Caption debo poner "Directorio".

Esto dicho asi es muy simple:
Código:

LabeledEdit1->Caption="Directorio";


El problema esta en que el compomente solo lo se en tiempo de ejecucion y no en modo diseño.

El componente lo puedo buscar de la siguiente forma:
Código:

for (int c=0;c<ComponentCount; c++)
{
    if (Components[c]->Name=="LabeledEdit1";
    {
//   ....  aqui debo cambiarlo
    }
}

Y aqui me surge la duda. Como accedo al componente. ¿Me entendeis?

Bueno haber si me podeis orientar. Un saludito y gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

lo que quieres es cambiar el "Caption" de un Label a mitad ejecucion??
_________________
Saludetes
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Correcto.

Pero sin saber a priori que componente es. Pueder un Label, un GroupBox, un MainMenu, etc.

Como digo, el componente a modificar solo lo se mitad de ejecucion. De ahi el problema.

Un saludito.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Uff...
Ni idea... Lo siento...
_________________
Saludetes
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues asi como lo estas busacando es la manera de Acceder a el
Código:


if (Components[c]->Name=="LabeledEdit1";
    {
TControl * obj;
obj= (TControl *)Components[c]; // creas un acceso a el
obj->Caption = "lo que quieras"; // lo modificas
}


Espero te sirva saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Cesar por tu respuesta, pero ...

[C++ Error] Unit1.cpp(188): E2247 'TControl::Caption' is not accessible

Un saludito.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si estas usando BCB6, una forma de hacerlo:

Código:
//#include <typinfo.hpp>
for (int i=0; i < ControlCount; i++)
{
    TControl* control = Controls[i];
    if (control->Name == "LabeledEdit1")
    {
        if (IsPublishedProp(control, "Caption"))
            SetPropValue(control, "Caption", "Esto es una prueba");
    }
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo.

Lo acabo de probar y funciona. Lo que pasa es para aquellas propiedades en las cuales el "Caption" es una propiedad no es problema (caso Label, etc) pero para aquellas en las cuales el "Caption" es una subpropiedad no lo coge (caso del LabeledEdit. El "caption" esta dentro de la propiedad EditLabel).

Label1->Caption"lo que sea";
LabeledEdit1->EditLabel->Caption="lo que sea";

¿Hay alguna forma de recorrer las distintas subpropiedades buscando una propiedad concreta?. Por que asi, si podria modificar en estos casos.

Gracias nuevamente y un saludito
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

O pasarle:

AnsiString valor;
valor="LabeledEdit1->EditLabel->Caption";

Y que busque entre las propiedades este 'valor'. De esta forma se podria ir directamente a la propiedad a modificar.

De esta forma es mejor. Porque por ejemplo en el caso de un TMainMenu, pueden haber varios Caption, y ahi podrian haber problemas.

Lo mismo ocurriria en el caso de un StatusBar. Pero en este caso no hay caption sino text.

StatusBar1->Panels->Items[0]->Text="lo que sea";

De ahi la necesidad de pasarle este 'valor'.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Esto funciona, aunque habría que probarlo mejor:

Código:
for (int i=0; i < ControlCount; i++)
{
    TComponent* comp = Components[i];
    if (comp->Name == "LabeledEdit1")
    {
        if (IsPublishedProp(comp, "Caption"))
            SetPropValue(comp, "Caption", "Esto es una prueba");
        else
        {
            // Buscamos entre los subcomponentes, si los tiene,
            //   el primero que tenga la propiedad "Caption"
            for (int j=0; j < comp->ComponentCount; j++)
            {
                TComponent* subComp = comp->Components[j];
                if (IsPublishedProp(subComp, "Caption"))
                {
                    SetPropValue(subComp, "Caption", "Esto es una prueba");
                    break;
                }
            }
        }
    }
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Me refiero a que funciona para la pregunta anterior, la última la acabo de ver después de responder.

Si necesitas que actúe para propiedades con nombres diferentes según el componente, como una barra de estado, lo que puedes hacer es comprobar que clase es o si quieres hacerlo un poco mas global, de que componente deriva.
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.