Weblogs Código

RecorteX

» moisesmarquez
73 usuarios y 244 recortes de código
Usuario

Contraseña
Crear cuenta
Estás viendo los recortes del usuario moisesmarquez

RSS
Recortes: 5
Registrado: 30/8/2006
Web

Etiquetas:
csharp (3)
win32 (1)
Java (1)
PHP (1)
registro (1)
splash (1)
Explorer (1)

Filtrar archivos de un directorio por extensión

Si has tenido que mostrar alguna vez las entradas de un directorio y has tenido que filtrarlas de alguna forma (para ver, por ejemplo, todos los archivos de texto, los archivos XML, las imágenes …) posiblemente lo hayas resuelto abriendo el directorio, leyendo una a una cada entrada, comparándola con lo que buscabas y, después de hacer lo que necesitas, cerrando el directorio.

Pues has hecho mal. Existe una forma mucho más rápida de hacerlo. En PHP desde la versión 4.3 se hace uso de una función también disponible en la biblioteca estándar de C llamada glob().

En PHP su uso es, como suele suceder con todas las demás, mucho más fácil que en C. Pero qué mejor que un ejemplo:


<?php
foreach (glob("*.txt") as $nombre_archivo)
{
    echo $nombre_archivo ' con tamaño ',
      filesize($nombre_archivo), " bytes\n";
}
?>

Esto mostrará una salida como esta:


archivo1.txt con tamaño 44686 bytes
archivo2.txt con tamaño267625 bytes
archivo3.txt con tamaño137820 bytes

JComboBox con más de una columna

Para esas ocasiones en que necesitemos un Combo que nos muestre un valor pero queremos que almacene información adicional de cada uno de los elementos nada más fácil que esto.

  String columnas[] = new String[2];
  columnas[0] = id;
  columnas[1] = etiqueta;
  combo.addItem (columnas);
Con esto nos guardará la información que necesitemos. Y con este otro nos mostrará tan solo lo que nosotros querramos.

combo.setRenderer (new DefaultListCellRenderer()
{
  public java.awt.Component getListCellRendererComponent (
    JList l,Object o,int i,boolean s, boolean f)
  {
     return new JLabel (((String[])o)[1]);
  }
});

C#, Registro y booleanos

No se si os habrá pasado alguna vez. Al intentar leer un valor lógico del registro con C# me dice sencillamente, que me busque la vida.
Así que, hago esto que es igual de rápido y así de fácil:

valor_logico = ((int)clave.GetValue (nombreCadena)) == 1;
Para leer los datos del registro. Suponiendo que clave es un RegistryKey ya abierto. Y:

clave.SetValue (nombreCadena, valor_logico ? 1 : 0, RegistryValueKind.DWord);
para escribirlo.

No es muy complicado ¿ verdad ?

Splash con operación larga en inicio

Si al arrancar tu aplicación tienes que hacer una operación que puede tardar varios minutos puede llegar a desesperar al usuario.
Para eso se supone que se inventaron las ventanas de splash. Sin embargo, si en esa ventana de splash quieres poner una imagen animada, una barra de progreso o cualquier otra cosa para demostrar al usuario que no se le ha colgado la aplicación hay que dar un pequeño rodeo. Al menos es la mejor forma que he encontrado. De cualquier otra forma, mostraremos un bonito rectángulo gris que no dará demasiada buena imagen de lo que hemos hecho.

Primero creo una clase que encapsulará el trabajo con la ventana de splash.

public class GestionVentana
{
   Progreso progreso;
   InvConf.Configuracion conf;

   public GestionVentana (ref InvConf.Configuracion conf, ref Progreso progreso)
   {
      this.conf = conf;
      this.progreso = progreso;
   }

   public void bw_RunWorkerCompleted (object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
   {
      this.progreso.Hide ();
   }

   public void bw_DoWork (object sender, System.ComponentModel.DoWorkEventArgs e)
   {
      // Esta es la función que tarda varios minutos
      this.conf.procesarEquipo ();
   }
}
Y después en el método principal debemos insertar algo como esto:

System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker ();

GestionVentana gv = new GestionVentana (ref conf, ref progreso);
bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler
   (gv.bw_RunWorkerCompleted);
bw.DoWork += new System.ComponentModel.DoWorkEventHandler (gv.bw_DoWork);
bw.RunWorkerAsync ();

while (bw.IsBusy)
{
   // O cualquier otra actualización en la interfaz que queramos realizar.
   Application.DoEvents ();
}

Obtener la versión de Explorer desde C#

Internet Explorer, al contrario que otros navegadores, no almacena la versión actual de su navegador en el registro. La única forma de obtenerlo es accediendo a la función DllGetVersion presente en la librería "shdocvw.dll" que es la encargada de realizar el renderizado de las páginas.
Para ello tan solo debemos realizar los siguientes sencillos pasos:

1º Declarar la función y la librería en la que se encuentra dentro de la clase que va a utilizarlo.
 
[System.Runtime.InteropServices.DllImport ("shdocvw.dll")]
private static extern int DllGetVersion (ref DLLVERSIONINFO pdvi);
 
2º Definir la estructura que almacenará la información de la versión
 
struct DLLVERSIONINFO
{
  public uint cbSize,
  dwMajorVersion,
  dwMinorVersion,
  dwBuildNumber,
  dwPlatformID;
}
 
3º Llamar a la función y obtener la información.
 
DLLVERSIONINFO dvi = new DLLVERSIONINFO ();
dvi.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf (dvi);
int resultado = DllGetVersion (ref dvi);
 
if (resultado == 0)
  return string.Format ("{0}.{1}.{2}", dvi.dwMajorVersion, dvi.dwMinorVersion, dvi.dwBuildNumber);
else
  return "?";
 
Proyecto: Juanjo Navarro, 2006 - Diseño: Albin