[C/C++] Creación de un entorno de desarrollo

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

[C/C++] Creación de un entorno de desarrollo

Notapor AnimAlf » Vie Jun 19, 2009 2:39 am

Guardo un buen recuerdo de un foro en que iniciamos un compromiso, pero duró nada ... no recuerdo, pero cayó, y el JoveNadmin no nos dió explicaciones a un grupete .... pero sigo con las mismas intenciones ;-D (.xAk. AnimAlf)

Creación de un entorno de desarrollo en windows

Como me gusta mucho la programación en bash, instalaremos una shell en nuestro equipo. Para que cuando tengamos que escribir ordenes en el sistema, las escribamos desde esta ventana de ordenes. Los códigos que presente, serán creados, editados, desde la shell, para que no nos perdamos detalle y así ganemos agilidad en su manejo.

Presentaré un RAD (Rápido Desarrollo de Aplicaciones), y daré un ejemplo de su utilización. Para los que quieran seguir de este modo. Pero os aconsejo que trabajéis con el editor de línea de comandos que se instalará. vi. Os agilizará con el cursor y despierta la habilidad con estos temas. Crearé un proyecto para que se os hagan los dientes largos y veáis lo fácil que es realizar aplicaciones con ello.

Desde la shell podremos obtener mucha información del sistema y sistemas, que aunque no os parezca atractiva, su presentación, por tratarse de salida de caracteres, lo que cuenta es la información en sí. En la shell podremos ejecutar diferentes comandos además de algunos propios del entorno Unix, como vi, sed, cat, grep, ls ...

Como a muchos os han acostumbrado desde que veis dibujos en la pantalla y un ratón, el que parece indispensable para realizar cualquier acción con la máquina, pues he decido explicar los temas de programación desde línea de comandos. Estos os ayudará en el propósito que queréis conseguir.

Las aplicaciones, en el mundo Unix, desde siempre han sido pequeñas aplicaciones, estas aplicaciones se unen entre sí, para crear una aplicación mayor. Un caso claro se puede ver por ejemplo en los programas de Autoría de DVDs, en los que muchas pequeñas aplicaciones son unidas en una aplicación, que puede ser con interfaz, para ayudar al usuario.

La interfaz está muy bien, uno utiliza un conjunto, consigue lo que quiere conseguir y se despreocupa. Piensa lo he conseguido gracias al la aplicación X. Pero no sabe nada de las pequeñas aplicaciones.

Lo interesante es conocer el uso de esas pequeñas aplicaciones que trabajan desde la línea de comandos. Hay una razón. Los desarrolladores se especializan en una cosa, y los que no tienen que ver con el resultado que se le ofrece al usuario, sólo se preocupan de la efectividad de su aplicación. Lanzando la mínima información posible, sólo para orientar. Son las aplicaciones de consola. Encontraremos las mejoras en el desarrollo antes en las pequeñas aplicaciones que en aquellas que las utilizan para conseguir un objetivo.

wxDev-C++
El entorno gráfico de trabajo que os comenté antes, el RAD, será este: wxDev-C++ (que es del Dev C++ actual)

Lo descargamos de su sitio web y lo instalaremos

En la instalación vamos a tener en cuenta lo siguiente:

Nos preguntará por los compiladores que utilizaremos, nosotros le indicamos que sólo mingw.
Imagen

Seleccionaremos las diferentes opciones

Imagen

Esto es muy importante. Debemos instalarlo en un directorio cerca de la raíz. Le diremos que lo instale en C:/Dev-Cpp
Esto es importante para el otro programa que instalaremos, para que pueda localizar las rutas sin problema.

Imagen

vamos a probar ... ya veréis que fácil de entender que es ...

Este RAD hace que la programación orientada a objetos con C++ sea muy fácil de entender para quien por ejemplo sólo sabe C. Vamos a trabajar bajo un sistema de responder a un evento, y un evento puede ser cualquier acción que ocurra en el sistema, por ejemplo, el paso del tiempo, el movimiento del ratón, la pulsación de una tecla ...

Bien, pues aquí lo que haremos es diseñar nuestra interfaz gráfica. Podremos asignar todas las características visualmente, al igual que decidir delante de que eventos reaccionará. Y ese será todo el código que habrá que escribir, el código de respuesta. Ya que todo el resto lo escribirá el wxDev-C++ por nosotros.

En la aplicación de ejemplo para su uso, lo que haremos será crear una simple interfaz que al pulsar un botón nos muestre información del sistema, y si se vuelve a pulsar, termine su ejecución.

Vamos a ello. Lanzamos la aplicación. Pulsamos en el menú superior sobre Archivo -> Nuevo -> Proyecto con lo que se nos mostrará un asistente, en el que elegiremos que tipo de proyecto vamos a crear, y el nombre que le daremos. Elegimos wxWidgets Dialog y le damos un nombre al proyecto, el que queramos.

Imagen

Veremos que a continuación se nos abren un montón de pestañas y aparecen nuevas cosas en nuestra pantalla. Familiaricémonos un poco con ello. En la parte superior tenemos la barra de menús y los botones. En la parte derecha en vertical, tenemos los componentes que podemos añadir a nuestra ventana, con el ratón podemos decidir que dimensiones tendrán. En la izquierda podremos observar que en la parte superior tenemos el listado de archivos que forman nuestro proyecto, hay pestañas para por ejemplo ver la lista de clases. En la mitad inferior tenemos la ventana de propiedades. En esta os entretendréis un montón, ya que nos permite cambiar las propiedades a cada objeto, así como asignarle la respuesta a eventos. Si nos fijamos veremos la pestaña events. Bien, seleccionaremos el objeto que hayamos creado visualmente, y le cambiaremos sus características en este apartado, y asignaremos respuesta a eventos. Por ejemplo si tenemos un botón, y vamos a la pestaña eventos, veremos que al evento onClick si pulsamos el desplegable, nos muestra una lista de funciones (que ya existen en nuestra aplicación y pueden ser asignadas a Botón OnClick) y en primer lugar veremos <Add New Function>, si lo pulsamos, nos creará una nueva función que responderá a la pulsación del botón. Además nos desplazará a ella en el código, para que escribamos su contenido.

Bien, pues así de sencillo, va a ser realizar aplicaciones con el wxDev C++

Empezaremos cambiando el título de la ventana principal. Vamos a la ventana de propiedades y buscamos Title y le escribimos por ejemplo: Ventana de presentación --CHA--.

Ahora vamos a insertar unas cuantas StaticText en la ventana que tenemos. Veremos el icono en la columna de la parte derecha, pulsamos sobre ella, y después en la ventana que estamos diseñando, veremos que se nos crea una allí. La situamos en la parte superior nos servirá como título principal. Vamos a las propiedades buscamos Label y escribimos por ejemplo Presentación de wxDev C++ ahora vamos a cambiarle el estilo a la fuente, buscamos Font y nos mostrará el dialogo de fuentes en el que le podemos asignar un tamaño de 20 y el color Azul Marino, por ejemplo.

Bien, añadiremos más StaticText y una StaticBox, que os quede más o menos de esta forma:
Imagen

Como habéis visto en la imagen, también le añadiremos un Timer. ¡Hacerlo! es entretenido y fácil. Experimentar un poco con las propiedades que conocemos, asignando el nombre que queremos mostrar. Fijaros en los que tenéis en negrita para asignarlo en las opciones del tipo de letra font.

Vamos a variar unas pocas propiedades más a algunas etiquetas. Las que tenemos en negrita. Lo que haremos es decirle que este componente, no se autodimensione (se suelen autodimensionar para ajustarse al texto que contienen). Bien, pues en propiedades, buscamos Label Style y le asignamos las propiedades wxALIGN_RIGHT y wxST_NO_AUTORESIZE a true, para que alinee el texto dentro de la casilla a la derecha y que la casilla no cambie de tamaño.

Ahora cambiaremos las propiedades de otras StaticText. A estas les vamos a poner un fondo diferente y les asignaremos el marco, para conseguir un resultado visual ... DECORATIVO ... fijaros en la imagen que os presento a continuación. Tendréis que ir a propiedades y en General Styles establecer wxSTATIC_BORDER luego en Label Style asignar wxALIGN_CENTER y wxST_NO_AUTORESIZE y luego en Bacground Color le estableceremos el color con una interface.

Imagen

Bien, ya tenemos nuestro diseño. Vamos a por el código.

Cómo dije el wxDev C++ es un RAD (rapid application development + o - el ingles no es mi fuerte) y nos a escrito todo el código.

Personalmente suelo cambiarle el nombre a los objetos, para localizarlos con facilidad, ya que tenemos wxStaticText1, wxStaticText2, wxStaticText3, ... y es un lío saber cual es cada una. En propiedades Name, podéis establecer un nombre con aquellas con las que vais a trabajar, para facilitaros a vosotros mismos vuestro trabajo. Por ejemplo ya les he cambiado el nombre a lb_presentación, lb_nombreUsuario, lb_nombreSistema ... bueno, más o menos, no recuerdo. Supongo que se entiende lo que quiero decir, es mejor, para relacionarlos luego, cuando de un gran proyecto se trate.

Los nombres que les he puesto a las etiquetas de texto son los siguientes:
Código: Seleccionar todo
lb_hora
lb_fecha
lb_id_user
lb_id_sys
lb_home

Empecemos por el Timer. En las propiedades asignaremos AutoStart a true y en Interval le ponemos 1000 (que es un segundo). Este control lo que hace es activarse durante ese intervalo. Y ejecutar lo que tenga asignado en el evento OnTimer. Así que ahora nos vamos a la pestaña Events y desplegamos lo que hay al lado de OnTimer para seleccionar <Add New Function> veremos que nos lo crea y nos desplaza a su lugar en el código fuente, en donde escribiremos:
Código: Seleccionar todo
wxDateTime now = wxDateTime::Now();
lb_hora->SetLabel( wxT(now.Format(wxT("%X"))) );

dónde creo la variable now como wxDateTime y luego establezco el texto en la etiqueta hora. wxT() es una macro que utilizaremos en todas las cadenas de caracteres, es la forma en que se tratarán las cadenas. En lo que explique con vi ya lo veremos.

Con ello conseguimos que cada segundo escriba la hora.

Ahora, estando en esta pestaña donde se muestra el código del archivo cpp subimos un poco más arriba y buscamos la función CreateGUIControls para después del comentario ////GUI Items Creation End escribir nuestro código
Código: Seleccionar todo
  SetSize(8,8,461,126);
  WxButton1->Move(201, 62);
  marco->Show(false);
  lb_id->Show(false);
  lb_id_user->Show(false);
  wxDateTime now = wxDateTime::Now();
  lb_fecha->SetLabel( wxT(now.Format(wxT("%d %B %Y"))) );
  lb_id_user->SetLabel( wxT(wxGetUserName()) + wxT("@") + wxT(wxGetFullHostName()) );
  lb_id_sys->SetLabel( wxT(wxGetOsDescription()) );
  lb_homeDir->SetLabel( wxT(wxGetHomeDir()) );

Esta función crea los controles tras la creación de ventana contenedora. Lo que hago es redimensionar la ventana hacerla más pequeña, para ocultar los controles y sólo mostrar fecha y hora, muevo el botón más arriba, hago que la StaticBox y las dos etiquetas no sean visibles. Luego establezco el contenido de las etiquetas fecha, user, sys y home.

Ahora vamos ahora a asignar el comportamiento del botón
Código: Seleccionar todo
if ( marco->IsShown() ) {
  Close(true);
} else {
  marco->Show(true);
  lb_id->Show(true);
  lb_id_user->Show(true);
  SetSize(8,8,461,220);
  WxButton1->Move(201, 156);
  WxButton1->SetLabel( wxT("Terminar") );
}

Como antes le dije que la StaticBox no sea visible, lo que va a hacer primero es comprobar si es visible. Si lo es finalizará la aplicación. Si no lo es lo hará visible, así como las otras dos etiquetas, desplazará el botón a la parte inferior y le cambiará el nombre.

Comprobar su ejecución va a ser muy sencillo, para compilarlo, linkarlo y ejecutarlo pincharemos en el menú Ejecutar -> Compilar y Ejecutar

Imagen

YaXtA. A que es sencillo. Bien, pues nosotros, nos vamos a complicar la vida mejor, que esto de que lo den todo echo no gusta X'DD

-----------------------------------

Este sistema trabaja sobre Mingw, Mingw es un proyecto que se dedicó a portar muchas pequeñas aplicaciones Unix al entorno win32. Desde wxDev C++ dispondremos de un gestor de paquetes, que tienen que ver con ello. Podremos instalar muchas herramientas y librerías que después utilizaremos desde la shell, o librerías sobre las que programaremos.

Vamos a iniciarlo. Para ello en el wxDev C++ pulsamos sobre Herramientas -> actualizaciones no aparecerá el gestor de paquetes. En Select DevPak Server elegimos el segundo Dev-C++ primary devpak server y pulsamos sobre Check for Updates se nos llenará la lista. Aquí seleccionamos la segunda opción que nos aparece WebUpdate Mirrors list. Y pulsamos sobre Download Selected.

Con esto hemos actualizado los servidores de descarga.

Aquí si no fijamos veremos que podemos actualizar paquetes que ya tenemos instalados, como binutils, GNU Make Windows 32 API y MinGW Runtime, fijaros bien en las versiones no vayáis a hacer un downgrade en lugar de upgrade sobre algún paquete instalado.

Una vez seleccionados pulsamos Download Selected y se actualizarán.

Si ahora seleccionamos en DevPack server devpaks.org Community Devpaks veremos una gran lista de paquetes que se nos muestra. Podemos en ella actualizar el GNU Debugger e instalar Python (Algunos paquetes están repetidos, si uno no funciona funcionará el otro).

Imagen

-----------------------------------

Si tenéis intención de programa o buscar vulnerabilidades en un servidor web o en aplicaciones web, podéis instalaros XAMPP, nos instalará el servidor web Apache, php, mySql y perl, con lo que tendremos nuestro entorno web. Así que lo descargamos. La instalación es muy simple, sólo fijaros en lo siguiente:

Imagen

con lo que así nos instalará apache y mysql como servicios del sistema y se pondrán en marcha al inicio como servicios. Todo esto lo podremos modificar también luego en el panel de control, con la interfaz que nos ayuda para ello. También se nos colocará un icono en la barra de tareas para controlar los servidores. No os lo perdáis que es un proyecto, que parece muy majo, para entenderos con la base de datos y con los servicios web. Una vez instalado, podemos poner en el navegador:

http://localhost

y pasear un poco por todo lo que nos ofrece.

MYSYS (Minimal System)

Vamos a lo bueno y nos descargamos MSYS

Quiero que notéis una cosa, en entornos de trabajos, para separar directorios se utilizará esta barra inclinada / no la de windows \ así estaremos más cercanos a un entorno shell.

Se instalará en C:\msys\1.0

Al finalizar la instalación nos mostrará una ventana de comandos (cmd), en la que nos preguntará si queremos realizar el proceso de postinstalación en la que establecerá el vinculo con mingw (Minimal gcc compiler por windows). Pulsaremos y y return

Do you wish to continue with the post install? [yn ] y

Luego nos pregunta si lo tenemos instalado, le decimos que sí.

Do you have MinGW installed? [yn ] y

A continuación nos preguntará donde está instalado mingw, le diremos:

Where is your MinGW installation? C:/Dev-Cpp

y terminamos.

Nos metemos dentro del entorno con el icono que tenemos en el escritorio. Veréis que simplemente se abre una ventana con un prompt esperando nuestros comandos, para empezar vamos a crear un código en c++ y lo compilaremos

Mejor os lo muestro en una imagen:

Imagen

Bien, habéis visto en la imagen aquello que debéis escribir para conseguir el programa, si hay alguna duda preguntar.

He puesto también la cmd de ms para que veáis también la ruta desde él.

Os muestro una pequeña descripción de las rutas en el árbol de directorios de nuestra nueva shell en la que todo cuelga de una raíz /
/bin contiene ejecutables binarios

/usr contiene una estructura de directorios parecida a la de la raíz pero más cercana al usuario.

/usr/bin contiene ejecutables binarios

/tmp enlaza con la variable de entorno TMP (echo %TMP% o en este entorno echo $TMP)
/C Pues esto es C:\

/D esto es D:\

. . . y así el resto hasta

/Z que es la unidad Z:\

Salgamos de la shell escribiendo exit y vamos a modificar cuatro cosas, para tener un entorno mas cercano (en este caso a aquello que yo utilizo habitualmente)

vamos a modificar los colores, editemos el archivo C:\msys\1.0\msys.bat buscaremos estas líneas y cambiaremos los valores de las variables por los siguientes:
Código: Seleccionar todo
if "x%MINGW32BGCOLOR%" == "x" set MINGW32BGCOLOR=black
if "x%MINGW32FGCOLOR%" == "x" set MINGW32FGCOLOR=Gray


Ahora editemos también el archivo C:\msys\1.0\etc\profile donde comentaremos añadiendo el símbolo # al principio de la línea la inicialización de la variable PS1 que es el prompt del sistema. Debajo declararemos el propio y también crearemos unos alias sobre la orden ls, para ir personalizando nuestro entorno
Código: Seleccionar todo
#export PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w\033[0m\]
#$ '

export PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
alias ls="ls --color"
alias l="ls -l"
alias ll="l -a"


Y al arrancar de nuevo ya apreciaremos la diferencia ...

Imagen

Ya tenemos nuestro entorno de desarrollo preparado.

SaludOS
En busca del TuXeR perdido
Avatar de Usuario
AnimAlf
<|:-)
<|:-)
 
Mensajes: 628
Registrado: Mar Ago 08, 2006 4:54 am
Ubicación: tgn

Notapor neofito » Vie Jun 19, 2009 10:43 am

Muchas gracias por el/los documento/s!!

Saludos
La verdad nos hara libres

http://neosysforensics.blogspot.com
http://www.wadalbertia.org
@neosysforensics
-<|:-P[G]
Avatar de Usuario
neofito
Wadalbertita
Wadalbertita
 
Mensajes: 1799
Registrado: Dom Ene 30, 2005 7:16 am
Ubicación: En algun lugar

[wx C++] La fiebre de las calculadoras

Notapor AnimAlf » Vie Jun 19, 2009 11:51 am

Pues ... Tengo otro ... que este ya es pecado ... No en serio. Cuando lo hice, tube en mente los CUADERNOS.

En los foros, no paraban de publicar código para la línea de comando sobre una calculadora .... y me dije .... con las wx a ver que tal.

Lo publiqué en cph.portalhacker.net, en los foros no dejaban de publicar código en C sobre una calculadora, y me dije, pues voy a preparar un documento con las wx. Lo publiqué en diciembre del año pasado, y no se, ya sabeis como va esto, con el empuje del convencimiento popular, atacarón el servidor, y borraron la base de datos en enero o febrero. La cópia de seguridad que tenían, era unos meses anterior, a la fecha de publicación, por lo que el documento desapareció. No tenía cópia de él, ... había abandonado la frecuencia por los foros ya que me dediqué a otros enseres, y cuando volví de nuevo ... me dijé a ver si tengo una cópia pero, pobre de mí, no tenía ninguna cópia del documento.

Pero el cache de google fue caritativo conmigo :-)

Aquí está el documento:

Hola, repetimos.

Cuando hubo el cataclismo, se perdieron algunos documento que publiqué por aquí, he recuperado uno de la cache de google, y nada, me digo voy a volver a postearlo, ya que la imágenes aún están en imageshack y el archivo fuente también sigue en megaupload ... pues esto era así:

Hacia tiempo que no escribía nada, he visto que últimamente hay mucho código de calculadoras por aquí, por lo que me he decantado por realizar un manual sobre la creación de una calculadora con wxDev C++

Vamos allá, iniciaremos un nuevo proyecto, le daremos nombre y lo guardaremos.

Imagen

En la ventana/formulario sólo utilizaremos un wxTextCtrl, varios wxButton, un wxStaticText y un wxBitmapButton.

Imagen

Los distribuiremos por ejemplo como podréis ver en la imagen más abajo. El wxBitmapButton lo he añadido ya que no he sabido poner el símbolo de la raíz cuadrada (sí ya se que es el 251 de la tabla ASCII extendida). Y el wxStaticText es para indicar que se ha guardado algo en la memoria.

Añadimos los controles y los podemos disponer por ejemplo del siguiente modo:

Imagen

Para alinear los controles no os preocupéis, colocarlos más o menos, luego los seleccionáis todos, pulsando el botón izquierdo del ratón y sin soltarlo seleccionando un conjunto, o manteniendo pulsada la tecla shift (mayúsculas) y haciendo click sobre el elemento que queramos agregar al conjunto de la selección. Una vez tengamos el conjunto de la selección, pulsaremos el botón derecho del ratón y en el menú contextual seleccionaremo s Align -> To grid con lo que se alinearan correctamente.

Imagen

Pero lo más eficiente es establecerlo en nuestro entorno, en las opciones del diseñador de formularios. Tenemos que activa la opción Snap to grid, con lo que los controles que insertemos se alinearán a una rejilla virtual. Pulsemos con el botón derecho sobre el formulario y seleccionamos la opción View Designer Options con lo que nos aparecerá una interfaz en donde veremos la opción Snap to grid, marcamos la casilla y aceptamos, Así la disposición de los controles sobre los formularios ser nos hará más amigable.

Imagen

Bien, al asunto ...

Seleccionemos nuestro WxEdit1 y vayamos al Inspector de propiedades. Allí desplegamos Edit Style y asignaremos true a wxTE_READONLY y también a wxTE_RIGHT, para que no se pueda escribir directamente en el edit text y para que se alinee su contenido a la derecha. Le podéis cambiar también la fuente, le he puesto un color azul oscuro y en negrita.

Vamos a empezar con el código. Primero que nada declararemos unas variables y una función. Lo haremos en el archivo CalculadoraDlg .h, la he puesto al final a continuación de las funciones OnClose y CreateGUIContr ols que están declaradas como privadas, la variables son las siguientes:

bool modoEdicion, conDecimal, decimalIniciado;
double acumulado, memoria;
char operador;


modoEdición: la utilizaremos para saber si lo que vemos en el visor (TextBox) es un resultado o es un número que estamos escribiendo.

conDecimal: indicará que se ha pulsado el punto separador de decimales.
decimalIniciado: Nos servirá para saber que el punto decimal ya existe en el número que estamos escribiendo.

acumulado: en esta variable guardaremos el valor para realizar operaciones.
memoria: en esta variable almacenaremos el número en memoria de la calculadora.

operador: almacenará el tipo de operación que se va a realizar.

Esas son las variables, también declararemos una función, la siguiente:
wxString FormatoDecimal ( wxString entrada );

Lo que haremos con esta función es intentar mostrar los número con coma, lo más pequeños posibles, y si puede ser eliminar la coma, por ejemplo 32,9200 lo reducirá a 32,92 y si se trata de 32,0000 lo reducirá a 32

Ok, guardamos el archivo, ya hemos terminado con él, aquí os muestro el final del archivo:

Código: Seleccionar todo
   private:
      void OnClose(wxCloseEvent& event);
      void CreateGUIControls();
      wxString FormatoDecimal ( wxString entrada );
      bool modoEdicion, conDecimal, decimalIniciado;
      double acumulado, memoria;
      char operador;
};

#endif


vayamos ahora al archivo CalculadoraDlg .cpp, donde iniciaremos las variables y escribiremos la función que hemos declarado.

Las variables, las he iniciado al final de la función void CalculadoraDlg::CreateGUIControls()
Código: Seleccionar todo
...
   ////GUI Items Creation End

   // Iniciar el visor con el valor 0
   WxEdit1->SetValue ( wxT ( "0" ) );
   // Inicializar variables
   operador = '\0';
   modoEdicion = false;
   conDecimal = false;
   decimalIniciado = false;
   acumulado = 0;
   memoria = 0;
}


A continuación ya podemos escribir la implementación de la función FormatoDecimal, lo que haremos en ella es un bucle que vaya examinando el último elemento de la cadena de caracteres, hasta que éste sea el punto separador de decimales, si encuentra un 0 lo eliminará y si no es un número diferente se interrumpirá. Finalmente, volverá a comprobar la cadena para comprobar que el último elemento no sea un punto, si es el punto separador, lo eliminará.

Código: Seleccionar todo
wxString CalculadoraDlg::FormatoDecimal ( wxString entrada )
{
    while (entrada[entrada.Length()-1] != '.')
      if (entrada[entrada.Length()-1] == '0')
        entrada.RemoveLast();
      else if (entrada[entrada.Length()-1] != '.') break;
    if (entrada[entrada.Length()-1] == '.') {
      entrada.RemoveLast();
    }
    return entrada;
}


Ahora ya podemos empezar con el código de respuesta a eventos. Vamos al archivo CalculadoraDlg .wxform, donde tenemos nuestro diseño visual y seleccionamos el botón del punto separador de decimales.

en el inspector de propiedades, pulsamos en la pestaña Eventos, y haremos click en el espacio libre que hay a la derecha de OnClick con lo que se nos desplegará un menú en el que seleccionaremo s <Add New Function> y nos llevará de nuevo al archivo CalculadoraDlg.cpp dónde ya habrá escrito la función correspondient e. El nombre de la función variará ya que la construye tomando como referencia el nombre del botón, en mi caso el botón tiene el nombre WxButton18 y la función que ha creado pues tiene el nombre WxButton18Click, bien, espero que entendáis eso, ya que no tenemos que coincidir.

En la función simplemente estableceremos a verdadero que a partir de ahora en el número que estamos escribiendo estableceremos su parte decimal. Si no estábamos en modo edición (el modo edición empieza cuando empezamos a escribir un número en la calculadora hasta que realizamos una operación con ese número), quiere decir que se iniciará la escritura del número, por lo que ya escribiremos el 0 que es en el único caso en el que lo podremos tener a la izquierda, e indicamos que se ha iniciado el número con modoEdicion.

Código: Seleccionar todo
void CalculadoraDlg::WxButton18Click(wxCommandEvent& event)
{
   // insert your code here
   conDecimal = true;
   if ( !modoEdicion ) {
      WxEdit1->SetValue( ( "0" ) );
      modoEdicion = true;
   }
}


Bien vamos con otro botón, ahora nos encargaremos de los botones C y CE elegir uno de los dos, ir al Inspector de propiedades, a la pestaña eventos y asignarle una función al evento OnClick. Utilizaremos la misma función para ambos. Pero primero vamos a escribirla, en mi caso el botón se corresponde con WxButton1. Bien, esta función lo que hará será establecer el modoEdición a falso, escribir un 0 en el visor y si se trata del botón CE resetear las variables:

Código: Seleccionar todo
void CalculadoraDlg::WxButton1Click(wxCommandEvent& event)
{
   // insert your code here
   WxEdit1->SetValue ( wxT ( "0" ) );
   if ( ((wxButton *)event.GetEventObject())->GetLabelText() == wxT( "CE" ) )
   {
      acumulado=0;
      operador = '\0';
   }
   modoEdicion = false;
}


Ahora recordar el nombre de la función, en mi caso WxButton1Click, ya que tenéis que seleccionar el otro botón, ir a la pestaña eventos del inspector de propiedades, pulsar el espacio a la derecha de OnClick para que se despliegue el menú y escoger la función anterior, que estár allí escrita.

Je, je, je, hemos creado una función que responde ante dos eventos de un modo u otro. Mejor, ya que ahora haremos lo mismos con los botones del 0 al 9, crearemos una función para todos ellos y luego sólo le asignaremos el nombre de la función a cada botón :)) vamos a ello

Ya sabéis, seleccionar un botón cualquiera de los de 0 al 9, inspector de propiedades, pestaña eventos, desplegar OnClick y <Add New Function>. Esta vez he elegido wxButton5. Cada uno que elija el que quiera, luego tenemos que tenerlo presente para asignar esta misma función a todos los demás botones, igual que hemos hecho con la función anterior.

Esta función lo que va a hacer principalmente es añadir el número que pulsemos al visor. Primero que nada vemos que comprueba si se trata de insertar la parte decimal, si conDecimal fuese verdadero, entonces escribiría el punto y establecería decimalIniciad o a verdadero (je je, para no repetir la coma).

A continuación entra en un if anidado, si estamos en modoEdición, coge lo que haya en la caja de texto y le añade el número que hayamos pulsado. Ok, si no estamos en modo edición quiere decir que iniciaremos el número por lo que lo haremos sólo si es diferente de 0, ya que no vamos a escribir 00, para evitarlo si se pulsa 0 y no se había iniciado, seguiría igual:

Código: Seleccionar todo
void CalculadoraDlg::WxButton5Click(wxCommandEvent& event)
{
   // insert your code here
   if ( conDecimal && !decimalIniciado) {
      WxEdit1->SetValue( WxEdit1->GetValue() + wxT ( "." ) );
      decimalIniciado = true;
   }
   if (modoEdicion)
      WxEdit1->SetValue( WxEdit1->GetValue() +
         ((wxButton *)event.GetEventObject())->GetLabelText());
   else if ( ((wxButton *)event.GetEventObject())->GetLabelText() != '0' )
      WxEdit1->SetValue(((wxButton *)event.GetEventObject())->GetLabelText() );
   else {
      WxEdit1->SetValue( ( "0" ) );
      return;
   }
   modoEdicion = true;
}


Ya sabéis que toca ahora, asignar esta función al resto de números.

Una vez tengamos asignada la función anterior a los 10 botones, nos encargaremos del botón = y % con las que también utilizaremos la misma función. Esta es la función que realiza las operaciones matemáticas. La voy a explicar antes que la de los botones se sumar, restar, multiplicar y dividir, por que será llamada desde ellas. Además en la funciones de esos botones sólo vamos a establecer la variable operador con el signo de la operación y se guarda en acumulado el número para poder realizarla.

Bien vamos a ella. Ya lo debemos tener por la mano seguramente, elegimos uno de los dos botones, el del igual o el del porcentaje y le añadimos una nueva función al evento OnClick.

Lo primero que hace la función es recoger el número que tenemos en la caja de texto. He declarado la variable porcentaje para saber si se trata de la tecla porcentaje o igual que lo compruebo a continuación y si se trata de porcentaje establezco el tanto por ciento sobre el valor guardado para la variable temporal, luego dependiendo del signo que se tenga almacenado en operador, se realizará una operación u otra y finalmente reseteo las variables

Código: Seleccionar todo
void CalculadoraDlg::WxButton19Click(wxCommandEvent& event)
{
   // insert your code here
   double tmpDbl;
   bool porcentage = false;
   WxEdit1->GetValue().ToDouble( &tmpDbl );

   if ( ((wxButton *)event.GetEventObject())->GetLabelText() == wxT( "%" ) )
   {
      tmpDbl = acumulado / 100 * tmpDbl;
      porcentage = true;
   }
   switch (operador) {
      case '+':
         acumulado += tmpDbl;
         break;
      case '-':
         acumulado -= tmpDbl;
         break;
         case 'x':
         if (porcentage)
            acumulado = tmpDbl;
         else
            acumulado *= tmpDbl;
         break;
      case '÷':
         acumulado /= tmpDbl;
         break;
      default: acumulado = tmpDbl;
   }
   WxEdit1->SetValue( FormatoDecimal ( wxString::Format ( wxT( "%f" ), acumulado ) ) );
   acumulado = 0;
   operador = '\0';
   modoEdicion = false;
   conDecimal = false;
   decimalIniciado = false;
}


Recordar que tenéis que asignar el evento OnClick al otro botón.

Ahora en los botones de dividir, multiplicar, sumar y restar. También utilizaremos una sola función y la utilizaremos con los cuatro botones.

Esta función es muy simple, le asignamos el valor a la variables operador y acumulado. Primero que nada comprobaremos que operador está vacío, si no estuviese vacío, es porqué hay una operación pendiente (si estamos en modoEdición), y llama a la función del igual o porcentaje, para que la resuelva.

Código: Seleccionar todo
void CalculadoraDlg::WxButton16Click(wxCommandEvent& event)
{
   // insert your code here
   if ( operador != '\0' && modoEdicion )
      CalculadoraDlg::WxButton19Click( event );
   WxEdit1->GetValue().ToDouble( &acumulado );
   operador = ((wxButton *)event.GetEventObject())->GetLabelText()[0];
   modoEdicion = false;
   conDecimal = false;
   decimalIniciado = false;
}


Vamos ahora con el botón de la Raíz Cuadrada, es muy simple, recogemos el valor que tenemos en la caja de texto y lo volvemos a establecer utilizamos la función sqrt.

Código: Seleccionar todo
void CalculadoraDlg::WxBitmapButton1Click(wxCommandEvent& event)
{
   // insert your code here
   double tmpDbl;
   WxEdit1->GetValue().ToDouble( &tmpDbl );
   WxEdit1->SetValue( FormatoDecimal ( wxString::Format ( wxT( "%f" ), sqrt(tmpDbl) ) ) );
   modoEdicion = false;
   conDecimal = false;
   decimalIniciado = false;
}


la función que escribimos para el botón +/- es muy sencilla también, recogemos el valor que tenemos en la caja de texto y lo volvemos a asignar cambiándole el signo. En esta función no cambio el modo de edición.

Código: Seleccionar todo
void CalculadoraDlg::WxButton23Click(wxCommandEvent& event)
{
   // insert your code here
   double tmpDbl;
   WxEdit1->GetValue().ToDouble( &tmpDbl );
   WxEdit1->SetValue( FormatoDecimal ( wxString::Format ( wxT( "%f" ),
      -tmpDbl ) ) );
}


Los dos botones que quedan son los de la memoria, uno establece un valor en memoria, se trata de M in el cuando pulsemos sobre él el valor que tengamos en la caja de texto la almacenaremos en una variable para recuperarla más adelante con MR

La función que asignaremos al botón M in es la siguiente, si el valor que se guarda en la memoria es diferente de 0 entonces haremos que el wxStaticText sea visible, indicándonos que tenemos datos en la memoria.

Código: Seleccionar todo
void CalculadoraDlg::WxButton21Click(wxCommandEvent& event)
{
   // insert your code here
   WxEdit1->GetValue().ToDouble( &memoria );
   WxStaticText1->Show(memoria!=0);
   modoEdicion = false;
}


Y la asignación para el evento onClick del botón MR simplemente volverá los datos de la variable memoria en la caja de Texto

Código: Seleccionar todo
void CalculadoraDlg::WxButton22Click(wxCommandEvent& event)
{
   // insert your code here
   WxEdit1->SetValue( FormatoDecimal (
   wxString::Format ( wxT( "%f" ), memoria ) ) );
   modoEdicion = false;
}


Pues aquí queda este pequeño documento, para aquellos que quieran conocer mejor el funcionamiento de las wxWidgets :))

Si tenéis alguna duda, pos preguntarlas :))

Aquí os dejo el código fuente

SaludOS
En busca del TuXeR perdido
Avatar de Usuario
AnimAlf
<|:-)
<|:-)
 
Mensajes: 628
Registrado: Mar Ago 08, 2006 4:54 am
Ubicación: tgn

Notapor Popolous » Vie Jun 19, 2009 10:05 pm

¡Hola!

Le he puesto un post-it, creo que se lo merece, sin duda.

¡Saludos!
A. Einstein, cabello y violín,
hacemos nuestra última reverencia;
aunque sólo comprendido por dos personas,
él mismo y, a veces, Dios.

Jack C. Rosseter

"Sin direccionamiento Físico, no hay direccionamiento Lógico"

Vikingo dixit
Popolous
Wadalbertita
Wadalbertita
 
Mensajes: 1946
Registrado: Mié Ene 26, 2005 10:40 pm
Ubicación: E=mc^2

Notapor AnimAlf » Vie Jun 19, 2009 10:58 pm

Thnks.

Como te comenté en el post anterior, la programación en C++ creo que así, de este modo, es un juego de niños para aquellos que conocen C ;-)

SaludOS
En busca del TuXeR perdido
Avatar de Usuario
AnimAlf
<|:-)
<|:-)
 
Mensajes: 628
Registrado: Mar Ago 08, 2006 4:54 am
Ubicación: tgn

Notapor algio » Dom Oct 11, 2009 4:49 pm

Increible documento, me vendra muy bien para iniciarme en la programacion gui en c/c++ .... gracias :D
Avatar de Usuario
algio
:-)
:-)
 
Mensajes: 1
Registrado: Sab Oct 10, 2009 8:20 pm

Notapor Ariel Liguori » Mié Nov 04, 2009 8:35 pm

AnimAlf escribió:Thnks.

Como te comenté en el post anterior, la programación en C++ creo que así, de este modo, es un juego de niños para aquellos que conocen C ;-)

SaludOS


La verdad que si! jajaja
Ariel Liguori
:-)
:-)
 
Mensajes: 17
Registrado: Mar Dic 30, 2008 6:27 pm
Ubicación: Argentina - Bs As


Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron