Librería de Snippets para VB.NET !! (Compartan aquí sus snippets)

Iniciado por Eleкtro, 18 Diciembre 2012, 22:23 PM

0 Miembros y 2 Visitantes están viendo este tema.

Eleкtro

Para una aplicación necesité dividir el tamaño de unos MEgaBytes entre la capacidad de un DVD5, así que ya puestos he hecho este snippet que divide el tamaño entre varios formatos de discos, para la próxima ocasión.

PD: Las medidas están sacadas de la Wikipedia, para los más...  :-X

Saludos.

Código (vbnet) [Seleccionar]

    ' Usage:
    '
    ' MsgBox(ConvertToDiscSize(737280000, "Bytes", "CD"))
    ' MsgBox(ConvertToDiscSize(700, "MB", "CD"))
    ' MsgBox(Math.Ceiling(ConvertToDiscSize(6.5, "GB", "DVD")))
    ' MsgBox(ConvertToDiscSize(40, "GB", "BR").ToString.Substring(0, 3) & " Discs")

#Region " Convert To Disc Size function"
    Private Function ConvertToDiscSize(ByVal FileSize As Double, ByVal FileKindSize As String, ByVal To_DiscKindCapacity As String)

        ' KindSize Measures:
        ' --------------------------
        ' Bytes
        ' KB
        ' MB
        ' GB

        ' ToDiscKind Measures:
        ' -----------------------------
        ' CD
        ' CD800
        ' CD900
        ' DVD
        ' DVD-DL
        ' BR
        ' BR-DL
        ' BR-3L
        ' BR-4L
        ' BR-MD
        ' BR-MD-DL


        ' Bytes
        If FileKindSize.ToUpper = "BYTES" Then
            If To_DiscKindCapacity.ToUpper = "CD" Then Return FileSize / 737280000 ' CD Standard
            If To_DiscKindCapacity.ToUpper = "CD800" Then Return FileSize / 829440393.216 ' CD 800 MB
            If To_DiscKindCapacity.ToUpper = "CD900" Then Return FileSize / 912383803.392 ' CD 900 MB
            If To_DiscKindCapacity.ToUpper = "DVD" Then Return FileSize / 4700000000 ' DVD Standard (DVD5
            If To_DiscKindCapacity.ToUpper = "DVD-DL" Then Return FileSize / 8500000000 ' DVD Double Layer (DVD9)
            If To_DiscKindCapacity.ToUpper = "BR" Then Return FileSize / 25025314816 ' BluRay Standard
            If To_DiscKindCapacity.ToUpper = "BR-DL" Then Return FileSize / 50050629632 ' BluRay Double Layer
            If To_DiscKindCapacity.ToUpper = "BR-3L" Then Return FileSize / 100103356416 ' BluRay x3 Layers
            If To_DiscKindCapacity.ToUpper = "BR-4L" Then Return FileSize / 128001769472 ' BluRay x4 Layers
            If To_DiscKindCapacity.ToUpper = "BR-MD" Then Return FileSize / 7791181824 ' BluRay MiniDisc Standard
            If To_DiscKindCapacity.ToUpper = "BR-MD-DL" Then Return FileSize / 15582363648 ' BluRay MiniDisc Double Layer

            ' KB
        ElseIf FileKindSize.ToUpper = "KB" Then
            If To_DiscKindCapacity.ToUpper = "CD" Then Return FileSize / 720000 ' CD Standard
            If To_DiscKindCapacity.ToUpper = "CD800" Then Return FileSize / 810000.384 ' CD 800 MB
            If To_DiscKindCapacity.ToUpper = "CD900" Then Return FileSize / 890999.808 ' CD 900 MB
            If To_DiscKindCapacity.ToUpper = "DVD" Then Return FileSize / 4589843.75 ' DVD Standard (DVD5)
            If To_DiscKindCapacity.ToUpper = "DVD-DL" Then Return FileSize / 8300781.25 ' DVD Double Layer (DVD9)
            If To_DiscKindCapacity.ToUpper = "BR" Then Return FileSize / 24438784 ' BluRay Standard
            If To_DiscKindCapacity.ToUpper = "BR-DL" Then Return FileSize / 48877568 ' BluRay Double Layer
            If To_DiscKindCapacity.ToUpper = "BR-3L" Then Return FileSize / 97757184 ' BluRay x3 Layers
            If To_DiscKindCapacity.ToUpper = "BR-4L" Then Return FileSize / 125001728 ' BluRay x4 Layers
            If To_DiscKindCapacity.ToUpper = "BR-MD" Then Return FileSize / 7608576 ' BluRay MiniDisc Standard
            If To_DiscKindCapacity.ToUpper = "BR-MD-DL" Then Return FileSize / 15217152 ' BluRay MiniDisc Double Layer

            ' MB
        ElseIf FileKindSize.ToUpper = "MB" Then
            If To_DiscKindCapacity.ToUpper = "CD" Then Return FileSize / 703.125 ' CD Standard
            If To_DiscKindCapacity.ToUpper = "CD800" Then Return FileSize / 791.016 ' CD 800 MB
            If To_DiscKindCapacity.ToUpper = "CD900" Then Return FileSize / 870.117 ' CD 900 MB
            If To_DiscKindCapacity.ToUpper = "DVD" Then Return FileSize / 4482.26929 ' DVD Standard (DVD5)
            If To_DiscKindCapacity.ToUpper = "DVD-DL" Then Return FileSize / 8106.23169 ' DVD Double Layer (DVD9)
            If To_DiscKindCapacity.ToUpper = "BR" Then Return FileSize / 23866 ' BluRay Standard
            If To_DiscKindCapacity.ToUpper = "BR-DL" Then Return FileSize / 47732 ' BluRay Double Layer
            If To_DiscKindCapacity.ToUpper = "BR-3L" Then Return FileSize / 95466 ' BluRay x3 Layers
            If To_DiscKindCapacity.ToUpper = "BR-4L" Then Return FileSize / 122072 ' BluRay x4 Layers
            If To_DiscKindCapacity.ToUpper = "BR-MD" Then Return FileSize / 7430.25 ' BluRay MiniDisc Standard
            If To_DiscKindCapacity.ToUpper = "BR-MD-DL" Then Return FileSize / 14860.5 ' BluRay MiniDisc Double Layer

            ' GB
        ElseIf FileKindSize.ToUpper = "GB" Then
            If To_DiscKindCapacity.ToUpper = "CD" Then Return FileSize / 0.68665 ' CD Standard
            If To_DiscKindCapacity.ToUpper = "CD800" Then Return FileSize / 0.77248 ' CD 800 MB
            If To_DiscKindCapacity.ToUpper = "CD900" Then Return FileSize / 0.84972 ' CD 900 MB
            If To_DiscKindCapacity.ToUpper = "DVD" Then Return FileSize / 4.37722 ' DVD Standard (DVD5)
            If To_DiscKindCapacity.ToUpper = "DVD-DL" Then Return FileSize / 7.91624 ' DVD Double Layer (DVD9)
            If To_DiscKindCapacity.ToUpper = "BR" Then Return FileSize / 23.30664 ' BluRay Standard
            If To_DiscKindCapacity.ToUpper = "BR-DL" Then Return FileSize / 46.61328 ' BluRay Double Layer
            If To_DiscKindCapacity.ToUpper = "BR-3L" Then Return FileSize / 93.22852 ' BluRay x3 Layers
            If To_DiscKindCapacity.ToUpper = "BR-4L" Then Return FileSize / 119.21094 ' BluRay x4 Layers
            If To_DiscKindCapacity.ToUpper = "BR-MD" Then Return FileSize / 7.2561 ' BluRay MiniDisc Standard
            If To_DiscKindCapacity.ToUpper = "BR-MD-DL" Then Return FileSize / 14.51221 ' BluRay MiniDisc Double Layer
        End If

        Return Nothing ' Argument measure not found

    End Function
#End Region









Eleкtro

#11
He actualizado el pack de Snippets en el post principal (Antes eran 76, ahora 114)

Si alguien quiere que incluya un pack con sus snippets en el post principal porfavor que me pase los snippets en formato de snippet (Archivo.snippet).

Y añado este snippet, un delimitador de strings, es parecido al método "Split", pero bajo mi opinión lo he mejorado bastante!

· Acepta 1 o 2 delimitadores,
· Opción de IgnoreCase
· Delimitar de izquierda a derecha o de derecha a izquierda.

Saludos!

Código (vbnet) [Seleccionar]
#Region " Delimit_String Function "

    ' // By Elektro H@ker
    '
    ' USAGE:
    '
    ' MsgBox(Delimit_String("Welcome to my new house", "to")) ' my new house
    ' MsgBox(Delimit_String("Welcome to my new house", "to", "house")) ' my new
    ' MsgBox(Delimit_String("Welcome to my new house", "TO", "HoUSe", True)) ' my new
    ' MsgBox(Delimit_String("Welcome to my new house", "house", "to", , "Left")) ' my new
    ' MsgBox(Delimit_String("Welcome to my new house", "TO", "HoUSe", False)) ' False
    ' MsgBox(Delimit_String("Welcome to my new house", "to", "to", , "Left")) ' Index was outside bounds of the array

    Private Function Delimit_String(ByVal STR As String, ByVal Delimiter_A As String, Optional ByVal Delimiter_B As String = "", Optional ByVal Ignore_Case As Boolean = False, Optional ByVal Left_Or_Right As String = "Right")
        Dim Compare_Method As Integer = 0 ' Don't ignore case
        If Ignore_Case = True Then Compare_Method = 1 ' Ignore Case

        If Not Left_Or_Right.ToUpper = "LEFT" And Not Left_Or_Right.ToUpper = "RIGHT" _
            Then Return False ' Returns false if the Left_Or_Right argument is in incorrect format

        If Compare_Method = 0 Then
            If Not STR.Contains(Delimiter_A) Or Not STR.Contains(Delimiter_B) _
                Then Return False ' Returns false if one of the delimiters in NormalCase can 't be found
        Else
            If Not STR.ToUpper.Contains(Delimiter_A.ToUpper) Or Not STR.ToUpper.Contains(Delimiter_B.ToUpper) _
            Then Return False ' Returns false if one of the delimiters in IgnoreCase can 't be found
        End If

        Try
            If Left_Or_Right.ToUpper = "LEFT" Then STR = Split(STR, Delimiter_A, , Compare_Method)(0) _
                Else If Left_Or_Right.ToUpper = "RIGHT" Then STR = Split(STR, Delimiter_A, , Compare_Method)(1)

            If Delimiter_B IsNot Nothing Then
                If Left_Or_Right.ToUpper = "LEFT" Then STR = Split(STR, Delimiter_B, , Compare_Method)(1) _
                 Else If Left_Or_Right.ToUpper = "RIGHT" Then STR = Split(STR, Delimiter_B, , Compare_Method)(0)
            End If

            Return STR ' Returns the splitted string
        Catch ex As Exception
            Return ex.Message ' Returns exception if index is out of range
        End Try
    End Function

#End Region










Eleкtro

Otro convertidor, en esta ocasión un convertidor de tiempo, ms, segundos, minutos, horas.


Código (VBNET) [Seleccionar]
#Region " Convert Time Function"

    ' // By Elektro H@cker
    '
    ' MsgBox(Convert_Time(1, "h", "m"))
    ' MsgBox(Convert_Time(1, "h", "s"))
    ' MsgBox(Convert_Time(1, "h", "ms"))
    ' MsgBox(Convert_Time(6000, "milliseconds", "seconds"))
    ' MsgBox(Convert_Time(6000, "seconds", "minutes"))
    ' MsgBox(Convert_Time(6000, "minutes", "hours"))

    Private Function Convert_Time(ByVal Time As Int64, ByVal Input_Time_Format As String, ByVal Output_Time_Format As String)
        Dim Time_Span As New TimeSpan
        If Input_Time_Format.ToUpper = "MS" Or Output_Time_Format.ToUpper = "MILLISECONDS" Then Time_Span = New TimeSpan(TimeSpan.TicksPerMillisecond * Time)
        If Input_Time_Format.ToUpper = "S" Or Output_Time_Format.ToUpper = "SECONDS" Then Time_Span = New TimeSpan(TimeSpan.TicksPerSecond * Time)
        If Input_Time_Format.ToUpper = "M" Or Output_Time_Format.ToUpper = "MINUTES" Then Time_Span = New TimeSpan(TimeSpan.TicksPerMinute * Time)
        If Input_Time_Format.ToUpper = "H" Or Output_Time_Format.ToUpper = "HOURS" Then Time_Span = New TimeSpan(TimeSpan.TicksPerHour * Time)
        If Output_Time_Format.ToUpper = "MS" Or Output_Time_Format.ToUpper = "MILLISECONDS" Then Return Time_Span.TotalMilliseconds
        If Output_Time_Format.ToUpper = "S" Or Output_Time_Format.ToUpper = "SECONDS" Then Return Time_Span.TotalSeconds
        If Output_Time_Format.ToUpper = "M" Or Output_Time_Format.ToUpper = "MINUTES" Then Return Time_Span.TotalMinutes
        If Output_Time_Format.ToUpper = "H" Or Output_Time_Format.ToUpper = "HOURS" Then Return Time_Span.TotalHours
        Return False ' Returns false if argument is in incorrect format
    End Function

#End Region








Eleкtro

Set_PC_State

Código (vbnet) [Seleccionar]

    ' // By Elektro H@cker

    ' USAGE:
    '
    ' Set_PC_State(RESET)
    ' Set_PC_State(SUSPEND, 30, "I'm suspending your system.")
    ' Set_PC_State(LOG_OFF)
    ' Set_PC_State(HIBERN)
    ' Set_PC_State(ABORT)

#Region " Set PC State "

    Const RESET As String = " -R "
    Const SUSPEND As String = " -S "
    Const LOG_OFF As String = " -L "
    Const HIBERN As String = " -H "
    Const ABORT As String = " -A "

    Private Function Set_PC_State(ByVal PowerState_Action As String, Optional ByVal TimeOut As Integer = 1, Optional ByVal COMMENT As String = "")

        Dim Shutdown_Command As New ProcessStartInfo
        Shutdown_Command.FileName = "Shutdown.exe"

        Try
            If PowerState_Action = ABORT Or PowerState_Action = HIBERN Or PowerState_Action = LOG_OFF Then
                Shutdown_Command.Arguments = PowerState_Action ' Windows don't allow TimeOut or Comment options for HIBERN, LOG_OFF or ABORT actions.
            ElseIf PowerState_Action = RESET Or PowerState_Action = SUSPEND Then
                If Not COMMENT = "" Then
                    If COMMENT.Length > 512 Then COMMENT = COMMENT.Substring(0, 512) ' Only 512 chars are allowed for comment
                    Shutdown_Command.Arguments = PowerState_Action & " -T " & TimeOut & " /C " & COMMENT
                Else
                    Shutdown_Command.Arguments = PowerState_Action & " -T " & TimeOut
                End If
                Shutdown_Command.WindowStyle = ProcessWindowStyle.Hidden
                Process.Start(Shutdown_Command)
                Return True
            End If
        Catch ex As Exception
            Return ex.Message
        End Try

        Return Nothing ' Invalid argument
    End Function

#End Region







Día local:

Código (vbnet) [Seleccionar]

Dim Today as string = My.Computer.Clock.LocalTime.DayOfWeek ' In English language

Dim Today as string = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetDayName(Date.Today.DayOfWeek) ' In system language






String is URL?

Código (vbnet) [Seleccionar]
    ' USAGE:
    '
    ' If String_Is_URL("http://google.com") Then MsgBox("Valid url!") Else MsgBox("Invalid url!")

#Region " String Is URL Function "

    Private Function String_Is_URL(ByVal STR As String)
        Dim URL_Pattern As String = "^(http|https):/{2}[a-zA-Z./&\d_-]+"
        Dim URL_RegEx As New System.Text.RegularExpressions.Regex(URL_Pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.ExplicitCapture)
        If URL_RegEx.IsMatch(STR) Then Return True Else Return False
    End Function

#End Region






G-Mail Sender (Envía emails)

Código (vbnet) [Seleccionar]
    ' USAGE:
    '
    ' GMail_Sender("Your_Email@Gmail.com", "Your_Password", "Email Subject", "Message Body", "Destiny@Email.com")

#Region " GMail Sender function "

    Private Function GMail_Sender(ByVal Gmail_Username As String, ByVal Gmail_Password As String, ByVal Email_Subject As String, ByVal Email_Body As String, ByVal Email_Destiny As String)
        Try
            Dim MailSetup As New System.Net.Mail.MailMessage
            MailSetup.Subject = Email_Subject
            MailSetup.To.Add(Email_Destiny)
            MailSetup.From = New System.Net.Mail.MailAddress(Gmail_Username)
            MailSetup.Body = Email_Body
            Dim SMTP As New System.Net.Mail.SmtpClient("smtp.gmail.com")
            SMTP.Port = 587
            SMTP.EnableSsl = True
            SMTP.Credentials = New Net.NetworkCredential(Gmail_Username, Gmail_Password)
            SMTP.Send(MailSetup)
            Return True ' Email is sended OK
        Catch ex As Exception
            Return ex.Message ' Email can't be sended
        End Try
    End Function

#End Region










Eleкtro

Get OS Version

Código (vbnet) [Seleccionar]
        Dim OS_Version As String = System.Environment.OSVersion.ToString
        MsgBox(OS_Version)





String Is Email

Código (vbnet) [Seleccionar]
    ' // By Elektro H@cker
    '
    ' USAGE:
    '
    ' MsgBox(String_Is_Email("User@Email.com"))

#Region " String Is Email Function "

    Private Function String_Is_Email(ByVal Email_String As String)
        Dim Emaill_RegEx As New System.Text.RegularExpressions.Regex("^[A-Za-z0-9][A-Za-z0-9]+\@[A-Za-z0-9]+\.[A-Za-z0-9][A-Za-z0-9]+$")
        If Emaill_RegEx.IsMatch(Email_String) Then Return True Else Return False
    End Function

#End Region





Get Random Password

Código (vbnet) [Seleccionar]
    ' USAGE:
    '
    ' MsgBox(Get_Random_Password(8))
    ' MsgBox(Get_Random_Password(36))

#Region " Get Random Password Function "

    Public Function Get_Random_Password(ByVal Password_Length As Double) As String
        Dim New_Password As String = System.Guid.NewGuid.ToString
        If Password_Length <= 0 OrElse Password_Length > New_Password.Length Then
            Throw New ArgumentException("Length must be between 1 and " & New_Password.Length)
        End If
        Return New_Password.Substring(0, Password_Length)
    End Function

#End Region





Get Printers

Código (vbnet) [Seleccionar]
    ' // By Elektro H@cker
    '
    ' USAGE:
    '
    '  For Each Printer_Name In Get_Printers() : MsgBox(Printer_Name) : Next

    Private Function Get_Printers()
        Dim Printer_Array As New List(Of String)
        Try
            For Each Printer_Name As String In System.Drawing.Printing.PrinterSettings.InstalledPrinters : Printer_Array.Add(Printer_Name) : Next
        Catch ex As Exception
            If ex.Message.Contains("RPC") Then Return "RPC Service is not avaliable"
        End Try
        Return Printer_Array
    End Function








ABDERRAMAH

Pues yo tengo una colección de funciones para crear, cargar y superponer imágenes así como para escribir texto usando gdi+:

cargar una imágen en una resolución determinada:
Código (vbnet) [Seleccionar]
       
Public Function read_image_at_res(ByRef file As String, ByRef force_sizex As Integer, ByRef force_sizey As Integer) As System.Drawing.Bitmap
        Dim img As New Bitmap(file)
        Dim b As New Bitmap(force_sizex, force_sizey)
        Dim bg As Graphics = Graphics.FromImage(b)
        Try
            bg.DrawImage(img, New Rectangle(New Point(0, 0), New Size(force_sizex, force_sizey)), New Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel)
        Catch ex As Exception

        End Try
        bg.Dispose()
        Return b
    End Function


redimensionar una imágen:
Código (vbnet) [Seleccionar]
       
Public Function resize_bmp(ByRef img As Bitmap, ByRef sizex As Integer, ByRef sizey As Integer) As Bitmap
        Dim b As New Bitmap(sizex, sizey)
        Dim bg As Graphics = Graphics.FromImage(b)
        bg.DrawImage(img, New Rectangle(New Point(0, 0), New Size(sizex, sizey)), New Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel)
        bg.Dispose()
        Return b
    End Function


superponer dos imágenes sobre un lienzo:
Código (vbnet) [Seleccionar]
       
Public Function layer_sum(ByRef layer1 As Bitmap, ByRef layer2 As Bitmap) As Bitmap
        Dim bg As Graphics = Graphics.FromImage(layer1)
        bg.DrawImage(layer2, New Point(0, 0))
        bg.Dispose()
        Return layer1
End Function


escribir texto plano(con sombreado rudimentario) en un fondo transparente:
Código (vbnet) [Seleccionar]
       
    Public Function get_text_layer(ByRef size As System.Drawing.Size, ByRef text As String) As System.Drawing.Bitmap
        Dim img As New Bitmap(size.Width, size.Height)
        Dim bg As Graphics = Graphics.FromImage(img)
        bg.DrawString(text, New Font("Lucida Console", 12, FontStyle.Bold), Brushes.Gray, New Point(1, -1))
        bg.DrawString(text, New Font("Lucida Console", 12, FontStyle.Bold), Brushes.White, New Point(0, 0))
        bg.Dispose()
        Return img
    End Function


dividir la imagen en sectores y devolver el indicado por "index":
Código (vbnet) [Seleccionar]
       
    Public Function get_portion(ByRef image As System.Drawing.Bitmap, ByRef cuadriculax As Short, ByRef cuadriculay As Short, ByRef index As Integer) As System.Drawing.Bitmap
        Dim img As New Bitmap(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))
        'Dim b As New Bitmap(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))
        Dim bg As Graphics = Graphics.FromImage(img)
        Dim xcount = 0
        Dim ycount = 0
        Do While index >= cuadriculax
            index = index - cuadriculax
            ycount = ycount + 1
        Loop
        xcount = index
        Dim tmpx As Integer = CInt((image.Size.Width / cuadriculax) * xcount)
        Dim tmpy As Integer = CInt((image.Size.Height / cuadriculay) * ycount)
        Dim port As New Rectangle(New System.Drawing.Point(0, 0), New Size(New Point(CInt(image.Size.Width / cuadriculax), CInt(image.Size.Height / cuadriculay))))
        bg.DrawImage(image, port, tmpx, tmpy, CInt(port.Size.Width), CInt(port.Size.Height), GraphicsUnit.Pixel)
        bg.Dispose()
        Return img
    End Function


Eleкtro

@ABDERRAMAH

Muy buenos, el primero y el segundo me gustaron mucho, siempre tengo problemas para redimensionar imagenes y me viene bien.

El último también, es una idea muy dinámica lo de dividir la imagen en una cuadrícula y tomar un sector, no sé si eres el autor de las funciones pero a pocos se le habría ocurrido hacer algo así xD

Saludos!








ABDERRAMAH

Soy autor, si, aunque la idea de crear el objeto graphics y después destruirlo, en lugar de tener uno fijo para todo la vi en unos códigos de msdn.

Novlucker

Bueno, lo siguiente son sugerencias, críticas o comentarios sobre algunos de los snippets que has puesto en el post, así como algo más genérico sobre como estructuras tus métodos o funciones, y el código en general.

  • Es aconsejable declarar el tipo de retorno de las funciones en su declaración. Para alguien que no tiene claro el objetivo de una función es mucho más legible hacerlo de este modo, de lo contrario hay que revisar el código de la función en busca de los Return para darse cuenta de que la función retorna un booleano por ejemplo.

Código (vbnet) [Seleccionar]
Private Function Funcion() As Boolean

  • Función Attrib. Ya que estás creando una función que te abstrae de verificar la existencia de un archivo y asignar atributos, tal vez lo mejor sería que la función reciba una lista de atributos en lugar de un atributo global. Es decir, en este caso al utilizar tu función es necesario pasar la suma de los atributos para que asigne varios (como en la función original), pero por que no abstraerse un poco más y olvidarse de la suma?

Código (vbnet) [Seleccionar]
    Private Function Attrib(ByVal File As String, ByVal Attributes As List(Of System.IO.FileAttributes)) As Boolean
        If IO.File.Exists(File) Then
            Try
                FileSystem.SetAttr(File, Attributes.Select(Function(a) DirectCast(a, Integer)).Sum())
                Return True ' File was modified OK
            Catch ex As Exception
                ' MsgBox(ex.Message)
                Return False ' File can't be modified maybe because User Permissions
            End Try
        Else
            Return Nothing ' File doesn't exist
        End If
    End Function


  • "Controlar el mismo evento para varios controles". No es aconsejable tener un solo método con condiciones para cada control por separado, lo recomendado es tener un método por evento. Si necesitas realizar algo en específico para un control en especial, entonces asigna un método diferente al control.
  • Función ConvertToDiscSize. Si debes de pasar un string a una función, para luego tomar una decisión según se trate de un string u otro, debes de plantearte declarar un enumerador (esto mismo es aplicable a otras de tus funciones). Por otra parte, tampoco es recomendable tener todos los valores hardcodeados en un método, además de que estás repitiendo mucho código. A continuación una variante de la función reestructrada;

Código (vbnet) [Seleccionar]
#Region " Convert To Disc Size function"

Private Function ConvertToDiscSize(ByVal fileSize As Double, ByVal fileKindSize As MagnitudeType, ByVal to_DiscKindCapacity As DiscType) As Double
    Dim size As Double = GetSize(to_DiscKindCapacity)
    If (size < 0) Then Throw New ArgumentException("Tamaño de disco no localizado")
    Return fileSize * DirectCast(fileKindSize, Integer) / size
End Function

Enum MagnitudeType
    Bytes = 1
    KB = 1024
    MB = 1048576
    GB = 1073741824
End Enum

Enum DiscType
    CD
    CD800
    CD900
    DVD
    DVD_DL
    BR
    BR_DL
    BR_3L
    BR_4L
    BR_MD
    BR_MD_DL
End Enum

Private Function GetSize(ByVal discType As DiscType) As Double
    Select Case discType
        Case DiscType.CD
            Return 737280000      ' CD Standard
        Case DiscType.CD800
            Return 829440393.216 ' CD 800 MB
        Case DiscType.CD900
            Return 912383803.392 ' CD 900 MB
        Case DiscType.DVD
            Return 4700000000 ' DVD Standard (DVD5
        Case DiscType.DVD_DL
            Return 8500000000 ' DVD Double Layer (DVD9)
        Case DiscType.BR
            Return 25025314816 ' BluRay Standard
        Case DiscType.BR_DL
            Return 50050629632 ' BluRay Double Layer
        Case DiscType.BR_3L
            Return 100103356416 ' BluRay x3 Layers
        Case DiscType.BR_4L
            Return 128001769472 ' BluRay x4 Layers
        Case DiscType.BR_MD
            Return 7791181824 ' BluRay MiniDisc Standard
        Case DiscType.BR_MD_DL
            Return 15582363648 ' BluRay MiniDisc Double Layer
        Case Else
            Return -1 ' Por si se declara un nuevo valor en el enumerador sin especificar tamaño
    End Select
End Function

#End Region


Creo que por el momento es todo lo que se me ocurre, en otro momento vuelvo a mirar :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro

@Novlucker
Que grande,
antes de nada debo decir que para mi tus críticas o sugerencias (O ataques personales si se da el caos xD) son más que bien recibidas, y segundo, gracias por colocarle chincheta al tema (Quien haya sido xD), a ver si la gente se anima a compartir funciones/snippets.

Voy por partes:




1.
Sincéramente yo no le daba nada de importancia a definir el tipo de retorno de una función, ¿Porque?, pues no sé, quizás séa porque como muchas funciones las he hecho yo pues sé perfectamente que tipo de valor devuelven y no debo fijarme en esos detalles que comentas, o simplemente no le he dado importancia sin razón alguna, pero me lo has hecho ver de una manera en la que no me habia fijado, y te aseguro que estoy editando los 124 snippets definiendo el tipo de retorno de cada uno xD.

Lo malo de esto, es que si declaro el tipo en boolean (Por ejemplo), entonces ya no puedo retornar el mensaje de la excepción (Return ex.message), ¿O si?.




2.
Con tu modificación que le has hecho a la función de los atributos me has dejado loco!

Diréctamente no la entiendo...

Attributes.Select(Function(a) DirectCast(a, Integer)).Sum()
De ahí lo único que entiendo es que modificas el valor "a" a tipo entero (no se lo que significa esa "a"), lo de "Select", "Function", y "Sum, ni idea XD

Bueno, el método "Sum" ya he visto que crea una sequencia parecida a esto:
32 + 64
Lo que equivale a los valores para cambiar los atributos, vale, pero el proceso que haces para llegar a generar esa secuencia... ni idea :xD.

Lo peor de todo es que no sé usar tu modificación de la función de atributos, es muy avanzada '¬¬

Así que mientras no me muestres un ejemplo de como usar tu función, la dejo así, que está mejor que la versión original y se asemeja al comando ATTRIB de la CMD, lo que me facilita un poco más su uso:

Código (vbnet) [Seleccionar]
#Region " Change File Attributes Function "

   ' [ Change File Attributes Function ]
   '
   ' // By Elektro H@cker
   '
   ' Examples :
   ' Change_File_Attributes("C:\File.txt", H + R)
   ' Change_File_Attributes("C:\File.txt", Hidden + Read_Only)

   Const Archive As Integer = 32, A As Integer = 32
   Const Directory As Integer = 16, D As Integer = 16
   Const Hidden As Integer = 2, H As Integer = 2
   Const Normal As Integer = 0, N As Integer = 0
   Const Read_Only As Integer = 1, R As Integer = 1
   Const System As Integer = 4, S As Integer = 4
   Const Volume As Integer = 8, V As Integer = 8

   Private Function Change_File_Attributes(ByVal File As String, ByVal Attributes As System.IO.FileAttributes) As Boolean
       If IO.File.Exists(File) Then
           Try
               FileSystem.SetAttr(File, Attributes)
               Return True ' File was modified OK
           Catch
               Return False ' File can't be modified maybe because User Permissions
           End Try
       Else
           Return Nothing ' File doesn't exist
       End If
   End Function

#End Region





3.
Tu modificación de la función de las capacidades de discos es inmejorable,
Me doy cuenta que tengo que usar más las constantes y las enumeraciones si quiero perfeccionar y simplificar las cosas (Si te digo la verdad pensé que esa función no se podía simplificar más, hasta que he visto tu modificación xDDD, me kawen tó)


Gracias por los consejos y un saludo