Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - Eleкtro

#4541
Para entender la finalidad de la declaración using, el método Dispose / Finalize / Close o la interfáz IDisposable tal vez deberías empezar por el principio, por entender cómo se administran los recursos y cómo se liberan los "residuos".

Lee acerca del recolector de basura de .Net aka GarbageCollector (GC).

Fundamentals of Garbage Collection - MSDN
Garbage Collection - MSDN
Garbage Collector Basics and Performance Hints - MSDN
+
Dispose Pattern - MSDN

Pero un resumen rápido sería más o menos cómo lo que ya han mencionado, cuando finaliza el bloque del using automáticamente se llama al método Dispose el cual se encarga de liberar los recursos utilizados por la instancia del objeto idisposable en cuestión.

Hay que tener en cuenta que la finalidad de algunos miembros simplemente existen para simplificar la escritura de código y conseguir una estructura mejor, pero por cuestión de estética más que nada, cómo lo es el caso de using o cómo lo es también la función Enumerable.AsEnumerable por poner otro ejemplo, simplemente son cosas opcionales que proporcionan un mejor rendimiento o mejor experiencia de cara al usuario, pero que realmente no son estrictamente necesarias de utilizar.

Saludos
#4542
Cita de: Lekim en  8 Septiembre 2015, 16:51 PMTan sólo un problema me ha dado y es el siguiente. He usado un Form simple en VisualBasic.Net 2010 y tras copiar y pegar tu código ocurría el siguiente error:

La clase Form1 se puede diseñar, per no es la primera clase de archivo.
Visual Studio requiere que los diseñadores utilicen la primera clase del archivo.
Mueva el código de clase para convertirla en la primera clase del archivo y vuelva a intetar cargar el diseñador de nuevo.


No se podía ver el diseño del form.

Por ello,si me lo permites, he reducido y cambiado el orden de tu código.

Corrígeme si me equivoco al hacer suposiciones, pero deduzco que lo que hiciste fue simplemente copiar y pegar en la class principal el código de ambas classes, de esta forma:

Form1.vb
Código (vbnet) [Seleccionar]
Class CursorUtil
...
End lass

Class Form1
...
End Class


Por supuesto eso no te podría haber funcionado y el modo en el que lo corregiste fue modificando el orden de las definiciones de esas classes, pero lo que realmente debes hacer es crear una nueva class, me refiero a un nuevo archivo class.vb donde debes definir la class CursorUtil.




Cita de: Lekim en  8 Septiembre 2015, 16:51 PMEsperaba no tener que usar una función API. No entiendo como no se permite usar cursores en color, la verdad.

Si, deja bastante que desear la ausencia de compatibilidad con cursores regulares, pero así es la realidad, lo cierto es que la tecnología WindowsForms se puede considerar casi-deprecada ya que es primitiva en muchos otros aspectos gráficos y hay que estar hackeando constantemente la UI para realizar modificaciones estéticas comunes, ese es el gran inconveniente que conlleva utilizar WinForms.

Si realmente quieres evitar este tipo de problemas entonces la mejor opción sería migrar a la tecnología WPF (WindowsPresentationFoundation) ya que es la que actuálmente está en constante desarrollo y actualización por parte de Microsoft, en comparación con Windowsforms donde, en lo referente a la UI y las classes u otros miembros relacionados con la UI ya no veremos ninguna mejora/actualización cómo por ejemplo eso, la esencial compatibilidad de cursores.

En WPF el equivalente a la class System.Windows.Forms.Cursor sería la class System.Windows.Input.Cursor, la cual por supuesto soporta cursores estáticos y animados a 32-bit depth en full HD x'D.

Saludos!
#4543
Pero que no es ningún pack de "transformación", son los iconos originales extraidos de la dll imageres.dll :P y están chulísimos, mucho mejor que los iconos de cualquier otro Windows, incluido el nostálgico icono de la Mona lisa de Microsoft xD

PD: El IcoFx yo también lo recomiendo, es una maravilla, aunque yo lo utilizo para redimensionar iconos más que nada. http://icofx.ro/

Saludos!
#4544
Foro Libre / Re: [Los Burlaos] ¿Estás burlao?
8 Septiembre 2015, 04:03 AM
Ojo a la perlita que he encontrado por internet... una amenaza telefónica del Dudu !! :D

Os adelanto un trozo de la épica conversación (aunque solo se le escucha hablar al Josemi...):
Cita de: DuduAquí hay walthers, hay 38s, hermano, hay 9mm, hay lo que quieras, compadre. Yo no sé qué tú te estás pensando que es esto, compadre, THIS IS THE JUNGLE, NIGGA.

El video:
Josemi Joseador Dudu de los burlaos amenaza telefónica
[youtube=640,360]https://www.youtube.com/watch?v=-A_dYaoLsJg[/youtube]

La conversación completa:
Cita de: DuduEscúchame tío, que yo no soy un niño, tío, yo no soy un niño, tío, yo no estoy pa que me hagan perder el tiempo. ¿Me entiendes? Que es lo que me hace perder tu gente. Ya está primo, que si eres tan bravo tío, cuando quieras quedas conmigo, hermano. Y yo sí sé como funcionan hermano. Aquí hay walthers, hay 38s, hermano, hay 9mm, hay lo que quieras, compadre. Yo no sé qué tú te estás pensando que es esto, compadre, THIS IS THE JUNGLE, NIGGA. Escúchame, es que, es que ya me está tocando la polla, tío, estás tonterías, de tu coro de niños pequeños, tío, que escúchame, que venga, primo, que venga aquí a la calle Aguilón nº9, primo. Que venga ya tu colega si es tan bravo, que ayer me tuvo ahí esperando, compadre, hasta la 1 y media de la noche, hermano, y no vino ni Dios. ¿Qué pasa con tu rollo, sois tan bravos, primo? Pues si sois tan bravos, vente, vente de verdad, hermano. Estuve ayer con mi colega, primo y es que menos mal que no te encontré, chivato de *****, porque estuve con mi colega dando vueltas por ahí con el coche, con la pistola, maricón. ¿Tú con quién te piensas que estás hablando, pipudo? ¿Eh? Ts. Y es que has tenido hasta suerte, maricón, te ha venido hasta bien, el que no vinieras, porque es que te hubiera metido un tiro en la rodilla, payaso, que eres un payaso.

PD: Se recomienda ver el video un sábado por la noche despues de haber tomado 5 cubatas para morir de risa hasta el día sigueinte, y con una pizza o unas palomitas a mano.

Saludos!
#4545
Cita de: YuseTist en  7 Septiembre 2015, 11:56 AMSi mal no entendí, ¿funciona ciertamente así? (Corrígeme si me equivoco)

hmmm... se podría decir que si.

Te lo intentaré explicar de otra forma por si acaso lo entiendes mejor...

Cita de: MSDNWebClient.DownloadData: Downloads the resource as a Byte array from the URI specified

La función DownloadData descarga "X" y te entrega ese "X" acomodado en un Array de bytes.

¿Qué contiene el Array?, podría ser los bytes que componen ua imagen Bitmap, o un archivo de música, o un string UTF-8 ...cómo supuestamente es en este caso.

Tu tienes unos bytes que sabes que se pueden interpretar en un string legible, y sabes que el string tiene codificación UTF-8, así que usas la función Encoding.UTF8.Getstring para decodificar el contenido, si usases codificación ASCII o UTF32 etc se verian caracteres ilegibles.

Un ejemplo real-world:

Código (vbnet) [Seleccionar]
WebClient wc = new WebClient();
UTF8Encoding enc = new UTF8Encoding();
byte[] data = wc.DownloadData("http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt");
string str = enc.GetString(data);

File.WriteAllText("c:\\utf8.txt", str, enc);


Saludos
#4546
Dudas Generales / Re: Velocidad
8 Septiembre 2015, 00:40 AM
Está bien avisar de las reglas del foro pero automatizar la inserción de datos en los campos de un formulario no me parece que sea algo no ético xD, a menos que sea para crear cuentas falsas de algún servicio online donde esté prohibido, o cosas similares.

Lo que necesitas es una macro (una secuencia de acciones del teclado y/o el mouse) que puedes crear con infinidad de aplicaciones, por ejemplo con Jitbit Macro Recorder.
https://www.jitbit.com/macro-recorder/

Si tienes conocimientos de programación entonces puedes utilizar peticiones para rellenar el formulario y enviarlo. Con C#, VB.Net, Python, Ruby... u otro, el que sea.

Saludos
#4547
Cita de: maiksix en  7 Septiembre 2015, 09:38 AM1. Porque dices que es el peor lenguaje para hacer esto?

Por qué Batch es un lenguaje muy limitado, según palabras oficiales de Microsoft es un lenguaje ideado para automatizar algunas tareas comunes del sistema y poco más, cualquier cosa se vuelve tediosa desarrollarla en Batch (quiero decir, muchas más lineas de código en comparación con otro lenguaje) por que no es un lenguaje que exponga miembros o conceptos esenciales que se pueden encontrar en la mayoría de los otros lenguajes actuales, ya sean lenguajes de Scripting o compilados, empezando por el soporte para un miserable Array.

Depender de procesos externos (o mal llamados "comandos externos") como ping.exe, forfiles.exe, findstr.exe, etc solamente para poder realizar la mayoría de operaciones "esenciales" en Batch ...eso ya lo dice todo por si mismo, cada llamada a esos procesos se traduce en tiempo de ejecución que se debe consumir hasta que el proceso se inicie y devuelve el valor de retorno, Batch es lento y todas sus cosas lo vuelven todavía más lento si cabe, es muy lento sobre todo cuando se trata de iterar texto o archivos, cómo es el caso de lo que tú necesitas llevar a cabo.

En resumen, no se puede trabajar bien un código en Batch por que hay que acabar dándole mil vueltas a cualquier algoritmo simple, y eso lo vuelve tedioso ...insufrible, es así de simple.




Cita de: maiksix en  7 Septiembre 2015, 09:38 AMQue me recomendarias pues? Soy nuevo en temas de scripting.

Dentro de los lenguajes integrados en Windows, si simplemente buscas algo más o menos tan sencillo cómo Batch ...pero que le da mil vueltas, ese lenguaje sería VisualBasicScript (VBS) (aunque es otro lenguaje muy limitado también), y luego le seguiría PowerShell (PS).

Si tu intención es aprender programación, entonces ninguno de esos lenguajes sería una buena opción, puedes empezar por Ruby o Python por ejemplo en lo referente al Scripting. Pero no te guies por una simple opinión cómo la mía, el mejor lenguaje siempre será aquél con el que más agusto te sientas (al escribi la sintaxis) y con el que puedas realizar todas las tareas que necesites hacer. Pero prueba algo distinto a Batch para comparar, hazme caso en eso.

Mi primer lenguaje fue Batch ...hace muchos años ya, por ese motivo entiendo que una persona no puede ser consciente de la mierd@ que supone Batch y de todos los inconvenientes, innecesarios inconvennientes por los que estás pasando para hacer cualquier código hasta que descubras un lenguaje de verdad.




Cita de: maiksix en  7 Septiembre 2015, 09:38 AM2. Lei algo de lo del 0 en la fecha y probe borrarlo pero no lo logre. Porque pones lo de ~0,1 en el month? No entiendo muy bien, igual que lo del date~3,2. Es decir, entiendo que hacen pero no veo su significado o similitud con otro lenguaje.

Ese tipo de acción se denomina SubString y consiste en extraer una serie de caracteres de un string.

En este código:
Echo %DATE:~3,2%

...y sabiendo que la fecha es 08/09/2015, el dígito 3 indica el inicio de la extracción (es decir, el cuarto caracter del string empezando por la izquierda), y el 2 indica la longitud de la substracción, por ende, se extraerá el string "09", el mes.

Imaginate al "3" y al "2" cómo dos parámetros a los que podemos llamar imaginariamente "StartPosition" y "Length".

Puedes ver cómo sería un substring en otros lenguajes, no se parecen nada a Batch.




Cita de: maiksix en  7 Septiembre 2015, 09:38 AM3. Gracias por el codigo, lo he probado y funciona aunque no la parte de añadir el 0 y la de setear a 12 el mes.

Especifica que Windows tienes, ya que en las diferentes versiones de Windows existen pequeñas diferencias entre los comandos, tal vez el comando "Set" o la variable "DATE" u otra cosa podría tener un comportamiento distinto al que tiene en el S.O. donde lo he testeado yo, Windows 8.1.




Cita de: maiksix en  7 Septiembre 2015, 09:38 AM5. Estoy probando el forfiles y si que funciona perfectamente en el cmd, pero no lo pilla cuando lo meto en un .bat y ejecuto. Dice que no existe tal comando... A que se debe?

Si dice que no existe significa que el archivo "forfiles.exe" no se puede encontrar en el directorio de trabajo actual, pero existir, existe en tu sistema cómo ya has comprobado.

Lo que comentas es extraño, ya que debería detectar correctamente el forfiles.exe aunque modifiques el directorio de trabajo.

Comprueba que tienes agregada la ruta "C:\Windows\System32" en a variable de entorno PATH, con el siguiente comando en consola:
(path | findstr /i "%SystemRoot%\System32")1>NUL && (Echo Si Existe) || (Echo No Existe)

De todas formas siempre puedes especificar la ruta completa cuando necesites usarlo, por ejemplo:

Código (dos) [Seleccionar]
@Echo OFF

"%SystemRoot%\System32\forfiles.exe" argumentos

Exit


Saludos
#4548
En el título mencionas que se congela (se freezea) pero luego mencionas que se crashea (se finaliza anormálmente el proceso). ¿Puedes aclarar qué es lo que ocurre realmente de esas dos cosas?.

Que se congele el Form sería lo más normal, ya que si tienes el control en el thread de la UI y realizas una operación "intensiva", hasta que no termine lo que hagas en el control no puede seguir de forma regular el flujo de la UI.

Prueba a añadir los elementos de forma asíncrona en el mismo hilo, o añadir los elementos desde un hilo distinto, ambas metodologías deberían solucionar el problema del freezing.

Un ejemplo:
Código (vbnet) [Seleccionar]
Imports System.Threading.Tasks

Task.Factory.StartNew(Sub()
                         Me.zombieGrid.Añadir...)
                     End Sub)


En C#
Código (csharp) [Seleccionar]
using System.Threading.Tasks;

Task.Factory.StartNew(() => { this.zombieGrid.Añadir...; })


Saludos
#4549
Cita de: desof en  7 Septiembre 2015, 13:08 PMSystem.BadImageFormatException   ...    Se ha intentado cargar un programa con un formato incorrecto

Ese error particulármente sucede cuando intentas cargar un ensamblado x86 en un proyecto x64, o al contrario, un archivo x64 en un proyecto x86.

Compila bajo x86 o x64 dependiendo de la arquitectura de los ensamblados de CrystalReports y entonces te debería funcionar.

Saludos
#4550
Cita de: Lekim en  7 Septiembre 2015, 18:40 PMFunciona, pero da igual si el cursor es de 8 bits o 24 bits, se ve de color negro o blanco y negro.

No entiendo porqué.

Cómo indica la documentación oficial de la class System.Windows.Forms.Cursor, no soporta cursores con colores distintos a blanco y negro.

Cita de: https://msdn.microsoft.com/en-us/library/system.windows.forms.cursor.aspxThe Cursor class does not support animated cursors (.ani files) or cursors with colors other than black and white.

Tienes que hechar mano de la WinAPI, particulármente la función LoadCursorFromFile, la cual aparte de solventar el problema de los colores también permite utilizar cursores animados:
LoadCursorFromFile function - MSDN




He desarrollado la siguiente class para simplificar la tarea y automatizar la carga del cursor.

Código fuente:
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 07-September-2015
' ***********************************************************************
' <copyright file="CursorUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System
Imports System.ComponentModel
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

#End Region

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Contains related cursor utilities.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
Public NotInheritable Class CursorUtil

#Region " P/Invoking "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Platform Invocation methods (P/Invoke), access unmanaged code.
   ''' This class does not suppress stack walks for unmanaged code permission.
   ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/> must not be applied to this class.
   ''' This class is for methods that can be used anywhere because a stack walk will be performed.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>http://msdn.microsoft.com/en-us/library/ms182161.aspx</remarks>
   ''' ----------------------------------------------------------------------------------------------------
   Private NotInheritable Class NativeMethods

#Region " Functions "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Creates a cursor based on data contained in a file.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="filepath">
       ''' The source of the file data to be used to create the cursor.
       ''' The data in the file must be in either .CUR or .ANI format.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' If the function is successful, the return value is an <see cref="IntPtr"/> to the new cursor.
       ''' If the function fails, the return value is <see cref="IntPtr.Zero"/>.
       ''' To get extended error information, call <see cref="Marshal.GetLastWin32Error"/>.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------    
       ''' <remarks>
       ''' <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms648392%28v=vs.85%29.aspx"/>
       ''' </remarks>
       ''' ----------------------------------------------------------------------------------------------------
       <DllImport("User32.dll", CharSet:=CharSet.Ansi, BestFitMapping:=False, ThrowOnUnmappableChar:=True, SetLastError:=True)>
       Public Shared Function LoadCursorFromFile(
               ByVal filepath As String
       ) As IntPtr
       End Function

#End Region

   End Class

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Prevents a default instance of the <see cref="CursorUtil"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Creates a cursor based on data contained in a managed .Net resource.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="resource">
   ''' The resource.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <see cref="System.Windows.Forms.Cursor"/>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Public Shared Function LoadCursorFromResource(ByVal resource As Byte(),
                                                 Optional cleanTempFile As Boolean = True) As Cursor

       Dim tmpFilepath As String = String.Format("{0}.ani", Path.GetTempFileName)

       Try
           Using fs As New FileStream(tmpfilepath, FileMode.Create, FileAccess.Write, FileShare.Read)
               fs.Write(resource, 0, resource.Length)
           End Using

           Dim result As IntPtr = NativeMethods.LoadCursorFromFile(tmpFilepath)
           Dim win32Err As Integer = Marshal.GetLastWin32Error

           If result = IntPtr.Zero Then
               Throw New Win32Exception([error]:=win32Err)
           Else
               Return New Cursor(result)
           End If

       Catch ex As Exception
           Throw

       Finally
           If (cleanTempFile) AndAlso (File.Exists(tmpFilepath)) Then
               File.Delete(tmpFilepath)
           End If

       End Try

   End Function

#End Region

End Class


Modo de empleo:
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private Sub Label1_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) _
   Handles Label1.MouseEnter

       Static cur As Cursor

       If cur Is Nothing Then
           cur = CursorUtil.LoadCursorFromResource(My.Resources.MyCursor)
       End If

       ' Asegurarse de liberar el objeto cuando sea necesario...

       DirectCast(sender, Label).Cursor = cur

   End Sub

   Private Sub Label1_MouseLeave(ByVal sender As Object, ByVal e As EventArgs) _
   Handles Label1.MouseLeave

       DirectCast(sender, Label).Cursor = Cursors.Default

   End Sub

End Class


Recursos usados para las pruebas:


Metro X Cursor Set - DeviantArt

Saludos