You are on page 1of 8

Trucos C#

Carga y ejecución de archivos de video
Una de las formas para mostrar un video en .NET es recurrir al sistema nátivo del sistema operativo, el cual consiste en utilizar las funciones de la API de Windows contenidas en la librería dinámicawinmm.dll. En el programa adjunto se muestra como hacer una llamada externa a esta librería y como utilizar la función mciSendString para abrir archivos de video de los formatos AVIVideo y MPEG y realizar algunas acciones con ellos. Con algunos cambios básicos, este mecanismo tambien funciona para cargar y ejecutar diferentes archivos multimedia.

Descargar fuentes en SharpDevelop

Justificación de un texto para imprimir
Cuando se desarrollan aplicaciones que tienen que enviar a la impresora un texto de cierto tamaño, es muy común desear que este aparezca justificado por la izquierda y por la derecha, como lo hacen los modernos procesadores de texto. Sin embargo, .NET no ha implementado una método gráfico que se encargue de hacer este trabajo directamente y solo permite justificar a uno de los dos lados, a la izquierda o a la derecha. Generalmente una línea de texto no ocupa todo el espacio disponible entre el margen izquierdo y el margen derecho de la hoja. Si dicha línea se justifica por la izquierda, habrá un espacio sobrante entre el final de la última palabra y el margen derecho. Entonces, lo que se debe hacer es separar un poco más las palabras que conforman la línea de texto de tal manera que se cubra el espacio sobrante. Aquí se presenta un método que se encarga de justificar un texto a izquierda y derecha para luego ser enviado a la impresora. El truco, es muy simple. Primeramente, se determinan cuantas líneas de texto alcanzan en la hoja que se va a utilizar y luego se imprime línea por línea colocando las palabras que las conforman en el lugar adecuado. Para ello se divide el espacio sobrante de cada renglón entre todas las palabras que conforman la línea de texto. En el archivo adjunto se muestra el método de justificación y un ejemplo de su uso.

Descargar fuentes en SharpDevelop

Exportación de datos a Excel
Para interactuar con Excel, mediante C# y .NET, lo primero que se necesita es establecer una referencia a Microsoft.Office.Interop.Excel. Luego, para facilitar las cosas, establezca una directriz using que referencie este espacio de nombres mediante el alias Excel. Para ello incluya la siguiente instrucción en el encabezado del archivo fuente donde vaya a trabajar:

using Excel = Microsoft.Office.Interop.Excel;
El siguiente método muestra la forma de abrir un libro de Excel, crear una hoja electrónica y exportar datos hacia ella:

Sin embargo esta no posee un método que nos permita eliminar un elemento de un vector cualquiera. h++) { // Agregar una nueva hoja al libro excelAplicacion.Cells[i.WriteLine(numero[i].Cells[1. . y al mismo tiempo redimensionarlo. Arreglo. Al final se asigna a la matriz original la dirección de memoria de la nueva matriz. for (int i = 0. opcional. i < 101. Y para permitir que nuestro método sea útil a cualquier tipo de matriz._Worksheet worksheetHoja = (Excel. opcional. En el siguiente código se muestra el método QuitarElemento y la forma de aplicarlo: class Programa { public static void Main(string[] args) { int[] numero = new int[]{12.Add(opcional. worksheetHoja.ToString()). 10. excelAplicacion. // Colocar nombre a la hoja worksheetHoja.QuitarElemento(ref numero. // Colocar encabezados en las celdas A1 y B1. i++) { worksheetHoja.Workbooks.Worksheets.ActiveSheet. se utiliza un método de tipos genéricos. i < numero.Cells[i. "B"] = 2 * i. 5}. h < 4.Add(opcional). "B"] = "Columna 2".void AgregarDatosExcel() { object opcional = Type. // Agregar datos en las celdas for (int i = 2.Visible = true. for (int h = 1.Application(). opcional). var excelAplicacion = new Excel. "A"] = "Columna 1". worksheetHoja. i++) { Console.Worksheet)excelAplicacion. menos aquel que vamos a desechar. "A"] = i. } } } Eliminación de un elemento de una matriz unidimensional La mayoría de tareas que se permite hacer en . Una solución a este problema consiste en definir un método que cree una nueva matriz unidimensional. // Establecer un objeto worksheet que apunte hacia la hoja activa Excel. y copiar todos los elementos que se deseen conservar.Name = "Hoja número " + h. 0).GetLength(0).ToString().Missing. // Agregar un nuevo libro excelAplicacion.NET con un matriz unidimensional se encuentran definidas en la clase Array. con tamaño menor al tamaño de la matriz original. 25.Cells[1. worksheetHoja.

int j = 0.. o lo que estamos acostumbrados a identificar como plugins. estará conformada por una ventana con una barra de menú que incluye los ítems Archivo y Complementos. muy elemental por cierto.. } } vector = auxiliar. Nuestra aplicación. . Tipo[] auxiliar = new Tipo[tamanoVector .} Console. Descargar Sobrecarga de operadores La sobrecarga de operadores es una propiedad que hace parte del polimorfismo que debe ser capaz de implementar un buen lenguaje orientado a objetos. y que consiste de unos o varios archivos que son leídos y cargados por la aplicación principal para agregar nuevas funciones o modificar las ya existentes. El diseño y programación de este tipo de aplicaciones requiere de un mayor grado de análisis y generalización. El estilo utilizado en este primer artículo deja de lado muchos detalles técnicos en pro de facilitar la comprensión por parte del lector.GetLength(0).ReadKey(true).1]. En este artículo vamos a explicar una de las formas de programar una aplicación que acepta complementos. i < tamanoVector. } } Desarrollo de aplicaciones con plugins Para desarrollar la arquitectura de una aplicación que requiera extensibilidad y personalización es necesario diseñar una infraestructura de complementos. for (int i = 0. Lo primero que haremos es desarrollar la infraestructura de software que acepta los complementos. int indice) { int tamanoVector = vector. Esta propiedad hace que un operador se comporte de acuerdo al tipo de operandos a los que se aplique. Un complemento o plugin es un componente de software que tiene la posibilidad de entregarse e instalarse por separado. } } class Arreglo { public static void QuitarElemento<Tipo>(ref Tipo[] vector. i++) { if (i != indice) { auxiliar[j] = vector[i]. if (indice >= tamanoVector | indice < 0) throw new Exception("El valor del índice está por " + "fuera del rango permitido"). lo cual se traduce en mayor esfuerzo por parte del equipo de desarrollo. pero los resultados bien lo valen ya que se obtienen productos de software con un alto grado de versatilidad y sobre todo de fácil mantenimiento. j++.

EventArgs e) { Intervalo tiempo = new Intervalo().NET. el cual es definido por una estructura que permite establecer tipos de valores que representan fechas y horas comprendidos entre la medianoche (00:00:00) del 1 de enero del año 1 y las 23:59:59 del 31 de diciembre de 9999. } } } El siguiente ejemplo muestra un método asociado al evento clic de un botón de comando. que devuelve un valor representado en días. A continuación se describe una forma de hacerlo en . se conoce la fecha de nacimiento de una persona y con base en la fecha actual del sistema se quiere calcular su edad. public Intervalo() { } public DateTime Fecha1 { set { fecha1 = value. Por ejemplo. donde se utiliza la clase anterior para encontrar la diferencia entre dos fechas conocidas: void Button1Click(object sender. La siguiente clase permite definir variables que calculan la diferencia entre dos instantes de tiempo establecidos: public class Intervalo { DateTime fecha1. Para establecer un intervalo comprendido entre dos instantes de tiempo se puede utilizar el tipo de valores denominado TimeSpan.NET los valores de tipo fecha y hora se manejan mediante el tipo DateTime. } } public DateTime Fecha2 { set { fecha2 = value. de la Era Cristiana. horas. En . .Descargar Calcular la diferencia entre dos fechas Una función que se suele necesitar con frecuencia en los sistemas que procesan datos es la de poder calcular un intervalo de tiempo con base en dos fechas conocidas. minutos y segundos. } } // Retorna la diferencia entre las dos fechas public TimeSpan Diferencia { get { return fecha1 . DateTime fecha2.fecha2.

j++. primos[j] = i. basta con asignar a la segunda fecha del objeto tipo Intervalo.tiempo.Fecha2 = Convert. Y es este principio el que vamos a aplicar para resolver el problema planteado.Days / 365. no tengan factores en común. MessageBox.ToString()).Show(tiempo. edad.Fecha1 = DateTime. Array. tiempo. do { if (numero % i == 0) { numero = numero / i.Show(anos. El siguiente método muestra un ejemplo que permite calcular la edad con base en la fecha de nacimiento leída desde una caja de texto: void Button2Click(object sender. } Descargar fuentes en SharpDevelop Simplificación de números fraccionarios Primero recordemos que simplificar un fraccionario consiste en escribirlo de tal manera que el numerador y el denominador sean comprimos. } Para calcular la edad.ToString()). int i = 2. edad.ToDateTime(TextFecha. El siguiente método descompone un numero en sus factores comunes y los devuelve en un vector tipo int. Intervalo edad = new Intervalo().Resize(ref primos.Diferencia. } else . tanto el numerador como el denominador. private int[] GenerarPrimos(int numero) { int[] primos = null. int j = 0.Text).Now. Una forma muy utilizada por los matemáticos para simplificar un fraccionario consiste en descomponer en sus fractores primos. // Edad en años anos = (int)(edad.Fecha1 = Convert. Para empezar se necesita un método que se encargue de descomponer un número en sus factores primos.25). j + 1). la fecha actual del sistema que se encuentra en la propiedad estática Now de la estructura DateTime. EventArgs e) { int anos = 0. y eliminar aquellos factores que sean comunes a los dos.ToDateTime("21/05/2009").Diferencia. MessageBox. Esto quiere decir que al descomponerlos en fractores primos.ToDateTime("22/10/2005").Fecha2 = Convert.

mediante Array. El tamaño se este se establece en ejecución. } La razón de reemplazar los factores comunes por un 1. El siguiente método se encarga de identificar aquellos factores que sean iguales en el numerador y el denominador y los reemplaza por un 1. El método que vienen a continuación es quién se encarga de multiplicar las componentes del vector resultante.Resize. } i++. } while(i <= numero). j = 0. cada que aparece un nuevo factor primo. primosDenominador.Length) { if (primosNumerador[i] == primosDenominador[j]) { primosNumerador[i] = 1. j = 0. De esta forma se obtiene la simplificación del número. int b = ProductoComponentes(primosDenominador). // Eliminar de cada vector los factores primos repetidos // reemplazandolos por 1 while (i < primosNumerador. break. . // Los productos encontrados son la simplificación del // fraccionario numerador = a. } Como no se conoce cuantos factores puede contener un número se define un vector sin dimensionar. } j++. // Encontrar los factores primos del numerador // y del denominador y guardarlos en un vector primosNumerador = GenerarPrimos(numerador). public void Simplificar() { int[] primosNumerador. return primos. } // Encontrar el producto de las componentes de cada vector // (aquí tiene importancia haber reemplazado con 1) int a = ProductoComponentes(primosNumerador). int i = 0. primosDenominador[j] = 1. primosDenominador = GenerarPrimos(denominador).i++. denominador = b. es que el siguiente paso será multiplicar los factores no eliminados.Length) { while (j < primosDenominador.

i = 0. } Trabajar con punteros en C# Para trabajar con punteros en C# se debe establecer un contexto no seguro. el siguiente método Main se ha declarado como contexto no seguro y esto permite trabajar con punteros en todo su cuerpo. // define un puntero direccionNumero = &numero. } } La variable numero almacena. // la dirección de numero al puntero *direccionNumero = 95.private int ProductoComponentes(int[] vector) { int p = 1. numero). A la variable puntero direccionNumerose le asigna la dirección de numero. Por ejemplo. por lo tanto. Entendiendose por lineas a los grupos de caracteres comprendidos entre dos saltos de línea consecutivos. Este se fija mediante la instrucción unsafe. i++. public class Punteros { unsafe static void Main() { int numero = 10. int *direccionNumero.WriteLine("numero = {0}". el cual puede utilizarse en la declaración de un tipo o un miembro. Esta propiedad forma una matriz unidimensional con las lineas que conforman el texto. el valor 10.cs Párrafos contenidos en un TextBox Para obtener los párrafos de un texto contenido en un TextBox basta con utilizar la propiedad Lines de esta clase. como contexto no seguro. // asignar 95 en la dirección de numero Console. . Así: > csc /unsafe punteros.Length) { p = p * vector[i]. Para compilar programas que manejan punteros se debe llamar al compilador con el parámetro unsafe. inicialmente. Al asignar un numero en la dirección a la que apunta el puntero lo que en realidad se está haciendo es cambiar el valor que tenía numero. } return p. using System. while (i < vector. Toda la extensión textual del tipo o del miembro se considera.

k++. } Microsoft SQL Server 2008 R2 .GetLength(0).TextBox cajaTexto) { string[] parrafos = new string[0].Lines[i]. } } return parrafos.Forms. k + 1).Trim(). parrafos[k] = cajaTexto. i++) { if (cajaTexto. public static string[] Parrafos(System.Resize(ref parrafos.El siguiente método recibe como argumento un TextBox y devuelve una matriz string[] con los párrafos que conforman su contenido.Length > 0) { Array. int lineas = cajaTexto. for (int i = 0. excluyendo a los párrafos vacíos.Lines. int k = 0.Windows. i < lineas.Lines[i].