none
Modificar controles del formulario desde un .cpp RRS feed

  • Pregunta

  • Primero situo un poco la situación:

    Tengo el Visual C++ 2008 Express, creo un nuevo proyecto CLR > Aplicación de Windows Form. Le pongo nombre al proyecto "formulario".
    Se crea el archivo formulario.cpp y justo debajo del main le agrego una funcion que lo unico que modifica es el titulo del Form1.
    void modificarText(){
           Form1->Text = "Nuevo titulo";
    }
    Intento generar la solucion (hará lo mismo que hace por defecto, ya que la funcion que he creado no es llamada aún desde ningún sitio) y me da el siguiente error:

    .\formulario.cpp(23) : error C2143: error de sintaxis : falta ';' delante de '->'

    .\formulario.cpp(23) : error C2143: error de sintaxis : falta ';' delante de '->'

    También probé de los siguientes modos:

    void modificarText(){
           Form1::Text = "Nuevo titulo";
    }

    error C2597: referencia no válida a miembro no static 'System::Windows::Forms::Form::Text'

    void modificarText(){
           Form1.Text = "Nuevo titulo";
    }

    .\formulario.cpp(23) : error C2143: error de sintaxis : falta ';' delante de '.'

    .\formulario.cpp(23) : error C2143: error de sintaxis : falta ';' delante de '.'

    No se donde falla la cosa ya que el formulario.cpp tiene un #include "Form1.h". Como se modifican los controles del Form1 desde un cpp?

    PD: Si pongo la funcion en el "Form1.h" funciona, aunque tengo que sustituir Form1->Text por this->Text.

    jueves, 9 de abril de 2009 18:02

Respuestas

Todas las respuestas

  • mira,
    coloca la funcion modificartext dentro de la clase Form1 y lugar de llamar Form1.Text, utiliza this.Text




    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    viernes, 10 de abril de 2009 3:36
    Moderador
  • Si, ahi si que me funciona. El problema es que quiero incluir un numero elevado de funciones y moduladas en varios archivos. Copiarlas y pegarlas ahi todas seria un poco caos xD!

    Muchas gracias por responder!!
    viernes, 10 de abril de 2009 3:38
  • entiendo, entonces cambia el codigo inicial por algo asi:

    	WForms::Form1^ forma1 = gcnew WForms::Form1();
    	forma1->Text = "MiTexto jajajaja";
    	// Create the main window and run it
    	Application::Run(forma1);



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    viernes, 10 de abril de 2009 3:41
    Moderador
  • Si, la funcion que puse unicamente de ejemplo, no la utilizo. Tengo un programa en consola que lo que hace es, mediante sockets, conecta a un servidor. Yo quiero modificar, ejemplo, text de textbox o listbox.. dependiendo de la informacion que vaya entrando o saliendo. Por eso cambiar el valor inicial no me vale.

    Encontre una solucion posible y es pasar por parametro el control a modificar, pero tendria que modificar casi todas las funciones ya que se llaman una a otra en cadena. Me interesa tan solo añadir unas pocas lineas a unas funciones.
    Pensé en declarar un puntero global que apuntase a por ejemplo el objeto a modificar, pienso que esta solución será mas efectiva. Intente declarar un puntero global de la siguiente forma:

    System::Windows::Forms::TextBox * ptextBox1;

    y cuando se creara el textBox1 en la clase del form correspondiente (Form1) pues hacer que el ptextBox1 apuntase al objeto textBox1. Pero me daba error al declararlo. ¿Como podria declarar ese puntero?
    viernes, 10 de abril de 2009 3:47
  • System::Windows::Forms::TextBox^ ptextBox1;


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    viernes, 10 de abril de 2009 3:50
    Moderador
  • esa linea de codigo la situo en Form1.h fuera de la clase Form1 y me salta el siguiente error:

    error C3145: 'ptextBox1' : la variable global o estática no puede tener el tipo administrado 'System::Windows::Forms::TextBox ^'
            no puede declarar una variable global o estática, o un miembro de un tipo nativo que hace referencia a objetos del montón gc
    viernes, 10 de abril de 2009 3:55
  • y sino esta dentro de la clase Form1 en que clase la dejaste... no puede quedar flotando asi nada mas...

    wow si que tienes preguntas, porfa no olvides marcarlas todas como respuesta.


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    viernes, 10 de abril de 2009 3:57
    Moderador
  • es una variable global, comun a todas las funciones y clases. por ejemplo en el mismo sitio puedo declarar cualquier variable de tipo int, char... pero esa que pusiste nop =(!

    es que llevo unos dias buscando solucion y no encuentro nada por ningun lado!
    viernes, 10 de abril de 2009 4:01
  • precisamente eso no lo puedes hacer en un entorno administrado...

    create una clase estatica y dentro de ella almacena todas las referencias 'globales'



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    viernes, 10 de abril de 2009 4:12
    Moderador
  • Lo cual es exactamente lo mismo que te respondi más arriba...
    entiendo, entonces cambia el codigo inicial por algo asi:

    	WForms::Form1^ forma1 = gcnew WForms::Form1();
    	forma1->Text = "MiTexto jajajaja"
    ;
    	// Create the main window and run it
    
    	Application::Run(forma1);
    



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    sábado, 11 de abril de 2009 4:26
    Moderador
  • cierto, ya decia que me sonaba. Pero antes de postear no probe una cosa y es que al crearla dentro del main, no se puede utilizar desde otra funcion que no sea main ya que queda fuera de alcance. Tienes que crear el form en una clase estatica, y en aplicacion::run(nombreClaseEstatica.nombreForm);

    He probado de la siguiente manera pero me marca error:
    static value class refGlobal{
    public:
    static Form1 ^formu = gcnew Form1();
    };
    y en el main:
    Application::Run(refGlobal::formu);
    
    sábado, 11 de abril de 2009 4:29
  • Claro, pero eso tambien ya te lo habia dicho... :S

    precisamente eso no lo puedes hacer en un entorno administrado...

    create una clase estatica y dentro de ella almacena todas las referencias 'globales'






    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    sábado, 11 de abril de 2009 4:39
    Moderador
  • ya lo consegui hacer funcionar xD!

    ref class puntero{
    	public:
    		static Form1 ^formu;
    };


    y en el main:

    refGlobal::formu = gcnew Form1();
    Application::Run(refGlobal::formu);


    Exactamente, es como tú decias. Muchisimas gracias por tu tiempo!!
    sábado, 11 de abril de 2009 4:40
  • coloca el código completo por favor....

    o enviamelo por email

    juankpunto ruizarroba gmailpunto com

    lo revisare mañana, mientras me voy a dormir.


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    sábado, 11 de abril de 2009 4:49
    Moderador