Seleccionar carpetas con un cuadro de dialogo en C#

Que tal Pecorones, ¿Como están?

Hace tiempo que publiqué en este blog un post para enseñarles a seleccionar archivos mediante un cuadro de dialogo. Hoy vamos a hacer lo mismo pero para seleccionar carpetas. Esto resulta útil para cuando nuestro sistema debe trabajar con los archivos de una determinada carpeta y le brindamos al usuario la opción de indicar dicha carpeta.

Bueno, sin más les dejo aquí el código.

/// <summary>
/// Permite seleccionar una carpeta del equipo mediante un cuadro de dialogo.
/// </summary>
/// <param name=”_title”>Descripción o título del cuadro de dialogo.</param>
/// <returns>value-> Nombre de carpeta, empty-> No se seleccionó carpeta.</returns>
public string m_selectPath(string _title = “”)
{
string value = string.Empty;
FolderBrowserDialog fbd = new FolderBrowserDialog();
DialogResult result;
try
{
fbd.Description = !string.IsNullOrEmpty(_title) ? _title : “Seleccione carpeta.”;
fbd.ShowNewFolderButton = true;
result = fbd.ShowDialog();
value = (result == DialogResult.Yes || result == DialogResult.OK) ? fbd.SelectedPath : string.Empty;
fbd.Dispose();
}
catch (Exception ex)
{

}
return value;
}

 

Obtener directorio y archivo actual de la aplicación en C#.

Que tal Pecorones, ¿Como están?

Hoy les voy a mostrar como obtener la ruta de la carpeta de donde se está ejecutando nuestro sistema y el archivo que se está ejecutando. Esto es muy útil para trabajar con archivos en nuestra aplicación usando rutas relativas en lugar de absolutas, lo que permite una mayor portabilidad.

Bueno, sin más les dejo aquí el código.

/// <summary>
/// Permite obtener la ruta del directorio de ejecución de la aplicación
/// </summary>
/// <returns>value-> Proceso exitoso. empty-> Proceso fallido.</returns>
public string m_getLocalAppPath()
{
string value = string.Empty;
try
{
value = System.AppDomain.CurrentDomain.BaseDirectory;
}
catch (Exception ex)
{

}
return value;
}

/// <summary>
/// Permite obtener la ruta del archivo de ejecución de la aplicación
/// </summary>
/// <returns>value-> Proceso exitoso. empty-> Proceso fallido.</returns>
public string m_getLocalAppFile()
{
string value = string.Empty;
try
{
value = System.AppDomain.CurrentDomain.BaseDirectory + System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
}
catch (Exception ex)
{

}
return value;
}

¿Que hacer con la PS4 actual ante la inminente llegada de una PS4K Neo?

Que tal Pecorones ¿Como están?

Hoy quiero expresar mi opinión con respecto a un tema muy actual, y es que como sabrán, cada vez falta poco para que Sony ponga a la venta su nueva versión de la PS4, la cual al día de hoy es válido llamar PS4k, PS4.5, PS4 Neo, etc.

Sony asegura que fuera de la evidente y mejor capacidad gráfica, no existirá ninguna otra diferencia entre ambas consolas, las dos van a compartir el mismo catalogo de juegos, las mismas opciones y privilegios para jugar en linea, los videojuegos costarán lo mismo y las dos podrán utilizar el sistema PS VR “sin problema”. Quiero suponer que en cuanto al precio, la PS4k costará lo mismo que la PS4 actual, y el modelo actual reducirá su costo.

Con estos datos podemos preguntar.

1) ¿Si ya compré el modelo actual, que puedo hacer?
Bueno, lamentablemente como consumidores no nos queda de otra mas que aceptar que Sony y las demás compañías pueden hacer lo que les venga en gana. Si eres una de esas personas (disculpen la expresión pero no encuentro una mejor) que cagan dinero, o cuyos padres y familiares cagan dinero, pues compra la nueva versión.

Si tienes una pantalla 4K y de verdad quieres la nueva versión entonces vende tu PS4 actual a un amigo o familiar y con otro poco mas de $$$ podrías comprar la nueva versión.

Si no tienes ni una pantalla 4K ni $$$ entonces conserva tu consola actual

2) ¿Vale la pena comprar el modelo mas reciente?
Como decía antes, a menos que tengas una pantalla 4K y tu o tus familiares caguen dinero, entonces si, puedes ir y comprar la nueva versión.

O si no has comprado la PS4 actual, puedes esperar un poco mas y esperar la nueva versión.

Considera que para sacarle todo el jugo a la PS4K necesitarás forzosamente una buena pantalla 4K, personalmente pienso que el tamaño debe ser al menos de 60 pulgadas pues mientras mas pequeña es una pantalla mas difícil es apreciar la diferencia entre 4K y Full-HD (gasto extra si no tienes una), además de un disco duro muy grande (Mínimo 1TB) para almacenar juegos y películas en esa calidad, y si quisieras aumentar esa capacidad entonces es otro gasto extra. También se va a requerir una buena conexión a Internet para jugar en linea y ver contenido en 4K como Dios manda (Si no tienes minino 30 MB de velocidad entonces considera ese otro gasto extra con tu proveedor de Internet)

Es decir, SI vale la pena comprar una PS4K siempre y cuando tengas el equipo y los medios para poder disfrutar plenamente de una experiencia 4K.

3) ¿Puedo confiar en la palabra de Sony cuando dice que no habrá otras diferencias?
Veo difícil que Sony pueda mantener esa promesa, sobre todo porque se rumora mucho que la PS VR va a requerir una consola con mayor potencia gráfica para funcionar al 100%, entonces si los rumores son ciertos, vamos a tener un accesorio “casi” exclusivo para la PS4K y esto implica juegos exclusivos.

En conclusión… aunque Sony jura que las 2 consolas van a coexistir al mismo tiempo, creo que gradualmente irá desplazando a la PS4 actual para enfocarse solo a su nueva versión. Lo cual puede agradar a los usuarios nuevos, pero a quienes compramos la versión actual nos cae la noticia como patada al hígado y es que uno no puede evitar ese sentimiento de inferioridad y frustración cuando sale una nueva versión de una consola que jurábamos que nos duraría mínimo 6 años.

Si no te has comprado la nueva versión o si no tienes alguna preocupación económica, espera, compra y disfruta la PS4K

Si tienes la versión actual y se te dificulta conseguir $$$ para la nueva versión no te preocupes, piensa que son los juegos los que decidirán que tan buena es una consola y no los gráficos.

También déjenme comentarles que después de 4K ya se está pensando en el 8K y mayores resoluciones en televisores, algo que realmente me tiene sin cuidado ya que como les decía anteriormente, si se aumenta la resolución de los contenidos multimedia (Películas, Juegos)  creo que es necesario aumentar el tamaño de las pantallas para poder apreciarlo, ya que al ojo humano no entrenado le costará mucho distinguir una resolución mayor al 4K en una pantalla pequeña (¿De que sirve tener 20K de resolución en una TV de 40 pulgadas?), esto nos llevará a la necesidad de comprar pantallas de mas de 100 pulgadas o un proyector y tener disponible un espacio extremadamente amplio para colocar y ver estos aparatos.

PS4 – No conecta Wifi (SOLUCIÓN)

Que tal Pecorones ¿Como están?

El día de ayer me topé con un detalle bastante curioso, de la nada mi PS4 dejó de conectarse a la red WiFi de mi casa, algo curioso pues siempre había trabajado de manera normal.

Lo que había hecho fue cambiar el router anterior en mi casa con la compañía (Telmex – México) ya que el que tenía antes empezó a fallar pues se reiniciaba o se apagaba.

Al recibir el nuevo router lo configuré con el mismo SSID (Nombre de red) y contraseña, esto me evita tener que configurar nuevamente la red en todos mis otros dispositivos, incluida la PS4.

Funcionó perfecto hasta que este fin de semana fui a ver a unos familiares y llevé conmigo mi PS4, la configuré para que se conectara a la red de la casa de mi familia y trabajó sin problema.

De regreso a mi casa fue cuando empezó mi problema, he configurado muchas veces la red en mi PS4 así que todo debía ser un proceso normal, sin embargo por mas que lo intenté simplemente no conectaba.

Descarté que se tratase de un problema en mi router ya que el resto de mis dispositivos (PC, Smartphone, etc) se conectaban a la red sin problema, incluso la PS4 se conectaba muy bien mediante un cable de red.

Sin embargo la idea de tener otro cable mas ahí conectado no me gustaba y me parecía absurdo que mi PS4 dejara de conectarse por wifi siendo que la compré desde el primer día que salió a la venta y a la fecha no me había dado problemas.

Después de buscar ardua y extensamente (2 minutos) me topé con este video que explica muy bien como resolver el problema.

 

Después pondré algunas capturas de mi propio PS4 pero en resumen esto es lo que hay que hacer.

  1. Apaga tu PS4
  2. Verifica los puertos que debes habilitar en esta página http://manuals.playstation.net/document/es/ps4/settings/nw_test.html
  3. En tu PC abre en un navegador(IE de preferencia) la pagina de configuración de tu router, seguramente los accesos vienen en la parte de atrás del mismo.
  4. Busca la sección de NAT en la pagina de configuración del router, esta sección permite habilitar/deshabilitar puertos de conexión a determinadas IP, debes elegir unaIP fija de tu rango de IPs para asignarla a tu PS4 (No importa que no esté encendida eso lo configuramos después).
  5. Uno a uno, agrega los registros necesarios para habilitar esos puertos a la IP que tendrá tu PS4.
  6. Una vez finalizado este proceso enciende tu PS4, y vas a ingresar a la configuración de red manual.
  7. En esta sección, es donde indicas la red a la que te vas a conectar y la contraseña de acceso, después es importante elegir IP estatica para poder ingresar la IP que utilizará tu PS4 al conectarse a la red (Recuerda que es la misma que elegiste al habilitar los puertos en el router), todo lo demás se deja en su configuración predeterminada.
  8. Ya finalizada la configuración tu PS4 no debería tener problemas para conectar.

Y eso es todo.

Arrastrar y mover un control de lugar en C# y WPF

Que tal Pecorones ¿Como están?

El día de hoy me siento muy pero que muy bien ya que me vi en la necesidad de mover un control de lugar en tiempo de ejecución en WPF (Mediante arrastrar y soltar) .

Como ya les había comentado, voy a poner a continuación la fuente donde encontré este código y voy a poner un comentario de un pequeño detalle que modifiqué en el método root_MouseMove.

No olviden asignar los respectivos métodos a los eventos MouseLeftButtonUp, MouseLeftButtonDown, MouseMove del control que quieran mover.
http://stackoverflow.com/questions/6284056/dragging-a-wpf-user-control

Aquí les dejo el código completo.

Point anchorPoint;
Point currentPoint;
bool isInDrag = false;
private TranslateTransform transform = new TranslateTransform();

private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
anchorPoint = e.GetPosition(null);
element.CaptureMouse();
isInDrag = true;
e.Handled = true;
}

private void root_MouseMove(object sender, MouseEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
currentPoint = e.GetPosition(null);

transform.X += currentPoint.X – anchorPoint.X;
transform.Y += (currentPoint.Y – anchorPoint.Y);
this.RenderTransform = transform;//Esto hace que se mueva el formulario completo
//element.RenderTransform = transform;//Esto hace que se mueva solo un control
anchorPoint = currentPoint;
}
}

private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
element.ReleaseMouseCapture();
isInDrag = false;
e.Handled = true;
}
}

 

Obtener resultado en decimal de una división en C#

Que tal Pecorones ¿como están?

Pues así es… no había actualizado este blog en bastante tiempo y esto se debe a las nuevas reformas laborales que han aplicado en la empresa donde actualmente trabajo.

En fin, esto podrá parecerles absolutamente inútil pero créanme que en estos 5 años que tengo desarrollando sistemas y aplicaciones no me había topado con algo así.

Suponga esta división… 10/100 = 0.1

En Excel, en la calculadora de su sistema, en una calculadora de bolsillo y hasta en su propia mente ha llegado fácilmente al obvio resultado de 0.1

Sin embargo esto es distinto en el lenguaje C#, ya que lo primero que me cruzó por la mente fue esta linea.

double result = 10 / 100;

Sin embargo esto devuelve el valor cero (0) a pesar de que double es un tipo de dato que acepta cantidades con decimales.

Despues de googlear un poco, he dado con la respuesta de que se necesita implementar el método Decimal.Divide para poder obtener el resultado de una división. Quedando la linea de la siguiente manera.

double result = Convert.ToDouble(Decimal.Divide(10,100));

Eso es todo, espero que a alguien le sirva y no parecer el único programador sobre la faz del universo que no lo sabía :v

Seleccionar archivos con un cuadro de dialogo C#

Que tal Pecorones, ¿Como están?

Hoy andamos bastante productivos, por esa razón también vamos a ver como seleccionar archivos con un cuadro de dialogo en C# y obtener sus rutas, esto es muy útil cuando queremos mostrar al usuario el clásico cuadro de dialogo “Seleccione su archivo (x) para hacer (y)” al presionar un botón.

Les comento que este método funciona con aplicaciones de Windows Forms, por lo que es importante agregar la referencia y hacer uso de la librería:

System.Windows.Forms;

Si no la tienes agregada entonces muérete :v

Supongo que podría funcionar para WPF, Silverlight o ASP.NET siempre y cuando se agregue la referencia antes indicada. Vale que puedes probar por ti mismo, el concepto de selección de archivos no debe ser muy diferente.

Bueno, sin más, les dejo aquí el código

/// <summary>
/// Permite seleccionar archivos del equipo mediante un cuado de dialogo.
/// </summary>
/// <param name=”_multiSelect”>true -> Permite seleccionar varios archivos en el cuadro de dialogo.</param>
/// <param name=”_title”>Descripción o título del cuadro de dialogo.</param>
/// <param name=”_extentions”>Matriz de extensiones de archivo para filtrar. </param>
/// <param name=”_listExtentions”>true -> Las extensiones estarán separadas en forma de lista en el cuadro de dialogo, false -> las extensiones estarán juntas.</param>
/// <returns>value -> Archivo(s) seleccionados, null -> No se selecciono ningun archivo.</returns>
public string[] m_selectFiles(bool _multiSelect, string _title = “”, string[] _extentions = null, bool _listExtentions = false)
{
string[] value = null;
OpenFileDialog ofd = new OpenFileDialog();
DialogResult result;
string
extentions = string.Empty,
part1 = “(“,
part2 = “|”;
try
{
ofd.Title = !string.IsNullOrEmpty(_title) ? _title : (“Seleccione Archivo” + (_multiSelect ? “s.” : “.”));
ofd.Multiselect = _multiSelect;
if (!objFD.m_arrayIsNullOrEmpty(_extentions))
{
if (_listExtentions)//extensiones en forma de lista
{
for (int i = 0; i < _extentions.Length; i++)
{
//(*.txt)|*.txt|All Files (*.*)|*.*
extentions += “(*.” + _extentions[i].Trim().ToLower().Replace(“.”, “”) + “)|*.” + _extentions[i].Trim().ToLower().Replace(“.”, “”) + (i < _extentions.Length – 1 ? “|” : string.Empty);
}
ofd.Filter = extentions;

}
else//extensiones juntas
{
for (int i = 0; i < _extentions.Length; i++)
{
//Image Files (*.bmp, *.jpg)|*.bmp;*.jpg
part1 += “*.” + _extentions[i].Trim().ToLower().Replace(“.”, “”) + (i < _extentions.Length – 1 ? “,” : string.Empty);
part2 += “*.” + _extentions[i].Trim().ToLower().Replace(“.”, “”) + (i < _extentions.Length – 1 ? “;” : string.Empty);
}
ofd.Filter = “Archivos con extension: ” + part1 + “)” + part2;
}
}
result = ofd.ShowDialog();
value = (result == DialogResult.Yes || result == DialogResult.OK) ? ofd.FileNames : null;
}
catch (Exception ex)
{

}
return value;
}

Obtener archivos de un directorio con C#

Que tal Pecorones, ¿como están?

El día de hoy vamos a ver como obtener los archivos de un equipo en una ruta indicada, esto es muy útil cuando queremos por ejemplo, ver  si hay un incremento en el número total de archivos en un lapso u obtener y trabajar con cierto tipo de documentos (imagenes, pdf, xml, txt, etc).

Bueno, sin más, les dejo aquí el código.

/// <summary>
/// Permite obtener el listado de archivos de un directorio.
/// </summary>
/// <param name=”_path”>Ruta de donde se obtendrá el listado de archivos.</param>
/// <param name=”_extentions”>Matriz de extensiones de archivo para filtrar.</param>
/// <param name=”_searchOption”>Opción para listar solo los archivos de la carpeta principal o incluir subcarpetas.</param>
/// <returns>value -> Listado de archivos, null -> No se encontró ningun archivo.</returns>
public string[] m_getFilesFromPath(string _path, string[] _extentions = null, SearchOption _searchOption = SearchOption.TopDirectoryOnly)
{
string[] value = null;
List<string> arrayFiles = new List<string>();

try
{
if (!objFD.m_arrayIsNullOrEmpty(_extentions))
{
for (int i = 0; i < _extentions.Length; i++)
{
arrayFiles.AddRange(Directory.GetFiles(_path, “*.” + _extentions[i].Trim().ToLower().Replace(“.”, “”), _searchOption).ToList<string>());
}
}
else
{
arrayFiles.AddRange(Directory.GetFiles(_path, “*.*”, _searchOption).ToList<string>());
}
value = arrayFiles.ToArray();
}
catch (Exception ex)
{
m_registerEvent(ex, string.Empty, string.Empty, string.Empty, false, false);
}
return value;
}

MessageBox que se cierra automaticamente en C#.

¿Que tal Pecorones, como están?

Les comento que el día de hoy me vi en la necesidad de crear un aviso al usuario pero que a su vez fuera capaz de cerrarse en determinado tiempo (algunos segundos) y si el usuario no elegía nada el programa continúe su ejecución.

Para poder invocar este MessageBox especial deben copiar este código (Que es una nueva clase) e invocarlo de la siguiente manera:

DialogResult resultD = MessageBoxAutoClose.m_show(“Se realizará el proceso…”, “Aviso”, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information, 30, true);

Los botones del MessageBox y el Icono ustedes pueden establecerlos como en un MessageBox normal.

La mayor parte del código lo obtuve de otro blog del cual voy a poner su página para que pasen a verlo. Estoy agradecido con ellos por proporcionar prácticamente todo el código, yo solo me encargué de incluir los MessageButtons, MessageIcon y que devuelva el resultado.

http://www.karmany.net/programacion-software/45-microsoft-net-framework/235-messagebox-que-se-cierra-tras-x-segundos-en-c

Sin mas, acá el código.

 

 

/// <summary>
/// Clase para mostrar un MessageBox con cuenta regresiva para cerrar.
/// </summary>
public class MessageBoxAutoClose
{
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport(“user32.dll”, SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport(“user32.dll”, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport(“user32.dll”, SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[System.Runtime.InteropServices.DllImport(“user32.dll”, SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern bool SetWindowText(IntPtr hwnd, string lpString);

private System.Threading.Timer tmrClose = null;
private string
title = string.Empty,
message = string.Empty;
private int secondsToClose;
private IntPtr hndLabel = IntPtr.Zero;
private bool showCountDown;
private MessageBoxButtons msgButtons;
private MessageBoxIcon msgIcon;
static DialogResult msgResult;

public MessageBoxAutoClose(string _message, string _title, MessageBoxButtons _msgButtons, MessageBoxIcon _msgIcon, int _secondsToClose, bool _showCountDown)
{
message = _message;
title = _title;
msgButtons = _msgButtons;
msgIcon = _msgIcon;
secondsToClose = (_secondsToClose > 99) ? 99 : _secondsToClose;
showCountDown = _showCountDown;

tmrClose = new System.Threading.Timer(m_execEverySecond, null, 1000, 1000);
if (showCountDown)
{
msgResult = MessageBox.Show(message + “\r\nEste mensaje se cerrará dentro de ” +
secondsToClose.ToString(“00″) + ” segundos”, title, msgButtons, msgIcon);
if (msgResult != null)
tmrClose.Dispose();
}
else
{
msgResult = MessageBox.Show(message, title, msgButtons, msgIcon);
if (msgResult != null)
tmrClose.Dispose();
}
}

/// <summary>
/// Permite mostrar el mensaje al usuario con los segundos para cerrar el mensaje.
/// </summary>
/// <param name=”_message”>Texto del mensaje.</param>
/// <param name=”_title”>Titulo del mensaje.</param>
/// <param name=”_msgButtons”>Botones para el mensaje.</param>
/// <param name=”_msgIcon”>Icono del mensaje.</param>
/// <param name=”_secondsToClose”>Segundos para cerrar el mensaje.</param>
/// <param name=”_showCountDown”>true-> Mostrará los segundos para cerrar el mensaje.</param>
public static DialogResult m_show(string _message, string _title, MessageBoxButtons _msgButtons, MessageBoxIcon _msgIcon, int _secondsToClose, bool _showCountDown)
{
new MessageBoxAutoClose(_message, _title, _msgButtons, _msgIcon, _secondsToClose, _showCountDown);
return msgResult;
}

private void m_execEverySecond(object state)
{
secondsToClose–;
if (secondsToClose <= 0)
{
IntPtr hndMBox = FindWindow(null, title);
if (hndMBox != IntPtr.Zero)
{
SendMessage(hndMBox, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
tmrClose.Dispose();
}
}
else if (showCountDown)
{
// Ha pasado un intervalo de 1 seg:
if (hndLabel != IntPtr.Zero)
{
SetWindowText(hndLabel, message +
“\r\nEste mensaje se cerrará dentro de ” +
secondsToClose.ToString(“00″) + ” segundos”);
}
else
{
IntPtr hndMBox = FindWindow(null, title);
if (hndMBox != IntPtr.Zero)
{
// Ha encontrado el MessageBox, busca ahora el texto

int lonji = IntPtr.Size;
hndLabel = FindWindowEx(hndMBox, IntPtr.Zero, “Static”, null);
hndLabel = FindWindowEx(hndMBox, hndLabel, “Static”, null);//Se vuelve a ejecutar el metodo FindwindowEx para hayar el label, de lo contrario se topará con el icono que tambien es “static”

if (hndLabel != IntPtr.Zero)
{
// Ha encontrado el texto
SetWindowText(hndLabel, message +
“\r\nEste mensaje se cerrará dentro de ” +
secondsToClose.ToString(“00″) + ” segundos”);
}
}
}
}
}
}

Imaginarium: Songs from the Neverhood

¿Que tal Pecorones, como están?

Aqui acabando de descubrir esta excelente banda sonora por parte de Terry S. Taylor.

Me ha encantado, se puede trabajar a gusto mientras se escucha. Les dejo el link donde encontré sus canciones.

http://storage3-free.uloz.to/Ps;Hs;fid=8849330;cid=232062258;rid=768779015;up=0;uip=189.212.237.221;tm=1463188805;ut=f;aff=uloz.to;did=uloz-to;He;ch=e22a44888f856a7d25cd6507cd18b835;Pe/xi5kS3S/terry-s-taylor-rar?bD&c=232062258&De&redirs=2