• Martes 16 de Abril de 2024, 10:54

Mostrar Mensajes

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


Mensajes - E.Baley

Páginas: 1 [2]
26
C# / Re: C# Conversion A Tipos Desconocidos
« en: Jueves 5 de Junio de 2008, 15:18 »
Deberás crear las instancias de las clases previamente a que el usuario pueda elegir la entidad, por ejemplo, al inicio de la aplicación.
Luego puedes guardar esas instancias en un lugar público y conocido, para poder acceder a ellas (un "gestor de objetos").

Otra opción es implementar un patrón singleton en esas clases, y así, cada vez que el usuario elija una opción, vuelves a crear la clase correspondiente. De esta forma es un pelín más complejo, pero no es necesario guardar las instancias en ningún lugar conocido.

27
C# / Re: Problema Con Clases
« en: Jueves 5 de Junio de 2008, 11:31 »
Hombre, no es dificil
1) Haces un bucle para recorrer todos los elementos del vector
2) Para cada elemento, obtienes su representación string. Basta con usar .ToString()
3) para cada string, buscas si contiene el SubString "5". El método es String.Contains(el sub-string que quieres buscar)
4) Si te devuelve true, le sumas 7 al elemento

28
C# / Re: Enum Dinamico
« en: Sábado 31 de Mayo de 2008, 12:35 »
Para establecer valores de enums mediante reflection puedes leerte http://www.codeproject.com/KB/cs/SetEnumWithReflection.aspx

pero como dice JuanK seguramente es mucho mejor usar un List<string> o cualquier otro método para establecer los items de tu UserControl.

29
C# / Re: Problema Con Clases
« en: Jueves 29 de Mayo de 2008, 17:32 »
Cuando quieras recuperar un resultado

Por ejemplo, si tienes el método:
static int SUMA(int a, int B ){ etc...

Tu sabes que lo invocas así: SUMA(2, 3) y te devolverá un int. En realidad, para recuperar el valor retornado, tendrás que hacer:
int resultado = SUMA(2, 3);

En tu caso lo mismo:
Tienes una función static void Alea(int[] v) que no devuelve ningún resultado, sólo hace cosas en el vector que le pasas. Lo invocas así:
int[] vectorEjemplo = new int[100]; // Un vector vacío de dimensión 100
Alea(vectorEjemplo); // Esta vez no guardamos el retorno en una variable, porque no hay retorno

Como ves, no esperamos recuperar nada al llamar la función, porque la función no devuelve nada. La función se encargará de rellenar ese vector que le has pasado con 100 nº aleatorios, pero no devuelve ningún resultado.

Entonces, a la pregunta "como se sabe que metodo usar ?" la respuesta es evidente: sólo se puede usar el método de una forma.
--> Si necesitas que devuelva algo, usarás para programarlo: (imagina que quieres que te devuelva un string, por ejemplo)
static string NOMBREMÉTODO(params)
y para invocarlo:
string resultado = NOMBREMÉTODO(params)

- Si no necesitas que devuelva nada, usarás para programarlo:
static void NOMBREMÉTODO(params)
y para invocarlo:
NOMBREMÉTODO(params)

Espero que hayas cogido el concepto  :rolleyes:

30
C# / Re: Problema Con Clases
« en: Miércoles 28 de Mayo de 2008, 15:34 »
- static indica que el método será el mismo para todos los objetos que se instancien a partir de esta clase.
Para variables es fácil de entender, pero para métodos es un poco más dificil. Te lo explico para variables y luego lo re-piensas para métodos.
Imagina una clase con una variable _a. Ahora creas 100 instancias de esa clase. Cada variable _a de cada instancia puede tener un valor diferente.
En cambio, si es "static", el valor de _a es el mismo en las 100 instancias. Si cambias el valor de _a en una instancia, se cambia en el de las 99 restantes (en realidad es el mismo, no es que se cambie).
Para el método, significa que es el mismo para todas las instancias que se creen de esa clase (en tu ejemplo, la clase "prueba1")

- void es el objeto de retorno de ese método. Void significa que ese método no retorna nada al método que lo invoca. Si fuera double, como dices, la función debería retornar un Double. Pero,
- ¿ qué sentido tiene una función que cuando la invocas elimina los números no-primos, y luego te devuelve un Double ?
- ¿ para qué quieres que te devuelva un Double ? ¿ qué significaría ?

pues eso, espero haberme explicado.
sl2

31
C# / Re: Conocer La Semana Del Año Y La Semana Del Mes De U
« en: Martes 20 de Mayo de 2008, 10:18 »
usando System.Globalization

public int CalculaSemana(DateTime elDia) {

    CultureInfo CI= new CultureInfo("es-ES");
    Calendar CAL = CI.Calendar;

    CalendarWeekRule CWR = CalendarWeekRule.FirstDay;
    DayOfWeek DOW = DayOfWeek.Monday;    // Define el primer día de la semana

    return CAL.GetWeekOfYear(elDia, CWR, DOW);

}

Sin embargo no cumple el estandar ISO8601 por un bug.
Pero puedes rascar más para obtener la solución en blogs.msdn.com/shawnste/archive/2006/01/24/517178.aspx

saludos

Edito: el método te da el nº de la semana del año, pero ahora veo que preguntas otra cosa. Le daré un par de vueltas más ...

32
C# / Re: Tomar Parte De Un String
« en: Viernes 16 de Mayo de 2008, 10:40 »
No sé cómo hacerlo, pero creo que sé lo que dices.
Necesitas obtener un Tipo a partir de un string, para poder hacer una instancia de ese tipo. Lo único que tienes es el nombre del tipo (o de la clase, que es un formulario), y necesitas instanciarlo. Creo que debes trastear con Reflection, pero siento no poder ofrecer más que la orientación.

33
C# / Re: Escribir En Un Textbox Multiline
« en: Viernes 9 de Mayo de 2008, 15:29 »
Para cada salto de línea:
textBox13.AppendText(Environment.NewLine);

34
C# / Re: Imagen Se Muestra Solo La Hacer Clic
« en: Miércoles 30 de Abril de 2008, 09:35 »
Si no es lo que dice daniel44, a lo mejor basta con poner un "pictureBox1.Update()" o "pictureBox1.Refresh()" después de asignar la imagen. (nunca sé cual de los dos es el correcto).

35
C# / Re: Importar Dll
« en: Lunes 31 de Marzo de 2008, 12:15 »
Bueno me alegra que lo hayas solucionado.
Espero no encontrarme con un problema así.

sl2

36
C# / Re: Parsear Un Html
« en: Viernes 28 de Marzo de 2008, 16:49 »
Tratalo con las librerias estandar de C# para archivos de texto (StreamWriter y StreamReader. Son subclases de TextWriter y TextReader, por si necesitas otras funcionalidades).

Código: Text
  1. string elPath = @&#34;D:&#092;Temp&#092;archivo.html&#34;;
  2. bool existe = File.Exists(elPath);
  3. if(existe){
  4.     StreamReader SR = new StreamReader(elPath)
  5. }
  6.  

Métodos que puedes emplear:
Read()
ReadLine()   -->   Secuencia de caracteres que termina en \r, \n, o \r\n. La cadena de caracteres devuelta no contiene a estos.

etc ...

saludos

37
C# / Re: Importar Dll
« en: Jueves 27 de Marzo de 2008, 12:32 »
Bueno, por lo menos ahora ya lo tengo más claro, el problema está identificado.
Necesitamos:
- Un struct pasado por referencia.
- El campo Serial_number del struct debe ser un string, ya inicializado, de 8 caracteres y modificable.

Podrías:

Código: Text
  1. // Declaración del Struct
  2. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  3. struct INFO{
  4.    public PICTURE_TYPE Picture_type;
  5.    public char[] Serial_number;
  6.    public byte Range;
  7.    public ushort Code_page;
  8.    public bool bRGB;
  9.    public uint Buffer_16bpp_size;
  10. }
  11.  
  12.  

Código: Text
  1. // Ejecucion en C#:
  2. string fichero = &#34;c:&#092;&#092;fichero.tif&#34;;
  3.  
  4. INFO info = new INFO();
  5. info.Serial_number = new char[8]; // Aquí inicializamos ese campo
  6.  
  7. int intResult = Get_info(fichero, ref info);
  8.  

Como ya está identificado el problema, sólo queda averiguar cual es el tipo correcto que debes pasar, ya inicializado, al campo del Struct.

En el ejemplo anterior he pasado el "Serial_number" inicializado, pero dentro del Array de chars, cada posición no está inicializada todavía. (es decir, "Serial_number" está inicializado, pero Serial_number[1] no).

Si necesitas que también esto esté inicializado, puedes hacer:


Código: Text
  1. // Ejecucion en C#:
  2. string fichero = &#34;c:&#092;&#092;fichero.tif&#34;;
  3.  
  4. INFO info = new INFO();
  5. string str_sernum = &#34;12345678&#34;;
  6. char[] arr_sernum = pr.ToCharArray();
  7. info.Serial_number = arr_sernum; // Aquí inicializamos ese campo
  8.  
  9. int intResult = Get_info(fichero, ref info);
  10.  

Por lo demás, probar qué otros tipos se pueden pasar.

Por otra parte, el StringBuilder se puede también inicializaar de la misma forma.
Código: Text
  1. // Ejecucion en C#:
  2. string fichero = &#34;c:&#092;&#092;fichero.tif&#34;;
  3.  
  4. INFO info = new INFO();
  5. StringBuilder SB_sernum = new StringBuilder(8); // inicializado y declarada su capacidad
  6. info.Serial_number = SB_sernum; // Aquí inicializamos ese campo
  7.  
  8. int intResult = Get_info(fichero, ref info);
  9.  

(El ejemplo era sólo para ver cómo se inicializa, porque el compilador nos ha dicho ya que un StringBuilder no va a servir. En cualquier caso, yo lo probaría porque no cuesta nada).

Suerte.

38
C# / Re: Importar Dll
« en: Miércoles 26 de Marzo de 2008, 19:22 »
A ver, por lo poco que sé, los problemas pueden estar en:

1) Ya lo habrás pensado, pero lo más obvio e inmediato es que, al hacer la llamada de la API desde tu programa, debes pasar el struct como referencia. Supongo que será un parámetro out, y que después de la llamada el struct habrá quedado modificado para que tu dispongas de los datos.
Por tanto, desdde C#, no sólo tienes que declarar la API con sus parámetros "ref",  la llamada debe conterner también los "ref":

Código: Text
  1. // Al llamar al método
  2. Get_info(ref elFilename, ref laInfo);
  3.  

2) El segundo problema que se me ocurre es al serializar el string para pasarlo dentro del struct. Concretamente "public string Serial_number;"
Peeero, los strings en C# son inmutables (si te fijas, cualquier operación sobre un string devuelve una copia del original modificado). Por tanto esa propiedad del struct no podrá ser modificada.
Prueba a pasar un buffer StringBuilder (de System.text) como Serial_number, sería algo así como:

Código: Text
  1. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  2. struct INFO{
  3.     public PICTURE_TYPE Picture_type;
  4.     public StringBuilder Serial_number;
  5.     public byte Range;
  6.     public ushort Code_page;
  7.     public bool bRGB;
  8.     public uint Buffer_16bpp_size;
  9. }
  10.  

Como StringBuilder ya implementa ISerializable, no hace falta definir el "[MarshalAs( loquesea)]"

De momento no se me ocurre nada más ... si se me ocurre algo más ya lo pongo

39
C# / Re: Importar Dll
« en: Miércoles 26 de Marzo de 2008, 11:45 »
Gracias RaYWoLF

Claro, en su momento me leí ese post (y otros muchos) pero mi problema era que no partía de cero y no entendía la mayor parte de las cosas. He estado buceando unos días y he encontrado un poco por aquí, otro por allá ...

Bueno, al final encontré que el libro "C# a fondo" de Tom Archer (McGraw-Hill) tiene un capítulo (el 17) dedicado a Platform Invoke. A partir de esa base, revisando los artículos me he ido enterando más de la película.

Creo que el de Anaya (La biblia de C#) también tiene algo, pero ese no lo tienen en la biblioteca.

En fin, si quieres pon aquí esos structs infernales y les echaremos un ojo, a ver hasta dónde llegamos.

saludos.

40
C# / Re: Grafico De Barras
« en: Martes 25 de Marzo de 2008, 18:41 »
Uno que me parece muy bueno y gratuito es ZedGraph

link: zedgraph.org/wiki/index.php?title=Sample_Graphs

suerte

41
C# / Re: Llamar Metodos
« en: Domingo 23 de Marzo de 2008, 19:30 »
La verdad es que no entiendo muy bien lo que dices.

Dices: "Yo tengo esto, tengo user Control que se llama ctlrControlExpedientes, en este tengo un datagridview"
Pero eso es un Form o un Control ?? cómo puedes tener un dataGridView en un Control ?
Asumo que es un Form, no un "user Control" como dices

El resto lo entiendo a medias. Creo que tienes un Form llamado "frmPacientes" que rellenas con datos.
Al pulsar un botón, los datos se guardan y quieres visualizarlos en el DataGridView de otro form (el Form "ctlrControlExpedientes", que es un Form, no un control).

Supongo que el método invocado en el Form "ctlrControlExpedientes" es "llenargrid()".

Si has seguido una de las opciones anteriores, sólo te queda comprobar si la llamada llega.
Dentro de "llenargrid()" pon una instrucción que te revele si ha llegado hasta ahí, por ejemplo:
MessageBox.Show("Ha llegado a llenargrid()");

Si aparece el PopUp, la llamada SI llega, y tu problema será otro (pero por lo menos este ya está resuelto  :D  ).

Suerte.

42
C# / Re: Llamar Metodos
« en: Domingo 23 de Marzo de 2008, 16:20 »
Como siempre, tienes varias soluciones. Te apunto un par de las que yo uso, dependiendo del caso.

1- El Form que invoca mantiene una referencia del Form que recibe la llamada.
Como dice lalo_soft, el método debe ser público.
Supongamos que tienes dos forms, uno llamado "MainWindow" y otro llamado "Opciones". El método es de "MainWindow", y en un momento dado queremos que lo invoque el Form "Opciones".
En este caso, en el momento de la creación de "Opciones" le pasamos en el constructor la referencia del "MainWindows".

Por ejemplo, si creamos los dos Forms por separado, desde el método de creación hacemos:

Código: Text
  1. MainWindow MW = new MainWindow();
  2. Opciones OP = new Opciones(MW);
  3.  

Evidentemente, en el constructor de "Opciones" deberemos incluir el parámetro de entrada y guardar la referencia en una variable. Imaginemos que lo guardamos en la variable "_mw"
Así, cada vez que queramos invocar el método, desde "Opciones" simplemente haremos:

_mw.ElMetodo(los parametros);

Por ejemplo (2): creamos la "MainWindow" y desde ahí el resto de Forms. En el inicio de este (evento "MainWindow_Load" o incluso en el constructor) crearemos la referencia de "Opciones" y los otros Forms, y le pasamos directamente la referencia del "MainWindow".

Sería:

Código: Text
  1. private void MainWindow_Load(object sender, EventArgs e) {
  2.     Opciones op = new Opciones(this);
  3. }
  4.  

Desde "Opciones" la estrategia sería la misma: guardar en una variable la referencia de la "MainWindow" e invocarla de la misma forma.

2- El Form que invoca no mantiene la referencia.
Esta estrategia es una de las que más uso. En vez de implementar otras estrategias más complejas y elegantes, yo prefiero esta por su simplicidad y flexibilidad.
Me hago una clase pública y estática, que mantiene referencias (estáticas) a objetos que deben ser accedidos desde varios sitios. De esta forma, cada objeto (ya sea un Form o cualquier otro), puede siempre acceder a la propiedad adecuada de la clase estática, que le devolverá siempre la misma referencia, en este caso, el Form cuyo método queremos invocar.
Con un ejemplo se ve más claro. Esta es la clase estática:

Código: Text
  1. static class Globales {
  2.  
  3.         // -----------------------------------
  4.         private static MainWindow mw = null;          // Ventana principal
  5.         public static MainWindow MW{
  6.             get { return mw; }
  7.             set { mw = value; }
  8.         }
  9.         // -----------------------------------
  10.         private static Opciones op = null;                    // Ventana de opciones
  11.         public static Opciones  OP{
  12.             get { return op; }
  13.             set { op = value; }
  14.         }
  15.         // y otros objetos que me interesa mantener como accesibles en cualquier lugar
  16. }
  17.  

Ahora, desde el método Main() de la aplicación, voy creando las instancias y seteandolas en la clase global:

Código: Text
  1. [STAThread]
  2.         static void Main() {
  3.  
  4.         Application.EnableVisualStyles();
  5.         Application.SetCompatibleTextRenderingDefault(false);
  6.  
  7.         Opciones ooo = new Opciones();
  8.         Globales.OP = ooo;
  9.  
  10.         MainWindow mmm = new MainWindow ();
  11.         Globales.MW = mmm;
  12.  
  13.         // corremos la ventana ppal
  14.         Application.Run(mmm);
  15.  
  16. }
  17.  

Y así, sin guardar la referencia, desde "Opciones" siempre podemos hacer:

Código: Text
  1. Globales.MW.ElMetodo(los parametros);
  2.  

Hay otras soluciones, pero supongo que con una de estas ya te vale.
Saludos.

43
C# / Re: Importar Dll
« en: Miércoles 19 de Marzo de 2008, 15:15 »
Perdón por el lapsus, se me olvidó indicar que se trata de una dll de C++.
Me refiero a usar el "[DllImport ... " para dll "unmanaged"
¿ algún tutorial donde lo expliquen desde cero ?
He buscado en CodeProject y otros, pero sin mucho éxito. Aunque hay artículos donde explican algo, ninguno es del tipo "desde el principio".
gracias

44
C# / Importar Dll
« en: Martes 18 de Marzo de 2008, 19:48 »
Hola amigos

Aprovecho para presentarme al foro. Soy un programador casual (sólo programo aplicaciones para mi mismo) y autodidacta (no soy informático) pero llevo bastante tiempo programando. La experiencia es un grado, aunque debo admitir que a veces me cuesta demasiado.
En fin, espero pasarme por aquí a menudo, ahora que conozco el foro, y aportar lo que buenamente pueda.

Venga, ahí va la primera pregunta:
¿ dónde puedo aprender a importar dlls compiladas en un programa C# ? (y a usar sus APIs claro). Concretando, ¿ conocéis algún buen tutorial en algún sitio donde lo expliquen ?

muchas gracias

Páginas: 1 [2]