Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Xavelets

#1
Hola neoncyber!!

Te agradezco mucho tu sugerencia, de hecho inicialmente si intenté el uso de  maskedtextbox, sin embargo debido a mi inexperiencia, me tope con algunos problemas que no pude superar, el primero es que debido a que estoy probando un algoritmo que hace operaciones con números muuuuy grandes y queria poder ver todos los dígitos introducidos necesitaba la propiedad "multiline" la cual no encontré en el maskedtextbox, por otra parte, me vi restringido a introducir únicamente los dígitos que definian el Mask  (nunca se me ocurrió intentar usar una expresion regular como máscara   :rolleyes: >:D) de ahí que estuve buscando como resolver esos problemas, y como resultado.... la clase anterior

Sin contar que fue un buen ejercicio de programación en C# para mi jejejeje ;D

Salu2
#2
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 (csharp) [Seleccionar]

    public class NumTextBox : TextBox
    {
        private bool aceptapunto = true;
        private delegate bool Delegado(char E);
        Delegado analizaKeychar;

        public NumTextBox()
        {
            analizaKeychar = conPunto;
        }

        [Category("Comportamiento")]
        public bool AceptaPunto
        {
            set
            {
                aceptapunto = value;
                if (aceptapunto)
                    analizaKeychar = conPunto;
                else
                    analizaKeychar = sinPunto;
            }
            get { return aceptapunto; }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            if (!analizaKeychar(e.KeyChar))
            {
                e.Handled = true;
            }
            if (base.Text.Contains(".") && (e.KeyChar == '.') && aceptapunto)
            {
                e.Handled = true;
            }
        }

        protected override void OnLeave(System.EventArgs e)
        {
            base.OnLeave(e);
            if (aceptapunto)
            {
                if (base.Text.StartsWith("."))
                {
                    base.Text = base.Text.Insert(0, "0");
                }
            }
        }

        private bool conPunto(char E)
        {
            return (char.IsDigit(E) || char.IsControl(E) || E == '.');
        }

        private bool sinPunto(char E)
        {
            return (char.IsDigit(E) || char.IsControl(E));
        }
    }


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
#3
Hola!!

Aunque veo que te has decidido, te cuento que yo ahora mismo estoy realizando un pequeño proyecto usando firebird y me ha ido excelente....

Si bien en un principio me fue un poco confusa la filosofía de firebird, una vez que la entendí me facilito mucho el trabajo. Obviamente funciona con .Net a través de su provider y es casi tan sencillo como con SQL Server....

ademas la única restricción de del tamaño de la DB es el sistema de archivos.

En fin yo lo recomiendo ampliamente

Salu2
#4
Hola a todos de nuevo!!!

Después de horas de búsqueda infructuosa en la red, y de consultarlo con la almoada creo que di con la solución.

Buscando minuciosamente en las propiedades de la clase DataGridViewCell me encontré con la propiedad ValueType, así que intente el siguiente código:


if (dGV_l.Columns[e.ColumnIndex].Name == "precio_u")
{
   int cant = Convert.ToInt32(dGV_l.Rows[e.RowIndex].Cells["cantidad"].Value);

   dGV_l.Rows[e.RowIndex].Cells[e.ColumnIndex].ValueType = typeof(float);
   dGV_l.Rows[e.RowIndex].Cells["precio_u"].ValueType = typeof(float);

   dGV_l.Rows[e.RowIndex].Cells[4].Value = cant * (float)dGV_l.Rows[e.RowIndex].Cells["precio_u"].Value;
}


Como pueden ver este código parece mas elegante......
la novedad es que a las celdas de "precio_unitario" e "importe" les asigno a su propiedad ValueType el tipo float;  gracias a esto, en la última línea ya puedo hacer un cast simple a float.

Por cierto, todavía mejor es establecer la propiedad ValueType de la columna entera al tiempo de cargar el formulario.

Espero a alguien mas le sirva.

Salu2
#5
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:

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
#6
Hola poxomata!!!

Ese link que te ha pasado neoncyber se ve muy interesante, y si quieres complementarlo, también puedes visitar

http://www.aforgenet.com/

Es una biblioteca que tiene casi todo lo necesario para procesar imágenes. Muy recomendable.

Salu2
#7
Hola amigos, pues para agradecerles sus opiniones y orientación!!

¡Esta decidido!, estoy trabajando con el esquema que sugieren D4N93R y neoncyber  ;-)

El único inconveniente es que tengo que aprender mucho sobre C++ pero eso es lo de menos, aquí los estaré molestando

Salu2
#8
Si!!!  Slow V.S.  y neoncyber ;D  creo que es lo que voy a hacer.....


@neoncyber

Muchas gracias por el código, aunque siendo sincero no entiendo muy bien algunas partes del mismo;  pero dejame analizarlo con más cuidado e investigar sobre algunas de las funciones y estructuras sintácticas que usas.

Si definitivamente no lo entiendo después de eso, te estaré molestando a ti y a los compañeros del foro con dudas más específicas.  :D

Aunque a grandes rasgos, y si entiendo bien...

¿con esto puedo crear una DLL en código nativo compilarlo, y por consiguiente generar código máquina "eficiente", y el CLR lo ejecutará como tal?, es decir sin intervenir con él y provocarle algún tipo de retraso.

Si es así, ¡¡esto es exactamente lo que necesito!! :D


Edito:
Bueno me viene a la mente otra cosa, las llamadas a funciones externas a .NET  ¿serán muy costosas computacionalmnete hablando?

Les advertí que soy un tanto obsesivo jijijijijiji :rolleyes:  :silbar:

Gracias y Salu2
#9
Hola a todos

Algunas bibliotecas que encontré,  y que utilicé recientemente:


Aforge.NET: Excelente biblioteca enfocada a las áreas de: Visión por Computadora, Inteligencia Artificial, Procesamiento de Imágenes, Redes Neuronales, Robótica, Algoritmos Genéticos, etc... Excelente documentación que incluye ejemplos prácticos. Licencia LGPL v3 y GPL v3.


Math.NET: Biblioteca enfocada al cálculo científico, incluye una gran cantidad de métodos numéricos(Algebra Lineal, solución de sistemas de ecuaciones....), Álgebra Simbólica, Procesamiento Digital de Señales, etc. Licencias MIT/X11, LGPL & GPL.


NAudio: Biblioteca que incluye docenas de classes enfocadas a la manipulación de Audio, que van desde la apertura y guardado de archivos en distintos formatos, hasta la captura y escritura de datos a la tarjeta de sonido. Pobremente documentada, sin embargo la API es sencilla e intuitiva. Licencia Microsoft Public License (Ms-PL).


Espero le sirva a alguien más.

Salu2

#10
Hola nuevamente a todos!! =)

@Khronos14

Muchas gracias por tu sugerencia; la verdad es que hace algún tiempo traté de usar GTK, y dado que mis conocimientos son pocos y los he adquirido casi completamente de forma autodidacta, no entendía nada, y me di por vencido... claro que ahora he aprendido un poco más, lo voy a intentar de nuevo, y de hecho con el código que escribiste aquí, me ha aclarado algunos detalles sobre el uso de GTK, e incluso como ubicar las directivas para una compilación multiplataforma....

Citar... sólo que no me acaba de convencer las aplicaciones compiladas a byte-code.

Andale, a esto me refería con el planteamiento original, y mi duda sobre la diferencia de rendimiento entre C++/CLIE y C#.    Explico....

Si me equivoco, por favor corríjanme... la compilación tanto C++/CLIE (implementacion de Microsoft), como C# producen byte-code que será interpretado y ejecutado por el CLR.

Por otra parte, entiendo que la sintaxis de un lenguaje es solo la forma en que el usuario le dice al compilador que código de máquina generar. Por ejemplo, la sintaxis de un ciclo "for" es distinta en VB que en C#, sin embargo y por lógica yo pensaría que los compiladores de ambos lenguajes generan exactamente las mismas instrucciones de máquina (o byte-codes). Finalmente los que hicieron esta plataforma debieron de haber seguido las mismas directivas de construcción.

De forma similar, la sintaxis de un ciclo "for" en C++/CLI y C# es la misma, y no veo razón por la cual ambos lenguajes no generen exactamente las mismas instrucciones de máquina... si esto es cierto, no debería ser mucha la diferencia de rendimiento entre ambos lenguajes...

Esta es la explicación de la pregunta en el título del tema.

@ D4N93R y neoncyber

Exacto por eso mi sufrimiento :-( , quiero ayudarme con .Net, pero tengo miedo de trabajar un montón y al final darme cuenta de que mi aplicación no es lo suficientemente rápida ya que el algoritmo de procesamiento que voy a aplicar es O(n^4). Anteriormente hice un programa en C para probar el algoritmo, y en mi maquina equipada con un Intel Core Duo a 1.66 GHz y 1 GB de RAM y apenas podría decir que alcanzaba para tiempo real....  claro que no implemente hilos y por lo tanto no utilicé  toda la capacidad de mi procesador.

¿Ustedes que piensan? ¿valdrá la pena programar en C# para tiempo real con un algoritmo de ese tipo?, o mejor hago el sacrificio para aprender un poco mas de C++/CLI, o  C++ nativo.


Salu2