elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: [1]
1  Programación / .NET (C#, VB.NET, ASP) / TextBox que solo acepta números enteros o de punto flotante [¿Aporte?] en: 21 Septiembre 2011, 05:47 am
Hola a todos!!

Estoy realizando un pequeño proyecto en el cual tenia la necesidad de un textbox que solo aceptara número enteros o de punto flotante (positivos);  investigando mucho en la red, encontré algunos snipets y varias ideas, y con dicho material confeccione una pequeña clase derivada del textbox que realiza lo que describo.

La pongo a su consideración con la esperanza de que le sea útil a alguien más y que con sus opiniones y aportes mejorar el código y las funcionalidades.
Les advierto que soy principiante en C# y .Net

Sin mas, pongo el código:

[Editado] (Trabajar cansado y apresurarse a publicar no deja nada bueno  ;) )
Código
  1.    public class NumTextBox : TextBox
  2.    {
  3.        private bool aceptapunto = true;
  4.        private delegate bool Delegado(char E);
  5.        Delegado analizaKeychar;
  6.  
  7.        public NumTextBox()
  8.        {
  9.            analizaKeychar = conPunto;
  10.        }
  11.  
  12.        [Category("Comportamiento")]
  13.        public bool AceptaPunto
  14.        {
  15.            set
  16.            {
  17.                aceptapunto = value;
  18.                if (aceptapunto)
  19.                    analizaKeychar = conPunto;
  20.                else
  21.                    analizaKeychar = sinPunto;
  22.            }
  23.            get { return aceptapunto; }
  24.        }
  25.  
  26.        protected override void OnKeyPress(KeyPressEventArgs e)
  27.        {
  28.            base.OnKeyPress(e);
  29.            if (!analizaKeychar(e.KeyChar))
  30.            {
  31.                e.Handled = true;
  32.            }
  33.            if (base.Text.Contains(".") && (e.KeyChar == '.') && aceptapunto)
  34.            {
  35.                e.Handled = true;
  36.            }
  37.        }
  38.  
  39.        protected override void OnLeave(System.EventArgs e)
  40.        {
  41.            base.OnLeave(e);
  42.            if (aceptapunto)
  43.            {
  44.                if (base.Text.StartsWith("."))
  45.                {
  46.                    base.Text = base.Text.Insert(0, "0");
  47.                }
  48.            }
  49.        }
  50.  
  51.        private bool conPunto(char E)
  52.        {
  53.            return (char.IsDigit(E) || char.IsControl(E) || E == '.');
  54.        }
  55.  
  56.        private bool sinPunto(char E)
  57.        {
  58.            return (char.IsDigit(E) || char.IsControl(E));
  59.        }
  60.    }
  61.  

Como pueden ver el código es muy básico (de principiante  :-[  :rolleyes:) espero me ayuden a mejorarlo y hacerlo más profesional.

Se que es extremadamente ineficiente que con cada caracter recibido asigne el método al delegado, pero no encontré otra forma si quería que el control pudiese ser arrastrado desde la barra de herramientas del visual studio, ya que al asignar un parámetro al constructor, me era imposible arrastrar dicho control. Por otra parte tampoco he encontrado la manera que la propiedad "AceptPunto" definida por mi, sea visible en la barra de propiedades del VS.

En mi pais el separador de decimales es el ".", por lo que para utilizar  el caracter "," solo deben cambiarlo en donde encuentren el "."

En un par de días prometo explicar y documentar dicho código

Salu2
2  Programación / .NET (C#, VB.NET, ASP) / Tipos de datos en un DataGridView ¿como conservarlos? [Solucionado] en: 5 Septiembre 2011, 03:31 am
Hola amigos!!


Escribo esta consulta porque ni siquiera se si el título describe mi duda....

Tengo un formulario con un DataGridView con tres columnas de tipo DataGridViewTextBoxColumn: "cantidad"  "precio_unitario"  e "importe"

a las dos ultimas las he configurado con formato de moneda de tal manera que presentan los numeros precedidos del simbolo $.....

la idea es que:              importe = cantidad * precio_unitario


Mientras asigne valores de tipo float programaticamente a las celdas de dichas columnas, se realiza correctamente la operación deseada.

El problema es cuando desde el formulario cambio el valor de la celda en la columna "precio_unitario" dicho valor pareciera ser un string (en realidad un object), por lo que ya no realiza la operación deseada de forma correcta.

Lo he resuelto momentáneamente usando el evento CellValueChanged y con el siguiente código:
Código:
if (datagridview1.Columns[e.ColumnIndex].Name == "precio_u")
{
   int cant = Convert.ToInt32(datagridview1.Rows[e.RowIndex].Cells["cantidad"].Value);

   datagridview1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = float.Parse(datagridview1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
   datagridview1.Rows[e.RowIndex].Cells[4].Value = cant * float.Parse(datagridview1.Rows[e.RowIndex].Cells["precio_u"].Value.ToString());
}

Como pueden ver primero obtengo el valor contenido en la celda, para converirlo a string, y luego poderlo convertir a float, y de nuevo asignarlo a la misma celda, eso sin contar con el hecho de esas horribles y enormes sentencias jeej  :-[

Esto funciona, si embargo creo que dista mucho de ser la forma más adecuada y eficiente.

¿Alguien conoce una mejor forma de hacer esto?

Les agradeceré mucho sus respuestas

Salu2
3  Programación / .NET (C#, VB.NET, ASP) / [Solucionado] ¿Realmente C++/Cli es superior en velocidad ambos .Net? en: 28 Abril 2011, 05:53 am
Hola a todos!!!!

Les explico el porque de la duda.....

Soy un programador aficionado un tanto obsesivo que aprendió a programar en C hace mucho tiempo, y que lleva aprendiendo C# algunos meses (no lo domino, pero ya me defiendo con este lenguaje) ;D

Tengo en mente un proyecto en el cual pretendo procesar varios streams de audio "en tiempo real", por lo que me interesa de sobremanera el tema del rendimiento. :rolleyes:

De inicio entiendo perfectamente que el código nativo ya sea en lenguaje C, o C++ es la mejor opción para obtener el mejor rendimiento (aparte del uso de algoritmos eficientes y los compiladores utilizados), ya que a diferencia de .Net estos no tienen que pasar por el CLR etc. etc.....

Sin embargo me siento atraído a utilizar .Net debido a la gran cantidad de documentación y facilidades que provee esta plataforma (¿ya les dije que C# me gusto mucho?).

Aunque he leído que C++/Cli es superior en rendimiento que C#, también leí que los programas hechos con cualquiera de estos lenguajes se ejecutan en el CLR;  incluso pareciera que utilizan exactamente las mismas bibliotecas, y que lo único que cambia es la sintaxis para el uso de las distintas clases. Es aquí donde la ardilla en mi cerebro comienza a correr moviendo los engranajes y me lleva a pensar por lógica que no debe de haber una diferencia significativa de rendimiento entre la implementación de un algoritmo en lenguaje C++/Cli, y lenguaje C#.

¿Porque esta disertación sobre rendimiento de lenguajes en .Net y la inmortalidad del cangrejo?  Pues porque no quiero comenzar a codificar en C# (mi favorito) y darme cuenta que no me da el rendimiento necesario, o comenzar a escribir en C++/Cli (que no domino su sintaxis y estoy escasamente familiarizado), tardarme mas tiempo en el desarrollo, y lo que es peor, darme cuenta que tampoco tengo en rendimiento necesario  :xD :-[  .... no se que hacer jejejejeje!!

Es por eso que solicito su ayuda, sus experiencias y opiniones respecto a este tema.

Otra pregunta.....

¿Vale la pena intentar con .Net, o mejor me olvido y comienzo a aprender a hacer programas con la WinAPI aunque tarde años?....



Pd. 1 Nunca aprendí a programar interfaces de usuario en C, y en C# me resultó muy sencillo e intuitivo; y quiero que mi proyecto tenga GUI.

Pd. 2 Solo tengo a mi disposición herramientas de programación gratuitas, es decir VC++ Express 2008, SharpDevelop, Codeblocks, Windows 7 SDK, MinGW, etc....
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines