Anda di halaman 1dari 8

Trucos C#

Carga y ejecucin de archivos de video


Una de las formas para mostrar un video en .NET es recurrir al sistema ntivo del sistema operativo, el cual consiste en utilizar las funciones de la API de Windows contenidas en la librera dinmicawinmm.dll. En el programa adjunto se muestra como hacer una llamada externa a esta librera y como utilizar la funcin mciSendString para abrir archivos de video de los formatos AVIVideo y MPEG y realizar algunas acciones con ellos. Con algunos cambios bsicos, este mecanismo tambien funciona para cargar y ejecutar diferentes archivos multimedia.

Descargar fuentes en SharpDevelop

Justificacin de un texto para imprimir


Cuando se desarrollan aplicaciones que tienen que enviar a la impresora un texto de cierto tamao, es muy comn 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 mtodo grfico 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 lnea de texto no ocupa todo el espacio disponible entre el margen izquierdo y el margen derecho de la hoja. Si dicha lnea 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 ms las palabras que conforman la lnea de texto de tal manera que se cubra el espacio sobrante. Aqu se presenta un mtodo 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 lneas de texto alcanzan en la hoja que se va a utilizar y luego se imprime lnea por lnea colocando las palabras que las conforman en el lugar adecuado. Para ello se divide el espacio sobrante de cada rengln entre todas las palabras que conforman la lnea de texto. En el archivo adjunto se muestra el mtodo de justificacin y un ejemplo de su uso.

Descargar fuentes en SharpDevelop

Exportacin 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 instruccin en el encabezado del archivo fuente donde vaya a trabajar:

using Excel = Microsoft.Office.Interop.Excel;


El siguiente mtodo muestra la forma de abrir un libro de Excel, crear una hoja electrnica y exportar datos hacia ella:

void AgregarDatosExcel() { object opcional = Type.Missing; var excelAplicacion = new Excel.Application(); excelAplicacion.Visible = true; // Agregar un nuevo libro excelAplicacion.Workbooks.Add(opcional); for (int h = 1; h < 4; h++) { // Agregar una nueva hoja al libro excelAplicacion.Worksheets.Add(opcional, opcional, opcional, opcional); // Establecer un objeto worksheet que apunte hacia la hoja activa Excel._Worksheet worksheetHoja = (Excel.Worksheet)excelAplicacion.ActiveSheet; // Colocar encabezados en las celdas A1 y B1. worksheetHoja.Cells[1, "A"] = "Columna 1"; worksheetHoja.Cells[1, "B"] = "Columna 2"; // Colocar nombre a la hoja worksheetHoja.Name = "Hoja nmero " + h.ToString(); // Agregar datos en las celdas for (int i = 2; i < 101; i++) { worksheetHoja.Cells[i, "A"] = i; worksheetHoja.Cells[i, "B"] = 2 * i; } } }

Eliminacin de un elemento de una matriz unidimensional


La mayora de tareas que se permite hacer en .NET con un matriz unidimensional se encuentran definidas en la clase Array. Sin embargo esta no posee un mtodo que nos permita eliminar un elemento de un vector cualquiera, y al mismo tiempo redimensionarlo. Una solucin a este problema consiste en definir un mtodo que cree una nueva matriz unidimensional, con tamao menor al tamao de la matriz original, y copiar todos los elementos que se deseen conservar, menos aquel que vamos a desechar. Al final se asigna a la matriz original la direccin de memoria de la nueva matriz. Y para permitir que nuestro mtodo sea til a cualquier tipo de matriz, se utiliza un mtodo de tipos genricos. En el siguiente cdigo se muestra el mtodo QuitarElemento y la forma de aplicarlo:

class Programa { public static void Main(string[] args) { int[] numero = new int[]{12, 25, 10, 5}; Arreglo.QuitarElemento(ref numero, 0); for (int i = 0; i < numero.GetLength(0); i++) { Console.WriteLine(numero[i].ToString());

} Console.ReadKey(true); } } class Arreglo { public static void QuitarElemento<Tipo>(ref Tipo[] vector, int indice) { int tamanoVector = vector.GetLength(0); if (indice >= tamanoVector | indice < 0) throw new Exception("El valor del ndice est por " + "fuera del rango permitido"); Tipo[] auxiliar = new Tipo[tamanoVector - 1]; int j = 0; for (int i = 0; i < tamanoVector; i++) { if (i != indice) { auxiliar[j] = vector[i]; j++; } } vector = auxiliar; } }

Desarrollo de aplicaciones con plugins


Para desarrollar la arquitectura de una aplicacin que requiera extensibilidad y personalizacin es necesario disear una infraestructura de complementos, o lo que estamos acostumbrados a identificar como plugins. Un complemento o plugin es un componente de software que tiene la posibilidad de entregarse e instalarse por separado, y que consiste de unos o varios archivos que son ledos y cargados por la aplicacin principal para agregar nuevas funciones o modificar las ya existentes. El diseo y programacin de este tipo de aplicaciones requiere de un mayor grado de anlisis y generalizacin, 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 fcil mantenimiento. En este artculo vamos a explicar una de las formas de programar una aplicacin que acepta complementos. Nuestra aplicacin, muy elemental por cierto, estar conformada por una ventana con una barra de men que incluye los tems Archivo y Complementos. Lo primero que haremos es desarrollar la infraestructura de software que acepta los complementos. El estilo utilizado en este primer artculo deja de lado muchos detalles tcnicos en pro de facilitar la comprensin por parte del lector.

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. Esta propiedad hace que un operador se comporte de acuerdo al tipo de operandos a los que se aplique...

Descargar

Calcular la diferencia entre dos fechas


Una funcin 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. Por ejemplo, se conoce la fecha de nacimiento de una persona y con base en la fecha actual del sistema se quiere calcular su edad. A continuacin se describe una forma de hacerlo en .NET. En .NET los valores de tipo fecha y hora se manejan mediante el tipo DateTime, 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 ao 1 y las 23:59:59 del 31 de diciembre de 9999, de la Era Cristiana. Para establecer un intervalo comprendido entre dos instantes de tiempo se puede utilizar el tipo de valores denominado TimeSpan, que devuelve un valor representado en das, horas, minutos y segundos.

La siguiente clase permite definir variables que calculan la diferencia entre dos instantes de tiempo establecidos:
public class Intervalo { DateTime fecha1; DateTime fecha2; public Intervalo() { } public DateTime Fecha1 { set { fecha1 = value; } } public DateTime Fecha2 { set { fecha2 = value; } } // Retorna la diferencia entre las dos fechas public TimeSpan Diferencia { get { return fecha1 - fecha2; } } }

El siguiente ejemplo muestra un mtodo asociado al evento clic de un botn de comando, donde se utiliza la clase anterior para encontrar la diferencia entre dos fechas conocidas: void Button1Click(object sender, EventArgs e) { Intervalo tiempo = new Intervalo();

tiempo.Fecha1 = Convert.ToDateTime("21/05/2009"); tiempo.Fecha2 = Convert.ToDateTime("22/10/2005"); MessageBox.Show(tiempo.Diferencia.ToString()); } Para calcular la edad, basta con asignar a la segunda fecha del objeto tipo Intervalo, la fecha actual del sistema que se encuentra en la propiedad esttica Now de la estructura DateTime. El siguiente mtodo muestra un ejemplo que permite calcular la edad con base en la fecha de nacimiento leda desde una caja de texto: void Button2Click(object sender, EventArgs e) { int anos = 0; Intervalo edad = new Intervalo(); edad.Fecha1 = DateTime.Now; edad.Fecha2 = Convert.ToDateTime(TextFecha.Text); // Edad en aos anos = (int)(edad.Diferencia.Days / 365.25); MessageBox.Show(anos.ToString()); }

Descargar fuentes en SharpDevelop

Simplificacin de nmeros fraccionarios


Primero recordemos que simplificar un fraccionario consiste en escribirlo de tal manera que el numerador y el denominador sean comprimos. Esto quiere decir que al descomponerlos en fractores primos, no tengan factores en comn. Una forma muy utilizada por los matemticos para simplificar un fraccionario consiste en descomponer en sus fractores primos, tanto el numerador como el denominador, y eliminar aquellos factores que sean comunes a los dos. Y es este principio el que vamos a aplicar para resolver el problema planteado. Para empezar se necesita un mtodo que se encargue de descomponer un nmero en sus factores primos. El siguiente mtodo descompone un numero en sus factores comunes y los devuelve en un vector tipo int.

private int[] GenerarPrimos(int numero) { int[] primos = null; int i = 2; int j = 0; do { if (numero % i == 0) { numero = numero / i; Array.Resize(ref primos, j + 1); primos[j] = i; j++; } else

i++; } while(i <= numero); return primos; } Como no se conoce cuantos factores puede contener un nmero se define un vector sin dimensionar. El tamao se este se establece en ejecucin, cada que aparece un nuevo factor primo, mediante Array.Resize. El siguiente mtodo se encarga de identificar aquellos factores que sean iguales en el numerador y el denominador y los reemplaza por un 1. public void Simplificar() { int[] primosNumerador, primosDenominador; int i = 0, j = 0; // Encontrar los factores primos del numerador // y del denominador y guardarlos en un vector primosNumerador = GenerarPrimos(numerador); primosDenominador = GenerarPrimos(denominador); // Eliminar de cada vector los factores primos repetidos // reemplazandolos por 1 while (i < primosNumerador.Length) { while (j < primosDenominador.Length) { if (primosNumerador[i] == primosDenominador[j]) { primosNumerador[i] = 1; primosDenominador[j] = 1; break; } j++; } i++; j = 0; } // Encontrar el producto de las componentes de cada vector // (aqu tiene importancia haber reemplazado con 1) int a = ProductoComponentes(primosNumerador); int b = ProductoComponentes(primosDenominador); // Los productos encontrados son la simplificacin del // fraccionario numerador = a; denominador = b; } La razn de reemplazar los factores comunes por un 1, es que el siguiente paso ser multiplicar los factores no eliminados. De esta forma se obtiene la simplificacin del nmero. El mtodo que vienen a continuacin es quin se encarga de multiplicar las componentes del vector resultante.

private int ProductoComponentes(int[] vector) { int p = 1, i = 0; while (i < vector.Length) { p = p * vector[i]; i++; } return p; }

Trabajar con punteros en C#


Para trabajar con punteros en C# se debe establecer un contexto no seguro. Este se fija mediante la instruccin unsafe, el cual puede utilizarse en la declaracin de un tipo o un miembro. Toda la extensin textual del tipo o del miembro se considera, por lo tanto, como contexto no seguro. Por ejemplo, el siguiente mtodo Main se ha declarado como contexto no seguro y esto permite trabajar con punteros en todo su cuerpo.

using System; public class Punteros { unsafe static void Main() { int numero = 10; int *direccionNumero; // define un puntero direccionNumero = &numero; // la direccin de numero al puntero *direccionNumero = 95; // asignar 95 en la direccin de numero Console.WriteLine("numero = {0}", numero); } } La variable numero almacena, inicialmente, el valor 10. A la variable puntero direccionNumerose le asigna la direccin de numero. Al asignar un numero en la direccin a la que apunta el puntero lo que en realidad se est haciendo es cambiar el valor que tena numero. Para compilar programas que manejan punteros se debe llamar al compilador con el parmetro unsafe. As: > csc /unsafe punteros.cs

Prrafos contenidos en un TextBox


Para obtener los prrafos de un texto contenido en un TextBox basta con utilizar la propiedad Lines de esta clase. Esta propiedad forma una matriz unidimensional con las lineas que conforman el texto. Entendiendose por lineas a los grupos de caracteres comprendidos entre dos saltos de lnea consecutivos.

El siguiente mtodo recibe como argumento un TextBox y devuelve una matriz string[] con los prrafos que conforman su contenido, excluyendo a los prrafos vacos.

public static string[] Parrafos(System.Windows.Forms.TextBox cajaTexto) { string[] parrafos = new string[0]; int lineas = cajaTexto.Lines.GetLength(0); int k = 0; for (int i = 0; i < lineas; i++) { if (cajaTexto.Lines[i].Trim().Length > 0) { Array.Resize(ref parrafos, k + 1); parrafos[k] = cajaTexto.Lines[i]; k++; } } return parrafos; }

Microsoft SQL Server 2008 R2

Anda mungkin juga menyukai