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

#7431
Cita de: El Benjo en 15 Enero 2014, 23:44 PM
también puedes utilizar My.Settings para guardar variables dentro de tu aplicación y cuyos valores estarán ahí la próxima vez que la aplicación se ejecute.

Añado al comentario del compañero @ElBenjo:

...cuyos valores estarán ahí la próxima vez que la aplicación se ejecute, siempre que el executable no se renombre, ni se haga una actualización o reemplazo del executable, ni otras cosas.

No me gusta la infraestructura de My.Settings, no es fiable ni muy práctica en varios escenarios, como en este caso, aunque se pueden almacenar colecciones de Strings yo diría que My.Settings no fue pensado para grandes cosas como administrar una base de datos de un "comercio".

Yo optaría por una base de datos en archivo de texto, XML (por ejemplo), ya que es un lenguaje que está soportado en VS a la perfección y se pueden hacer querys de forma sencilla, quedando así el archivo:

db.xml
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="Windows-1252"?>
<!--Mi base de datos-->
<Verduras>
   <Verdura><Nombre>Cebolla</Nombre><Precio>15</Precio></Verdura>
   <Verdura><Nombre>Chile</Nombre><Precio>25</Precio></Verdura>
   <Verdura><Nombre>Limón</Nombre><Precio>25</Precio></Verdura>
   <Verdura><Nombre>Papa</Nombre><Precio>18</Precio></Verdura>
   <Verdura><Nombre>Plátano</Nombre><Precio>10</Precio></Verdura>
   <Verdura><Nombre>Tomate</Nombre><Precio>27</Precio></Verdura>
</Verduras>


...Puedes administrar los atributos de la manera que prefieras, y también puedes identar los elementos... depende de gustos.

Pudiendo hacer cosas como esta en .NET:

Código (vbnet) [Seleccionar]
       Dim Verduras = From Verdura As XElement
                      In XDoc.<Verduras>.<Verdura>
                      Select New With
                             {
                                 Verdura.<Nombre>.Value,
                                 Verdura.<Precio>.Value
                             }

       For Each Verdura In Verduras

           MsgBox(String.Format("Nombre: {0}; Precio: {1}",
                                Fruta.Nombre,
                                Fruta.Precio))

       Next Verdura


( puedes usar un convertidor online del lenguaje VB.NET <> CSharp , lo que hice fue símplemente crear un type anónimo).

...Y para modificar un precio, simplemente actualizas el atributo y guardas los cambios en el archivo.

En el peor de los casos si te parece dificil puedes optar por algo mucho más básico, un archivo de texto delimitado (CSV), que también se puede manejar bien y te será más facil si no manejas XML ni MySql, pero si al final optases por usar un archivo delimitado por comas (CSV) y si te importa algo el rendimiento de tu app entonces te sugiero (es más, te lo impongo por ley está prohibición) que no uses el método TextFieldParser del antiguo VB6, eso es lo peor que puedes hacer, es puro Left, Mid, y otras ascadas de las antiguas técnicas de programación; en su defecto puedes usar un simple String.Split, repito, esto tenlo en cuenta sólamente si te importa lo más mínimo el rendimiento de tu app y no quieres que te tarde 10 segundos en parsear un simple texto.


PD: Porfavor que alguien mueva esto a .NET no? :P


Saludos!
#7432
Cita de: Darhius en 15 Enero 2014, 17:53 PMSi tuviese que instalar alguna herramienta de las que haz eliminado no tendría problemas?.

(Gracias por comentar)

No, no te preocupes no hay ningún problema, de todas formas lo voy a intentar explicar de otra manera para que nadie vuelva a tener esta duda:

Mi instalador es un loader del instalador original de Microsoft, y el instalador de Microsoft es online, es decir, se descarga cualquier paquete necesario desde los servidores de Microsoft, esto no lo hago yo, lo hace el instalador de Microsoft, por eso es un proceso más que fiable ...sin problema alguno, y si hubiera algún problema, pues me excluyo de cualquier culpabilidad porque no es algo que pueda controlar yo xD.

Por poner un ejemplo adicional, si a la ISO original de VIsualStudio 2013 le eliminas los casi 4GB que tiene de paquetes y te quedas sólamente con el instalador que pesa 2 mb, el instalador descargará todos los paquetes (necesarios) de nuevo a tu PC... pues con mi instalador es exáctamente lo mismo porque se carga el instalador de Microsoft.

Un saludo!
#7433
Una forma muy, muy sencilla de implementar una evaluación Trial del programa, usando la librería CryptoLicensing.

NOTA: El tipo de protección y checkeos, ya sea una evaluación trial, un límite de máquinas o un límite de usos, o una comprobación hardware-id ...todo se genera desde la aplicación de CryptoLicensing y queda registrado en la propiedad "LicenseCode"... mi ayudante está pensado para una evaluación muy sencilla y básica sin posibilidad de validar, es decir, no está pensado para evaluar licencias válidas ...sinó más bien para restringir la aplicación a un máximo de usos y/o duración de ejecución y/o dias, todavía no he indagado mucho en el modo de uso de la librería.

Código (vbnet) [Seleccionar]
' CryptoLicense Helper
' ( By Elektro )
'
' Usage Examples:
' Dim MyLicense As New Licenser

#Region " Imports "

Imports LogicNP.CryptoLicensing
Imports System.Windows.Forms

#End Region

''' <summary>
''' Manages the license of this Application.
''' </summary>
Public Class Licenser

#Region " Members "

   ''' <summary>
   ''' The license object.
   ''' </summary>
   Public WithEvents License As CryptoLicense =
       New CryptoLicense() With
       {
           .ValidationKey = "AMAAMACSde6/zo6beBTzxAC5D9qrf6OyReAJwGB30gMr5ViI1/+ZXRzwt7M+KnraMKNkaREDAAEAAQ==",
           .LicenseCode = "FgCAABguQrc4Es8BAQETTsmKhj/OGCuTbJzExXb9GO7sx3yR6wQIGynJ76g7DyxOU0zgSZ82lYtuIa8r9m8="
       }

   ''' <summary>
   ''' The license message to display on a MessageBox.
   ''' </summary>
   Private LicenseMessage As String = String.Empty

#End Region

#Region " Constructor "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="Licenser"/> class.
   ''' </summary>
   Public Sub New()

       Select Case License.Status

           Case LicenseStatus.Valid
               OnValid()

           Case LicenseStatus.InValid
               OnInvalid()

           Case LicenseStatus.Expired
               OnExpired()

           Case LicenseStatus.UsageDaysExceeded
               OnUsageDaysExceeded()

           Case LicenseStatus.ExecutionsExceeded
               OnExecutionsExceeded()

       End Select

   End Sub

#End Region

#Region " Methods "

   ''' <summary>
   ''' Called when license status is valid.
   ''' </summary>
   Private Sub OnValid()

       If License.RemainingUsageDays <> Short.MaxValue Then

           LicenseMessage = String.Format("{0} days remaining.",
                                          CStr(License.RemainingUsageDays))
           ShowLicenseMessage(False)

       End If

   End Sub

   ''' <summary>
   ''' Called when license status is invalid.
   ''' </summary>
   Private Sub OnInvalid()

       LicenseMessage = "Invalid License."
       ShowLicenseMessage(True)
       Terminate()

   End Sub

   ''' <summary>
   ''' Called when license status expired.
   ''' </summary>
   Private Sub OnExpired()

       LicenseMessage = String.Format("License has expired on {0}.",
                                      CStr(License.DateExpires))
       ShowLicenseMessage(True)
       Terminate()

   End Sub

   ''' <summary>
   ''' Called when license status usage days exceeded.
   ''' </summary>
   Private Sub OnUsageDaysExceeded()

       LicenseMessage = String.Format("This software is limited to 7 days, this is the {0} day.",
                                      CStr(License.CurrentUsageDays))
       ShowLicenseMessage(True)
       Terminate()

   End Sub

   ''' <summary>
   ''' Called when license status executions exceeded.
   ''' </summary>
   Private Sub OnExecutionsExceeded()

       LicenseMessage = String.Format("This software is limited to 5 executions, this is the {0} execution.",
                                      CStr(License.CurrentExecutions))
       ShowLicenseMessage(True)
       Terminate()

   End Sub

#End Region

#Region " Miscellaneous Methods "

   ''' <summary>
   ''' Shows the license message on a MessageBox.
   ''' </summary>
   Private Sub ShowLicenseMessage(Optional ByVal ShowBuyComment As Boolean = False)

       LicenseMessage = String.Format("{0}{1}",
                                      LicenseMessage,
                                      If(ShowBuyComment,
                                         Environment.NewLine & "Please buy this software.",
                                         Nothing))

       MessageBox.Show(LicenseMessage, "License Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

   End Sub

   ''' <summary>
   ''' Terminates the application.
   ''' </summary>
   Private Sub Terminate()

       Application.Exit() ' Terminate the application.

   End Sub

#End Region

#Region " Event Handlers "

   ''' <summary>
   ''' Handles the RunTimeExceeded event of the License.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
   Private Sub License_RunTimeExceeded(ByVal sender As Object, e As EventArgs) _
   Handles License.RunTimeExceeded

       LicenseMessage = "Maximum usage time exceeded."
       ShowLicenseMessage(True)
       Terminate()

   End Sub

#End Region

End Class
#7434
Cita de: luis456 en 15 Enero 2014, 20:16 PM

No se puede modificar la colección Items cuando está establecida la propiedad DataSource. ?????????????????


Si estás usando un DataSource debes hacer los cambios en el objeto source, no los puedes hacer diréctamente en el ListBox ...a menos que vuelvas la propiedad a valor nulo.

Compila esto en un nuevo proyecto y fíjate lo que sucede en cada pausa:
Código (vbnet) [Seleccionar]
Public Class Form1

    Dim Source As Integer() = {1, 2, 3}

    Private Sub Form1_Load() Handles MyBase.Shown

        Dim LB As New ListBox
        Me.Controls.Add(LB)

        LB.DataSource = Source
        Threading.Thread.Sleep(2000) : Application.DoEvents()

        Source = {1, 2, 3, 4, 5, 6}
        LB.DataSource = Source
        Threading.Thread.Sleep(2000) : Application.DoEvents()

        LB.DataSource = Nothing
        LB.Items.Add(99)
        Threading.Thread.Sleep(2000) : Application.DoEvents()

    End Sub

End Class


saludos
#7435
¿ Que te dije de usar LINQ ?

¿algo como esto te sirve?:
Código (vbnet) [Seleccionar]
Public Class Form1

   ReadOnly MAX As Integer = 100

   Public Sub Test() Handles MyBase.Shown

       Dim Rand As New Random

       Dim result1 As Integer() = {1, 100, 2, 3, 4}
       Dim result2 As Integer() = {5, 500, 6, 6, 4}
       Dim result3 As Integer() = {7, 8, 9, 10, 99}

       ' Concateno, y...
       ' Elimino duplicados, y...
       ' Selecciono los números inferiores a MAX, y...
       ' Convierto los números mayores a MAX a números aleatorios entre 0 y MAX.
       Dim Result As IEnumerable(Of Integer) =
           (result1.Concat(result2).Concat(result3)).
           Distinct.
           Select(Function(Value As Integer)
                      Return If(Value < MAX, Value, Rand.Next(0, MAX))
                  End Function)

       ' Result = 1, RANDOM, 2, 3, 4, 5, RANDOM, 6, 7, 8, 9, 10, 99
       ListBox1.Items.AddRange(Result.Cast(Of Object).ToArray)

   End Sub

End Class


Saludos!
#7436
Cita de: engelx en 15 Enero 2014, 03:49 AMno se dan codigos... reglas del foro

se responden dudas, has una pregunta y se te puede responder...



Cita de: pablomillon en 15 Enero 2014, 03:33 AMsi me pudieran dar los codigos

Puedes usar el buscador del foro o leer los posts con chinchetas de esta sección y encontrarías cientos de piezas sueltas para encajarlas a tu "puzzle" de códigos, de hecho hace poco dos usuarios realizaron la misma pregunta y están en la primera o segunda página de esta sección, te sugiero que pongas un poco más de empeño en tu investigación.

O si lo prefieres puedes formular una pregunta sobre algo en concreto y mostrar un código con el progreso que hayas realizado por ti mismo, y así yo mismo y/o algún compañero que maneje C# te ayudará.

Saludos!
#7437
Cita de: CL1O en 10 Enero 2014, 04:01 AM
Lo bajaste a la mitad? muy buen aporte

Si, reduje el tamaño a más de la mitad porque eliminé cosas que para mi ámbito de programación son totálmente innecesarias (por ejemplo no necesito que el maldito VS me instale 20 cosas relacionadas con SQL, ni que me instale un ofuscador, ni tampoco una SDK para desarrollar en windowsphone), pero como ya comenté el instalador descarga de forma automática cualquier otro paquete que contuviese la ISO original (en caso de que se precise para la instalación).

...También hay que tener en cuenta que al peso total de mi instalador le añadí los 388 mb (hablando en peso descomprimido) que suman los extras.

Gracias por comentar!
#7438
Buenas!

Me he dado cuenta de que tienes más de 1.000 mensajes publicados pero yo he sido incapaz de encontrar un solo post donde hayas formulado un tema de forma correcta con con sus respectivas etiquetas GeShi en los códigos, porfavor haz uso de las etiquetas en los subforos de programación, va siendo hora de respetar las normas del foro.

Cierro el tema por porque ya está solucionado y por saltarse la norma de los códigos a la torera.

Saludos!
#7439
Creo que esto es lo que intentas hacer...

Código (vbnet) [Seleccionar]
   ReadOnly MAX As Integer = 99

   Public Sub Test() Handles MyBase.Shown

       Dim result1 As Integer() = {1, 100, 2, 3, 4}
       Dim result2 As Integer() = {5, 500, 6, 6, 4}
       Dim result3 As Integer() = {7, 8, 9, 10, 99}

       ' Elimino duplicados al mismo tiempo que selecciono los números inferiores a MAX.
       Dim Result As IEnumerable(Of Integer) =
           (
               From Value As Integer
               In (result1.Concat(result2).Concat(result3)).Distinct
               Where Value <= MAX
           )

       ListBox1.Items.AddRange(Result.Cast(Of Object).ToArray)

   End Sub


Saludos
#7440
Antes de nada, gracias por comentar y por las sugerencias.

Cita de: 79137913 en 14 Enero 2014, 13:10 PMEstimo que en el  codigo siempre pone el canal alpha en 255, aunque una buena opcion para tu soft seria que si seleccionamos el color de fondo, nos devuelva el color del pixel + el alpha determinado.

Sería una buena idea si fuera posible, pero el byte del canal Alpha siempre va a ser 255.

El canal Alpha (la transparencia) no se puede obtener de un pixel puesto que el canal Alpha ya se ha usado para mezclar los colores.

Por ejemplo, si abres una "ventana" de color rojo con 50% de transparencia, ten en cuenta que detrás de esa transparencia hay otro color, el color del escritorio, o de lo que esté detrás de esa ventana, y entonces lo que se obtiene es la combinación de ambas transparencias (50% + 50%) en el color final del canal RGB.

La función de la WinAPI que utilizo (GetPixelColor) siempre va a devolver un canal RGB.

PD: La razón de que en mi aplicación se muestre el valor del canal Alpha es por puro estilismo, no es util, símplemente está ahí para quien lo desee copiar diréctamente.


Cita de: 79137913 en 14 Enero 2014, 13:10 PMNota 2:
Podrias ponerle la opcion para seleccionar Pixel X,Y de imagen Z.

Podría ser una buena idea pero no me agrada, se puede mover el ratón hacia las coordenadas (X, Y) y listo :P.


Cita de: 79137913 en 14 Enero 2014, 13:10 PMNota 3:
Cuando vuelven los retos!

Si te refieres a los retos de Scripting solo es necesario que alguien se anime (ese alguien podrías ser tú xD), si te refieres a los retos de .NET pues en lo que a mi respecta no tengo conocimiento de que existan así que no se...


Saludos!