[C con Clase] Necesito ayuda con el diseño de ventanas

Steven Davidson steven en conclase.net
Mar Mar 6 13:25:39 CET 2007


Hola Gaizka,

El pasado 2007-03-04 23:12:11, Gaizka escribió:

G> Antes que nada, queria decirles que soy muy nuevo al mundo de la programacion, asi que le pido disculpas si la pregunta es muy obvia. Estoy usando Microsoft Visual C++, tratando de diseñar una ventana. Actualmente contiene 1 comboBox con los elementos A,B y C; 2 textBox y 1 boton. Lo que intento hacer es, que para cada item del comboBox, aparezca un determinado valor en el textBox1, y que tras apretar el botón, aparezca ese mismo valor, multiplicado por 3 en el textBox2. Hasta ahora, lo que tengo es lo siguiente:

Veo que nadie te ha contestado. Me temo que no estoy familiarizado con los formularios de Windows, por lo que no te puedo dar una solución precisa, en estos momentos. Por lo que sé, los formularios de Windows forman parte de .NET y se asocian a los lenguajes de VB y C#. Es posible usar otros lenguajes como C++ pero éste sólo a través de las extensiones de Microsoft, dando el nombre de "C++ Gestionado" o en inglés "Managed C++".

Me temo que el código que nos muestras no es del todo correcto. Debes crear las clases con anterioridad a 'main()'. Sugiero seguir la siguiente estructura o "esqueleto" de programa:

#using <mscorlib.dll>
#using <System.DLL> 
#using <System.Windows.Forms.DLL> 

using namespace System;
using namespace System::Windows::Forms;


__gc class MiFormulario : public Form
{
private:
  // Escribir los datos miembros para esta clase

public:
  MiFormulario() : Form()
  {
    // Agregar código para realizar una sola vez al comienzo
  }
};


int main()
{
  Application::Run( new MiFormulario() );
  return 0;
}


Como tu formulario contiene controles, éstos serán definidos en la parte privada de tu clase 'MiFormulario'. Por ejemplo,

__gc class MiFormulario : public Form
{
private:
  ComboBox *comboBox1;
  TextBox *textBox1[2];
  Button *button1;
...
};


Mirando tu código, tienes algunos errores en tu función. Debería ser:

private:
  System::Void comboBox1_SelectedIndexChanged( System::Object    *sender,
                                               System::EventArgs *e )
{
  if( comboBox1-> SelectedIndex == 0 )
    textBox1->Text = S"10";
  else if( comboBox1-> SelectedIndex == 1 )
    textBox1->Text = S"20";
  else if( comboBox1-> SelectedIndex == 2 )
    textBox1->Text = S"30";
  else
    textBox1->Text = S"0";
}

Como puedes ver, estabas usando el operador = que es de asignación, en lugar del operador == de comprobación de igualación en las sentencias 'if'. También hemos de eliminar los puntos y comas después de la condición. El otro error está en los tipos de los parámetros. Bajo C++, debemos usar punteros; escribir el símbolo ^ es erróneo en este lugar. Por último, el nombre correcto es 'Text', y no 'text'.

Podríamos haber usado un 'switch/case', para aclarar un poco el código; esto es,

int nIndice = comboBox1-> SelectedIndex;

switch( nIndice )
{
  case 0:
    textBox1->Text = S"10";
    break;

  case 1:
    textBox1->Text = S"20";
    break;

  case 2:
    textBox1->Text = S"30";
    break;

  default:
    textBox1->Text = S"0";
}

Así nos ahorramos el tener que estar "pidiendo" el valor del índice en cada condición. Conseguimos el valor y lo comprobamos.

Para hacer la multiplicación, deberías hacerla al procesar el evento de pulsar el botón. Esto sería,

private:
  System::Void button1_Click( System::Object *sender, System::EventArgs *e )
  {
    int num = textBox1->Text->ToInt32();
    num *= 3;

    textBox2->Text = Convert::ToString( num );
  }

Como puedes observar, hemos usado la función miembro estática 'ToString()'. Con esta función podemos hacer varias conversiones según el tipo del parámetro. También puedes ver que hemos corregido algunos errores como por ejemplo,
1. 'Text' en lugar de 'text'
2. 'Text' es un puntero bajo MC++ (C++ Gestionado)
3. No existe 'ToInt()' para la clase 'String'. Tendrías que usar las funciones miembros estáticas 'ToInt16()', 'ToInt32()', o 'ToInt64()' bajo la clase 'Convert'.


Sinceramente, me parece que este proyecto exige demasiados conocimientos para alguien que no sepa C++ y en particular .NET, como para realizarlo exitosamente.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase