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

#6961
Cita de: Ikillnukes;1042929488este DLL tiene siempre que estar al lado del ejecutable (.exe) para que la aplicación rule, si no lo está no se abre como sabréis.

Eso es incorrecto, una dll es un archivo localizable como cualquier otro archivo, puedes meter el ensamblado en una carpeta cualquiera, y luego cargarlo desde esa '...\carpeta\ensamblado.dll' en tu proyecto (ya sea WF o WPF).



Cita de: Ikillnukes;1042929488Para mi esto de que un maldito DLL tenga que estar al lado del Exe para que se pueda ejecutar me toca mucho la moral, y bueno, pues estuve viendo por ahí metodos de como poder llamar a este dichoso DLL desde los recursos.

Es lo más normal del mundo, una dll no es más que un conjunto de Classes y otros miembros (como un proyecto, en este caso solo métodos con sus objetos y otros miembros y los diálogos ...UserControls) compiladas en un ensamblado .NET ...de extensión dll y con sus puntos de acceso (EntryPoints) legibles y accesibles por el lenguaje, es un archivo complétamente independiente al que accedes.



Cita de: Ikillnukes;1042929488si cargo desde los recursos este dichoso DLL como se supone que Intellise va a detectar que en los recursos hay tal DLL para importarlo (Imports DLL.Dichoso)

hmmm, creo que entiendo lo que quieres decir... aunque también creo que estás confundiendo cosas, la característica IntelliSense nada tiene que ver con la importación de un ensamblado (la instrucción Imports), son dos cosas muy distintas, aparte, la declaración Imports referencia los miembros de un ensamblado para que puedas especificarlos de forma abreviada y también para evitar ambiguedades (conflictos) entre miembros que tengan el mismo nombre ...pero tú la librería la puedes usar sin importarla, solo tienes que escribir el namespace completo (una vez hayas referenciado el ensamblado).

IntelliSense es una característica que muestra la información relevante (los comentarios XML que se hayan documentado en el ensamblado), sobre los miembros (cualquier miembro documentable, como una propiedad, o un método, y sus parámetros y/o su valor de retorno),

si te fijas en alguno de mis Snippets verás muchos comentarios, pues no lo hago por gusto, lo hago para documentar el código y que IntelliSense lo muestre.

Para usar la instrucción Imports en un ensamblado (la dll), este debe existir como un archivo físico en el disco para importar (al menos que yo sepa), ten en cuenta que los recursos se cargan en la memoria y no en el disco, pero como todo espacio de memoria, este se puede manipular y extraer, así que si añades una dll como recurso a tu proyecto, una vez compilado (quiero decir, en tiempo de ejecución) podrías extraer primeramente del Stream de memoria todos los bytes que forman el archivo dll para guardarlo en el disco físico ...en un 'archivo.dll', y luego cargarlo usando Reflection, o mejor todavía, puedes cargar el Stream del ensamblado (el recurso en el namespace My.Resources) diréctamente usando Reflection,
pero el tema Reflection es MUY extenso y complejo como para explicarlo en 10 segundos, y además deberías usar reflection también para modificar todos los nombres referenciados de la libreria, por ejemplo:
Dim dialog As New Ookii.Dialogs.VistaFolderBrowserDialogEsa sería la manera normal como instanciarias el objeto, pero al no tenerlo referenciado obviamente no vas a poder especificar los nombres completos porque el Debugger te va a mandar a la mierd..., primero tienes que cargar el ensamblado, luego debes localizar el miembro instanciable (la Class que contiene el Constructor), y luego instanciarla, ejemplo:

Código (vbnet) [Seleccionar]

Imports System.Reflection

Public Class Form1


   Private Shadows Sub Shown() Handles MyBase.Shown

       ' Cargo la dll como recurso, es decir, cargo el Stream de memoria que contiene los bytes de la dll.
       Dim asm As Assembly = Assembly.Load(My.Resources.Ookii_Dialogs)

       ' Obtengo el miembro 'VistaFolderBrowserDialog' del ensamblado.
       Dim t As Type = (From member As Type In asm.GetTypes
                        Where member.Name = "VistaFolderBrowserDialog").First

       ' Instancio la Class.
       ' Esto sería el equivalente a:
       ' Dim Dialog As New Ookii.Dialogs.VistaFolderBrowserDialog
       Dim Dialog = Activator.CreateInstance(t)

       ' Asigno una propiedad del Objeto.
       Dialog.Tag = "Hello"
       MsgBox(Dialog.tag)

   End Sub

End Class
...Y eso es en versión reducida y rápida, si un método es privado o si hay coincidencias ambiguas (un método overload, con el mismo nombre que otro) deberás iterar los miembros (métodos) para hallar el correcto e invocarlo, y especificar sus Types, el Binder, y etc, y lo mismo para asignar valores a las propiedades en caso de que se den las mismas circunstancias, usar Reflection no es moco de pavo, es algo avanzado, aunque cuando vas aprendiendo te das cuenta de que hay cosas que son muy sencillas al fin y al cabo.

Y en fín, por esa razón te sugerí otras alternativas (seguir leyendo abajo).



Cita de: Ikillnukes;1042929488ILMerge por aquí, .Net Shrink por allá, pero ningún maldito tutorial en condiciones que te explique paso por paso lo que se supone que hay que hacer.

No se si es sarcasmo, porque lo de ILMerge y .NET Shrink te lo sugerí yo... y a mi parecer si no te entiendes con una aplicación tan sencilla diseñada para newbies como es .NET Shrink entonces diréctamente te sugiero dejar de programar.

Te explico, abres la aplicación, arrastras los ensamblados .NET (el exe + las librerías dll), y le das al botoncito que pone 'Compress File', y listo, ya tienes todos los ensamblados empaquetado en un único archivo executable, muy dificil no es ...¿VERDAD?, ¿sigue siendo necesario un tutorial?.

De hecho te recomendé el uso de esa aplicación porque es lo más sencillo y rápido para ti, tú lo que debes hacer es agregar tus librerías dll a tu proyecto, no te preocupes por si la dll está "al lado" del exe, tu hazlo e importas la librería en tu proyecto como harias normalmente, acabas tu proyecto y todo el código, y luego (el paso final) abres el .NET Shrink (o ILMerge u otros Mergers) y lo empaquetas como te expliqué, se generará un único archivo EXE que contendrá todas las dll que hayas metido, la structura de archivos seguirá siendo la misma intérnamente, es decir, la dll estará ubicada al lado del exe ...pero todo estará empaquetado y podrás usar esa dll teniendo solo un exe (con la dll adentro).


Saludos!




Aparte de eso, por si te interesa más Reflection, hice este ejemplo y lo posteé hace tiempo en el hilo de Snippets, un ejemplo para localizar e invocar métodos:

Código (vbnet) [Seleccionar]
Imports System.Reflection
Imports System.Globalization

Public Class Form1

   Private Shadows Sub Load() Handles MyBase.Load

       Dim MethodName As String = "Test"

       Dim Method As MethodInfo =
           Me.GetType().GetMethod(MethodName, BindingFlags.IgnoreCase Or BindingFlags.Instance Or
                                              BindingFlags.Public Or BindingFlags.NonPublic)

       If Method IsNot Nothing Then
           Method.Invoke(Me, BindingFlags.IgnoreCase Or BindingFlags.Instance Or
                             BindingFlags.Public Or BindingFlags.NonPublic,
                         Nothing,
                         New Object() {"Hello World!", Type.Missing}, CultureInfo.InvariantCulture)

       Else
           MsgBox("Method not found.")

       End If

   End Sub

   Private Sub Test(ByVal StringValue As String, Optional ByVal IntValue As Integer = 1)
       MessageBox.Show(StringValue & IntValue)
   End Sub

End Class


Nota: Hay que tener muy presente la visibilidad del miembro.
#6962
Por supuesto, WindowsScriptHost (WSH), que es el intérprete de VisualBasicScript (VBS), es algo implementado de forma nativa en el SO ...y siempre lo será! xD.

Saludos!
#6963
Cita de: MoNsTeR_MoDz en 21 Abril 2014, 18:02 PM
gracias x responder pero no se por donde empezar...

Pues si piensas desarrollar un sistema de registro de licencias online que sea fiable sin apenas experiencia en el tema... :¬¬ (yo tampoco es que tenga mucha)

Con el uso de la librería CryptoLicensing (y la GUI) tienes el 90% del trabajo hecho.

Nota: Es de pago (...para quien quiera comprarla xD) e incluye varios ejemplos en VB.NET/C#, aparte, en el post con chincheta sobre Snippets puedes encontrar ejemplos mios básicos de esta librería.

Saludos!

#6964
.NET (C#, VB.NET, ASP) / Re: ayuda con textbox
22 Abril 2014, 12:47 PM
Cita de: nolasco281 en 22 Abril 2014, 11:29 AMDicho esto estoy ya estudiando el código que tuviste la gentileza de compartir y tratando de entender muchas cosas que desconozco

El código podría ser MUCHO más sencillo ...muchisimo más, pero decidí usar Reflection para compatibilizar la propiedad TextAlign con otros controles de los que carecen de dicha propiedad y otros usan una enumeración distinta (de todas formas la propiedad al final decidí eliminar del código porque me estaba dando por culo al intentar restaurar el valor original del control al suscribirme al evento KeyDown del Textbox y quedaba un efecto muy feo xD), y también para los controles que no tuvieran propiedades como Font, Forecolor, etc...

A raíz de usar Reflection lo bueno es que los métodos SetProperties y RestoreProperties son bastante dinámicos y para extender la funcionalidad de la Class en general solo deberías añadir más nombres de propedades en la (sub)Class "HintProperties", y usar el parámetro SkipProperties al llamar a los métodos SetProperties/RestoreProperties  (en caso de que sea necesario omitir alguna propiedad).

Eso sí, no le añadí ningún Error-Handling (try/catch) ya que creo haber tenido todos los posibles conflictos en cuenta, mientras la Class se use con controles nativos de .NET framework no debería saltar ninguna excepción (espero que no).

¿Información sobre watermarks en controles?, no sabría decirte... tampoco yo creo que existe mucha documentación al respecto, puedes buscar y estudiar otros sources aquí: http://www.google.com/search?q=codeproject+control+watermark&ie=utf-8&oe=utf-8&lr=lang_en#lr=lang_en&q=codeproject+control+watermark&safe=active&tbs=lr:lang_1en hay varios métodos para hacerlo (por ejemplo, con Brushes)

Saludos!
#6965
.NET (C#, VB.NET, ASP) / Re: ayuda con textbox
22 Abril 2014, 05:30 AM
Esto lo acabo de escribir para reemplazar a los dos métodos que te proporcioné antes y extender su funcionalidad,
es un ayudante (una helper class) bastante personalizable para asignar/eliminar hints/watermarks a los controles.

EDITO: Código Actualizado
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 04-22-2014
' ***********************************************************************
' <copyright file="ControlHintHelper.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System.Reflection

#End Region

''' <summary>
''' Helper Class that manages text-hints for Edit controls.
''' </summary>
Friend NotInheritable Class ControlHintHelper

#Region " Object members "

    ''' <summary>
    ''' Collection of currentlly handled controls and it's text-hint properties.
    ''' </summary>
    Public Shared ControlHints As New Dictionary(Of Control, HintProperties)

    ''' <summary>
    ''' Collection of currentlly handled controls and it's default property values.
    ''' </summary>
    Private Shared ControlHintsDefaults As New Dictionary(Of Control, HintProperties)

#End Region

#Region " Properties "

    ''' <summary>
    ''' Determines a text-hint and it's personalization properties.
    ''' </summary>
    Public Class HintProperties

        ''' <summary>
        ''' Gets or sets the text-hint type.
        ''' </summary>
        ''' <value>The Hint type.</value>
        Public Property HintType As HintType = ControlHintHelper.HintType.Normal

        ''' <summary>
        ''' Gets or sets the text-hint.
        ''' </summary>
        ''' <value>The hint-text.</value>
        Public Property Text As String = String.Empty

        ''' <summary>
        ''' Gets or sets the text-hint font.
        ''' </summary>
        ''' <value>The text font.</value>
        Public Property Font As Font = Nothing

        ''' <summary>
        ''' Gets or sets the text-hint color.
        ''' </summary>
        ''' <value>The text color.</value>
        Public Property ForeColor As Color = Color.Empty

    End Class

#End Region

#Region " Enums "

    ''' <summary>
    ''' Specifies the posssible Hint types.
    ''' </summary>
    Public Enum HintType As Integer

        ''' <summary>
        ''' The Hint is removed when the Control gets focus.
        ''' </summary>
        Normal = 0

        ''' <summary>
        ''' The Hint is not removed when the Control gets focus.
        ''' </summary>
        Persistent = 1

    End Enum

#End Region

#Region " Constructors "

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

#End Region

#Region " Public Methods "

    ''' <summary>
    ''' Sets a new text-hint for an specific control.
    ''' </summary>
    ''' <param name="Control">Indicates the control.</param>
    ''' <param name="HintProperties">TheIndicates the text-hint properties.</param>
    ''' <exception cref="Exception">Text hint can't be null or empty.</exception>
    Public Shared Sub SetHint(ByVal [Control] As Control,
                              ByVal [HintProperties] As HintProperties)

        ' Ensure and fix empty hint properties.
        With [HintProperties]

            If String.IsNullOrEmpty(.Text) Then
                Throw New Exception("Text hint can't be null or empty.")
                Exit Sub
            End If

            If .Font Is Nothing Then
                .Font = GetPropertyValue([Control], "Font")
            End If

            If .ForeColor = Color.Empty Then
                .ForeColor = GetPropertyValue([Control], "ForeColor")
            End If

        End With

        ' Set the default control property values to restore them when needed.
        Dim Deaults As New HintProperties
        With Deaults
            .Text = String.Empty
            .Font = GetPropertyValue([Control], "Font")
            .ForeColor = GetPropertyValue([Control], "ForeColor")
        End With

        ' Ready to handle the Control.
        Select Case ControlHints.ContainsKey([Control])

            Case True ' Control-hint is already set and handled.
                ' Just replace the new hint properties in the collection.
                ControlHints([Control]) = [HintProperties]

            Case False ' Control-hint is not set.

                ' Add the hint properties into collections.
                ControlHints.Add([Control], [HintProperties])
                ControlHintsDefaults.Add([Control], Deaults)

                With [Control]

                    ' Remove previouslly handled events (if any).
                    RemoveHandler .HandleCreated, AddressOf Control_HandleCreated
                    RemoveHandler .Enter, AddressOf Control_Enter
                    RemoveHandler .Leave, AddressOf Control_Leave
                    RemoveHandler .Disposed, AddressOf Control_Disposed
                    RemoveHandler .MouseDown, AddressOf Control_MouseDown
                    RemoveHandler .KeyDown, AddressOf Control_KeyDown

                    ' Start handling the control events.
                    AddHandler .HandleCreated, AddressOf Control_HandleCreated
                    AddHandler .Enter, AddressOf Control_Enter
                    AddHandler .Leave, AddressOf Control_Leave
                    AddHandler .Disposed, AddressOf Control_Disposed
                    AddHandler .MouseDown, AddressOf Control_MouseDown
                    AddHandler .KeyDown, AddressOf Control_KeyDown

                End With

        End Select

    End Sub

    ''' <summary>
    ''' Sets a new text-hint for various controls.
    ''' </summary>
    ''' <param name="Controls">Indicates the controls.</param>
    ''' <param name="HintProperties">TheIndicates the text-hint properties.</param>
    Public Shared Sub SetHint(ByVal Controls As Control(),
                              ByVal [HintProperties] As HintProperties)

        For Each [Control] As Control In Controls
            SetHint([Control], [HintProperties])
        Next [Control]

    End Sub

    ''' <summary>
    ''' Removes a text-hint from a control.
    ''' </summary>
    ''' <param name="Control">Indicates the control.</param>
    Public Shared Sub RemoveHint(ByVal [Control] As Control)

        Select Case ControlHints.ContainsKey([Control])

            Case True ' Control-hint is already set.

                ' Remove events from event handlers.
                With [Control]
                    RemoveHandler .HandleCreated, AddressOf Control_HandleCreated
                    RemoveHandler .Enter, AddressOf Control_Enter
                    RemoveHandler .Leave, AddressOf Control_Leave
                    RemoveHandler .Disposed, AddressOf Control_Disposed
                    RemoveHandler .MouseDown, AddressOf Control_MouseDown
                    RemoveHandler .KeyDown, AddressOf Control_KeyDown
                End With

                If Not [Control].IsDisposed Then ' If the Control is not disposed then...

                    If [Control].Text.Trim = ControlHints([Control]).Text.Trim Then
                        ' Restore it's default property values and clear the control text.
                        RestoreProperties([Control], ControlHintsDefaults([Control]))
                    Else
                        ' Restore it's default property values and skip the control text.
                        RestoreProperties([Control], ControlHintsDefaults([Control]), SkipProperties:={"Text"})
                    End If

                End If

                ' Remove the control-hints from hints collections.
                ControlHints.Remove([Control])
                ControlHintsDefaults.Remove([Control])

        End Select

    End Sub

    ''' <summary>
    ''' Removes a text-hint from a control.
    ''' </summary>
    ''' <param name="Controls">Indicates the controls.</param>
    Public Shared Sub RemoveHint(ByVal Controls As Control())

        For Each [Control] As Control In Controls
            RemoveHint([Control])
        Next [Control]

    End Sub

#End Region

#Region " Private Methods "

    ''' <summary>
    ''' Gets the property value of an specific control through reflection.
    ''' </summary>
    ''' <param name="Control">Indicates the Control.</param>
    ''' <param name="PropertyName">Indicates the name of the property to get it's value.</param>
    ''' <returns>If the property is not found on the Control, the return value is 'Nothing',
    ''' Otherwise, the return value is the Control's property value.</returns>
    Private Shared Function GetPropertyValue(ByVal [Control] As Control,
                                             ByVal PropertyName As String) As Object

        Dim Prop As PropertyInfo = [Control].GetType.GetProperty(PropertyName)

        Select Case Prop Is Nothing

            Case True
                Return Nothing

            Case Else
                Return Prop.GetValue([Control], Nothing)

        End Select

    End Function

    ''' <summary>
    ''' Sets the properties of an specific control.
    ''' </summary>
    ''' <param name="Control">Indicates the Control.</param>
    ''' <param name="HintProperties">Indicates the properties to set it's values.</param>
    ''' <param name="SkipProperties">Indicates the properties to skip.</param>
    Private Shared Sub SetProperties(ByVal [Control] As Object,
                                     ByVal HintProperties As HintProperties,
                                     Optional ByVal SkipProperties As String() = Nothing)

        ' Get the control type.
        Dim ControlType As Type = [Control].GetType
        Dim ExcludeProperties As String() = If(SkipProperties Is Nothing, {""}, SkipProperties)

        ' Loop through the 'HintProperties' properties to determine whether exist all the needed properties in the Control.
        For Each HintProperty As PropertyInfo In HintProperties.GetType.GetProperties

            Dim ControlProperty As PropertyInfo = ControlType.GetProperty(HintProperty.Name)

            If Not ControlProperty Is Nothing AndAlso Not ExcludeProperties.Contains(ControlProperty.Name) Then
                ControlProperty.SetValue([Control], HintProperty.GetValue(HintProperties, Nothing), Nothing)
            End If

        Next HintProperty

    End Sub

    ''' <summary>
    ''' Restores the properties of an specific control.
    ''' </summary>
    ''' <param name="Control">Indicates the Control.</param>
    ''' <param name="DefaultProperties">Indicates the properties to reset it's values.</param>
    ''' <param name="SkipProperties">Indicates the properties to skip.</param>
    Private Shared Sub RestoreProperties(ByVal [Control] As Object,
                                         ByVal DefaultProperties As HintProperties,
                                         Optional ByVal SkipProperties As String() = Nothing)

        Dim ExcludeProperties As String() = If(SkipProperties Is Nothing, {""}, SkipProperties)

        ' Get the control type.
        Dim ControlType As Type = [Control].GetType

        ' Loop through the 'DefaultProperties' properties to determine whether exist all the needed properties in the Control.
        For Each DefaultProperty As PropertyInfo In DefaultProperties.GetType.GetProperties.Reverse

            Dim ControlProperty As PropertyInfo = ControlType.GetProperty(DefaultProperty.Name)

            If Not ControlProperty Is Nothing AndAlso Not ExcludeProperties.Contains(ControlProperty.Name) Then
                ControlProperty.SetValue([Control], DefaultProperty.GetValue(DefaultProperties, Nothing), Nothing)
            End If

        Next DefaultProperty

    End Sub

#End Region

#Region "Event Handlers "

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

        Dim [Control] As Control = DirectCast(sender, Control)
        Dim [HintProperties] As HintProperties = ControlHints([Control])

        SetProperties([Control], [HintProperties])

    End Sub

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

        Dim [Control] As Control = DirectCast(sender, Control)
        Dim [HintProperties] As HintProperties = ControlHints([Control])

        Select Case [HintProperties].HintType

            Case HintType.Normal
                If [Control].Text.Trim = [HintProperties].Text.Trim Then ' Restore it's default values.
                    RestoreProperties([Control], ControlHintsDefaults([Control]))
                End If

        End Select

    End Sub

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

        Dim [Control] As Control = DirectCast(sender, Control)
        Dim [HintProperties] As HintProperties = ControlHints([Control])

        Select Case [HintProperties].HintType

            Case HintType.Normal
                Select Case [Control].Text.Trim

                    Case Is = [HintProperties].Text.Trim ' Restore it's default values.
                        RestoreProperties([Control], ControlHintsDefaults(sender))

                    Case Is = String.Empty ' Set the hint values.
                        SetProperties([Control], [HintProperties])

                End Select

            Case HintType.Persistent
                Select Case [Control].Text.Trim

                    Case Is = String.Empty ' Set the hint values.
                        SetProperties([Control], [HintProperties])

                End Select

        End Select

    End Sub

    ''' <summary>
    ''' Handles the MouseDown event of the control.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="MouseEventArgs" /> instance containing the event data.</param>
    Private Shared Sub Control_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)

        Dim [Control] As Control = DirectCast(sender, Control)
        Dim [HintProperties] As HintProperties = ControlHints([Control])

        Select Case [HintProperties].HintType

            Case HintType.Persistent

                If [Control].Text.Trim = [HintProperties].Text.Trim Then

                    ' Get the 'Select' Control's Method (if exist).
                    Dim Method = sender.GetType.GetMethod("Select",
                                                          BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod,
                                                          Nothing,
                                                          {GetType(Integer), GetType(Integer)},
                                                          Nothing)

                    If Not Method Is Nothing Then ' Select the zero length.
                        Method.Invoke(sender, {0I, 0I})
                    End If

                End If

        End Select

    End Sub

    ''' <summary>
    ''' Handles the KeyDown event of the Control.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
    Private Shared Sub Control_KeyDown(sender As Object, e As KeyEventArgs)


        Dim [Control] As Control = DirectCast(sender, Control)
        Dim [HintProperties] As HintProperties = ControlHints([Control])

        Select Case [HintProperties].HintType

            Case HintType.Persistent
                Select Case [Control].Text.Trim

                    Case Is = [HintProperties].Text.Trim ' Restore the control values.
                        RestoreProperties([Control], ControlHintsDefaults([Control]))

                    Case Is = String.Empty
                        RestoreProperties([Control], ControlHintsDefaults([Control]), SkipProperties:={"Text"})

                End Select

            Case HintType.Normal
                Select Case [Control].Text.Trim

                    Case Is = String.Empty ' Restore the control values.
                        RestoreProperties([Control], ControlHintsDefaults([Control]))

                    Case Else
                        ' Do nothing.

                End Select

        End Select

    End Sub

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

        RemoveHint(DirectCast(sender, Control))

    End Sub

#End Region

End Class


Ejemplo de uso:

Código (vbnet) [Seleccionar]
Public Class Form1

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

        ' This call is required by the designer.
        InitializeComponent()

        ControlHintHelper.SetHint(TextBox1, New ControlHintHelper.HintProperties With {
                                            .HintType = ControlHintHelper.HintType.Persistent,
                                            .Text = "I'm a persistent hint.",
                                            .ForeColor = Color.Gray})

        ControlHintHelper.SetHint({TextBox2, TextBox3}, New ControlHintHelper.HintProperties With {
                                                            .Text = "I've set this hint on multiple controls at once!",
                                                            .ForeColor = Color.Gray})

        ControlHintHelper.SetHint(RichTextBox1, New ControlHintHelper.HintProperties With {
                                                    .Text = "Write something here...",
                                                    .Font = New Font("lucida console", 15),
                                                    .ForeColor = Color.YellowGreen})

    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ControlHintHelper.RemoveHint(TextBox1)
        ControlHintHelper.RemoveHint({RichTextBox1})
    End Sub

End Class
#6966
.NET (C#, VB.NET, ASP) / Re: ayuda con textbox
21 Abril 2014, 23:33 PM
Código (vbnet) [Seleccionar]
    ' Set Control Hint
    ' ( By Elektro )
     
    ''' <summary>
    ''' Indicates the Textbox Hint.
    ''' </summary>
    Private ReadOnly TextBoxHint As String = "I'm a control hint."

    ''' <summary>
    ''' Handles the Hint event of the TextBox control.
    ''' </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 TextBox_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles _
    TextBox1.Leave, TextBox1.HandleCreated

        Select Case CStr(sender.Text)

            Case Is = TextBoxHint
                sender.text = String.Empty

            Case Is = String.Empty
                sender.text = TextBoxHint

        End Select

    End Sub

    ''' <summary>
    ''' Handles the Enter event of the TextBox control.
    ''' </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 TextBox_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles _
    TextBox1.Enter

        Select Case CStr(sender.Text)

            Case Is = TextBoxHint
                sender.text = String.Empty

        End Select

    End Sub


O usando API's:

Código (vbnet) [Seleccionar]
    ' Set Control Hint
    ' ( By Elektro )
    '
    ' Usage Examples:
    ' SetControlHint(TextBox1, "I'm a text hint.")

    ''' <summary>
    ''' Messages to send to an Edit control, such a TextBox.
    ''' </summary>
    Private Enum EditControlMessages As Integer

        ''' <summary>
        ''' Sets the textual cue, or tip, that is displayed by the edit control to prompt the user for information.
        ''' http://msdn.microsoft.com/en-us/library/windows/desktop/bb761639%28v=vs.85%29.aspx
        ''' </summary>
        SetCueBanner = &H1501I

    End Enum

    ''' <summary>
    ''' Sends the specified message to a window or windows.
    ''' The SendMessage function calls the window procedure for the specified window
    ''' and does not return until the window procedure has processed the message.
    ''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx
    ''' </summary>
    ''' <param name="hWnd">
    ''' A handle to the Control whose will receive the message.
    ''' </param>
    ''' <param name="msg">
    ''' The message to be sent.
    ''' </param>
    ''' <param name="wParam">
    ''' Additional message-specific information.
    ''' </param>
    ''' <param name="lParam">
    ''' Additional message-specific information.
    ''' </param>
    ''' <returns>
    ''' The return value specifies the result of the message processing; it depends on the message sent.
    ''' </returns>
    <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SendMessage",
    CharSet:=System.Runtime.InteropServices.CharSet.Auto)>
    Private Shared Function SendEditControlMessage(
            ByVal hWnd As IntPtr,
            ByVal msg As EditControlMessages,
            ByVal wParam As IntPtr,
            <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)>
            ByVal lParam As String
    ) As UInteger
    End Function

    ''' <summary>
    ''' Sets a text hint for an edit control such a TextBox.
    ''' </summary>
    ''' <param name="Control">Indicates the control.</param>
    ''' <param name="Hint">Indicates the text hint.</param>
    ''' <returns><c>true</c> if operation succeeds, <c>false</c> otherwise.</returns>
    Private Function SetControlHint(ByVal [Control] As Control,
                                    ByVal Hint As String) As Boolean

        Return SendEditControlMessage([Control].Handle, EditControlMessages.SetCueBanner, IntPtr.Zero, Hint)

    End Function


Saludos.
#6967
Cita de: cyberalejo17 en 21 Abril 2014, 05:15 AM
¿A propósito del script, que te parece?

Pues, dejando a un lado las florituras (el diseño de los menus y tal) y centrándome en la parte importante que se debe tener más en cuenta, es decir, en el código, la forma en que lo has desarrollado, y su funcionalidad, debo decir que me parece un muy buen Script.

Para ser Batch lo hiciste bastante bien, con varios detalles y se nota que le pusiste empeño al hacerlo, está muy bien, lo que más puedo valorar del Script es que lo documentaste.

Por otro lado, no quiero ponerme a sacar muchos defectos (o mejoras) porque siempre puedo acabar sacando una docena de ellos xD, pero veamos... te comentaré algunos aspectos importantes a tener en cuenta:

1. En muchas ocasiones no haces uso de las comillas dobles para encerrar variables ni expresiones, así como tampoco haces ningún uso de los operadores de agrupación (), eso es una mala costumbre que debes corregir, ya que en ciertas circunstancias esto ocasionará errores indeseados, y también es una mejora a la sintaxis de tu Script y dará una mayor libertad si quieres concatenar instrucciones.

Por ejemplo, esta ruta que contiene espacios en el nombre:
Citarset rutaTC=%programfiles%\TrueCrypt\TrueCrypt.exe
Correción:
set "rutaTC=%programfiles%\TrueCrypt\TrueCrypt.exe"

Y aquí:
Citarif not exist "%letraTC%:\%rutaArchvoKP%" goto :MONTAR_RW_var2
Correción:
if not exist "%letraTC%:\%rutaArchvoKP%" (goto :MONTAR_RW_var2)


2. Esto quizás dependa más de gustos y del concepto que cada persona tenga sobre la organización, pero en mi opinión el código se puede organizarm mejor ...podrías separar los menus y otros mensajes, del código funcional, por ejemplo:

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

REM =====
REM MENUS
REM =====

:Menu1:: Menu con las opciones para montar unidad.
echo.
echo  ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo  º                                   Abrir USB                                    º
echo  ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
echo  º                             º                                                  º
echo  º TC Principal                º                                                  º
echo  º  1) S¢lo lectura úúúúúúúúúúúº Monta la unidad principal en modo RO (defecto)   º
echo  º  2) Escritura úúúúúúúúúúúúúúº Monta la unidad principal en modo RW             º
echo  º                             º                                                  º
echo  º                             º                                                  º
echo  º Ba£l                        º                                                  º
echo  º  3) Abrir ba£l úúúúúúúúúúúúúº Monta la unidad principal en modo RW e inicia el º
echo  º                             º   ba£l de contrase¤as                            º
echo  º                             º                                                  º
echo  º                             º                                                  º
echo  º                             º                                                  º
echo  º                             º                                                  º
echo  º Extras                      º                                                  º
echo  º  4) Mostrar archivos ocultosº Mostrar las carpetas ocultas en la memoria       º
echo  º                             º                                                  º
echo  ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
Goto :EOF

:Menu2:: Menu con las opciones para desmontar la unidad
...
Goto:EOF

:Menu3:: Advierte el preligro de la ejecucion de attrib.
...
Goto:EOF


REM ==============
REM CÓDIGO PRINCIPAL
REM ==============


REM Resto del código...

:MENU_NOT_EXIST
cls
Call :Menu1
set var=1
set /p var= Seleccione una opci¢n (1-4) [1]:
if %var%==1 goto :MONTAR_RO
if %var%==2 goto :MONTAR_RW
if %var%==3 goto :MONTAR_RW
if %var%==4 goto :MOSTRAR_ADVERTENCIA
goto :eol

REM Resto del código...



3. Deberías reemplazar el comando 'Set /P' por el comando 'Choice' para evitar respuestas erroneas (1-4) (aunque las estés controlando de forma básica con una llamada a una etiqueta)

Choice /C "1234" /M "Seleccione una opci¢n"


Saludos.
#6968
Citarset /P "respuesta=Abrir Thunderbird? (s/n)"
set /P "respuesta=Spotify, Radiosure o ninguno? (s/r/n)"
Me refiero a que asignas un nombre de variable ('Respuesta') para lo que se supone que deberían ser dos variables distintas, esto no se debe hacer ...en ningún lenguaje, ya que solo estarás reasignando el valor a la primera variable y esto puede ocasionar confusiones y generar errores por valores reemplazados.

Citar
Código (dos,8) [Seleccionar]
If /i "%respuesta%"=="s" (Goto :Thunderbird)

:Thunderbird
...

:Siguiente
...
Pause&Exit
En el bloque de la etiqueta :Thunderbird debes especificar como última instrucciún el comando Exit, u otro comando para no seguir la ejecución de los siguientes bloques de abajo (:Siguiente)

Aparte de esas correcciones minuciosas ... por lo demás el código debería funcionar, el comando Choice detiene la ejecución del hilo para esperar el Input por parte del usuario, solo puedes pulsar "S","R", o "N", es imposible que "no funcione" y te de error, a mi me funcionaba tanto este último Script que publicaste, como el anterior, pero si dices que no va, pues no va, algo estamos dejando pasar por alto ...pero es posible que no sea algo referente al código.

¿Usas Windows XP? (la sintaxis del comando Choice es distinta, revísala)
¿Tienes el directorio 'C:\Windows\System32' agregado a la variable de entorno PATH de Windows?.
¿El error te aparece despues de introducir el Input en el comando choice, o antes de que el comando se ejecute?.

Saludos
#6969
1. No uses el mismo nombre de variable para más de una variable o pueden entrar en conflicto sus valores...

Set /P "Respuesta1=..."
Set /P "Respuesta2=..."


2. El resultado del comando Choice se almacena en el código de salida, es decir, puedes acceder a él en la variable dinámica ERRORLEVEL.

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

Choice /C "SRN" /M "Spotify, Radiosure, o ninguno?"
Call :Choice%ErrorLevel%
Pause&Exit

:Choice1::S
("%AppData%\Spotify\spotify.exe")2>NUL & Goto :EOF

:Choice2::R
("%LocalAppData%\RadioSure\RadioSure.exe")2>NUL & Goto :EOF

:Choice3::N
Goto :EOF


Saludos
#6970
Código (dos) [Seleccionar]
Choice /C "SRN" /M "Spotify, Radiosure o ninguno?"

Saludos