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 - BlackZeroX

#1921
Bueno esta clase la estuve haciendo para realizar un trabajo en mi Institución, (y para saltarme algunas cuestiones), se las dejo por si alguien la desea usar para lo que desees..

Si tiene errores favor de reportarmelos...

Se puede optener el resultado por o la:

* Normal
* por el Complemento de la Base... ( Sin Signo )

Falta optimizar algunas cosas... el CODIGO ESTA FUNCIONAL...

(Esto solo fue una chapusada...) Permiti las funciones tales como en la sintasys de las operaciones Aritmeticas...:


  • sin()  --> Seno
  • kos() --> Coseno
  • tan() --> Tangente
  • log() --> Logaritmo
  • sqr() --> Raiz
  • sgn() --> Devuelve un entero que indica el signo de un número

Cls_InfraExp.cls

Código (Vb) [Seleccionar]


'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   // Autor:   Agradesimientos a Raul y Spyke (ExpReg)        //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo es requerido    //
'   // el agradacimiento al autor.                             //
'   /////////////////////////////////////////////////////////////
'   /////////////////////////////////////////////////////////////
'   /////////////////////////////////////////////////////////////

Option Explicit
Option Base 0
Option Compare Text

Public Enum Bases
    base16 = &H10
    base10 = &HA
    base8 = &H8
    base2 = &H2
End Enum

Public Enum ReturnType
    SinSigno = &H0
    ConSigno
End Enum

Private Const cError                As String = "<-Error->"
Private Const Str_Artimetica        As String = "\/*-+^()"
Private Const Str_IndexBases        As String = "0123456789abcdef"
Private Const Str_Funciones         As String = "sinkostanlogsqrsgn"
Private Obj_RunExpr                 As Object
Private Obj_ExpRegular              As Object

Public Property Get StrError() As String: StrError = cError: End Property

Private Function ParseExpresion(ByRef InExpresion As String, ByRef InBaseNow As Bases) As Boolean
Dim lng_Pos(1)          As Long
Dim lng_index           As Long
Dim Str_ToValidate      As String

    Str_ToValidate$ = Replace$(InExpresion, " ", "", 1, , vbTextCompare)
    For lng_index& = 1 To Len(Str_Funciones) Step 3
        Str_ToValidate$ = Replace$(Str_ToValidate$, Mid$(Str_Funciones, lng_index&, 3), "", 1, , vbTextCompare)
    Next
    For lng_index& = 1 To Len(Str_Artimetica)
        Str_ToValidate$ = Replace$(Str_ToValidate$, Mid$(Str_Artimetica, lng_index&, 1), "", 1, , vbTextCompare)
    Next
    If Not VerificFormat(Str_ToValidate$, InBaseNow) Then
        InExpresion = cError
        Exit Function
    End If

    InExpresion = " " & Replace$(InExpresion, " ", "", 1, , vbTextCompare) & " "
    For lng_index = 1 To Len(Str_Artimetica$)
        InExpresion = Replace$(InExpresion, Mid$(Str_Artimetica$, lng_index, 1), " " & Mid$(Str_Artimetica$, lng_index, 1) & " ", 1, , vbTextCompare)
    Next
    InExpresion = Replace$(InExpresion, "  ", "", 1, , vbTextCompare)

    If Not InBaseNow = base10 Then
        For lng_index = 1 To Len(Str_IndexBases)
            lng_Pos&(0) = InStr(lng_Pos&(1) + 1, InExpresion, " " & Mid$(Str_IndexBases$, lng_index, 1), vbTextCompare)
            If lng_Pos&(0) > 0 Then
                lng_Pos&(1) = InStr(lng_Pos&(0) + 1, InExpresion, " ", vbTextCompare)
                If lng_Pos&(1) - lng_Pos&(0) + 1 > 0 Then
                    InExpresion = Mid$(InExpresion, 1, lng_Pos&(0) - 1) & "(ConvSystem(" & Chr(34) & Mid$(InExpresion, lng_Pos&(0) + 1, lng_Pos&(1) - lng_Pos&(0) - 1) & Chr(34) & "," & InBaseNow & ",10)+0)" & Mid$(InExpresion, lng_Pos&(1))
                    lng_index = lng_index - 1
                End If
                lng_Pos&(1) = 0
            End If
        Next
    End If

    ParseExpresion = True

End Function


Public Function ConvSystem(ByVal vDataIn$, ByVal inFrom As Bases, ByVal inDest As Bases, Optional ByRef Opciones As ReturnType = ConSigno) As Variant
Dim isNegative          As Boolean
    If Not (inFrom = inDest And inFrom = base10) Then
        '   //  Puedo usar unas cuantas Obviaciones Directas.. aun que mejor usare la conversion larga...
        If inFrom = base10 Then
            ConvSystem = Dec2Base(Val(vDataIn$), inDest, Opciones)
        Else
            isNegative = Val(vDataIn$) < 0
            If Not isNegative Then
                ConvSystem = Dec2Base(Base2Dec(vDataIn$, inFrom), inDest, Opciones)
            Else
                If inFrom = base16 Then
                    ConvSystem = Dec2Base(Base2Dec(vDataIn$, inFrom) * -1, inDest, Opciones)
                Else
                    ConvSystem = Dec2Base(Base2Dec(Val(vDataIn$), inFrom) * -1, inDest, Opciones)
                End If
            End If
        End If
    Else
        ConvSystem = vDataIn$
    End If
End Function

Public Function GetAritmeticExpresion(ByVal Expresion As String, ByRef InBase As Bases, Optional ByVal Opciones As ReturnType = ConSigno) As String
    If Obj_RunExpr Is Nothing Then Exit Function
    If ParseExpresion(Expresion, InBase) Then
        Expresion = Replace$(Expresion, "kos", "cos", 1, , vbTextCompare)
        With Obj_RunExpr
            If Not (InBase = base10 And Opciones = SinSigno) Then
                If InBase = base10 Then
                    GetAritmeticExpresion = Dec2Base(.Eval(Expresion$), InBase, Opciones)
                Else
                    GetAritmeticExpresion = Dec2Base(CLng(.Eval(Expresion$)), InBase, Opciones)
                End If
            Else
                If InBase = base10 Then
                    GetAritmeticExpresion = .Eval(Expresion)
                Else
                    GetAritmeticExpresion = CLng(.Eval(Expresion))
                End If
            End If
        End With
    Else
        GetAritmeticExpresion = cError
    End If
End Function

Public Function GetMaxBase(ByRef ThisBase As Bases) As String
    Select Case ThisBase
        Case base16:    GetMaxBase = "F"
        Case Else:      GetMaxBase = CStr(ThisBase - 1)
    End Select
End Function

Public Function Dec2Base(ByVal inval As Double, ByRef InBase As Bases, Optional ByRef Opciones As ReturnType = ConSigno) As String
Dim isNegative          As Boolean
Dim Lng_LeninVal          As Long
    isNegative = inval < 0
    Dec2Base = inval
    If isNegative Then
        Dec2Base = (inval * -1)
        If Not InBase = base10 Then Dec2Base = pDec2Base(Val(Dec2Base), InBase)
        If Opciones = SinSigno Then
            Lng_LeninVal = Len(Dec2Base)
            Dec2Base = pDec2Base(Base2Dec(String(Lng_LeninVal, GetMaxBase(InBase)), InBase) - (inval * -1) + 1, InBase)
            Dec2Base = String$(10, GetMaxBase(InBase)) & String$(Lng_LeninVal - Len(Dec2Base), "0") & Dec2Base
            If InBase = base8 Then Dec2Base = "1" & Dec2Base
        End If
    Else
        If Not InBase = base10 Then Dec2Base = pDec2Base(inval, InBase)
    End If
End Function

Private Function pDec2Base(ByRef inval As Double, ByRef InBase As Bases) As String
Dim lng_Aux#(1)
    lng_Aux#(0) = (inval# \ InBase)
    lng_Aux#(1) = (inval# Mod InBase)
    If inval < InBase Then
        If InBase = base16 Then
            pDec2Base = Hex(lng_Aux#(1))
        Else
            pDec2Base = lng_Aux#(1)
        End If
    Else
        If InBase = base16 Then
            pDec2Base = pDec2Base(lng_Aux#(0), InBase) & Hex(lng_Aux#(1))
        Else
            pDec2Base = pDec2Base(lng_Aux#(0), InBase) & lng_Aux#(1)
        End If
    End If
End Function

'   //  Hex no afecta a bases inferiores por ello lo dejo.
Private Function Base2Dec(ByRef inval As String, ByRef InBase As Bases) As Double
Dim lng_lenStr&
Dim lng_Pointer&
Dim lng_Potencia&
    lng_lenStr& = Len(inval)
    lng_Potencia& = 0
    For lng_Pointer& = lng_lenStr& To InStr(1, inval, "-") + 1 Step -1
       Base2Dec = Base2Dec + CLng("&H" & Mid$(inval, lng_Pointer, 1)) * InBase ^ lng_Potencia&
        lng_Potencia& = lng_Potencia& + 1
    Next lng_Pointer&
End Function

Public Function VerificFormat(ByVal InStrData As String, InBase As Bases) As Boolean
    If Obj_ExpRegular Is Nothing Then Exit Function
    With Obj_ExpRegular
        Select Case InBase
            Case base16:    .Pattern = "^[0-9a-fA-F]+$"
            Case base10:    .Pattern = "^[0-9]+$"
            Case base8:     .Pattern = "^[0-7]+$"
            Case base2:     .Pattern = "^[0-1]+$"
        End Select
        VerificFormat = .test(InStrData)
    End With
End Function

Private Sub Class_Initialize()
    Set Obj_RunExpr = CreateObject("ScriptControl")
    Set Obj_ExpRegular = CreateObject("VBScript.RegExp")
    With Obj_RunExpr
        .Language = "vbscript"
        Call .AddObject("InfraClass", Me, True)
    End With
End Sub

Private Sub Class_Terminate()
    Set Obj_RunExpr = Nothing
    Set Obj_ExpRegular = Nothing
End Sub



Ejemplo en Uso:

Código (vb) [Seleccionar]


Private Sub Form_Load()
Dim c As New Cls_InfraExp
Const Operacion As String = "11-1111*(111/111*111)"
    With c
        MsgBox "Operacion Hexadecimal" & vbCrLf & _
               "Operacion Sin Signo --> " & .GetAritmeticExpresion(Operacion, base16, ConSigno) & vbCrLf & _
               "Operacion Con Signo --> " & .GetAritmeticExpresion(Operacion, base16, SinSigno)
        MsgBox "Operacion Decimal" & vbCrLf & _
               "Operacion Sin Signo --> " & .GetAritmeticExpresion(Operacion, base10, ConSigno) & vbCrLf & _
               "Operacion Con Signo --> " & .GetAritmeticExpresion(Operacion, base10, SinSigno)
        MsgBox "Operacion Octal" & vbCrLf & _
               "Operacion Sin Signo --> " & .GetAritmeticExpresion(Operacion, base8, ConSigno) & vbCrLf & _
               "Operacion Con Signo --> " & .GetAritmeticExpresion(Operacion, base8, SinSigno)
        MsgBox "Operacion Binaria" & vbCrLf & _
               "Operacion Sin Signo --> " & .GetAritmeticExpresion(Operacion, base2, ConSigno) & vbCrLf & _
               "Operacion Con Signo --> " & .GetAritmeticExpresion(Operacion, base2, SinSigno)
    End With
End Sub



Dulce Infierno Lunar!¡.
#1922
Es un Modulod e Clase que sirve para leer el Tag de los archivos de Musica, y extraer toda la informacion posible del mismo...

Saca los bytes del Cover del M4A incluyendo su formato... JPEG / PNG.
Saca el texto "liryc" del M4A (Si existe...)

y toda la informacion posible y de forma existencial!¡.

* Esta la es la primera version, asi que si tiene errores favor de comunicarlos en este mismo hilo.
* Deshacer este formato para obtener la información me a costa asi que disfrutenlo!¡.

NOTA: No saca informacion comprimida... para ello usar la Zlib...


Aqui hay varios archivos M4A... xP  --->  http://infrangelux.sytes.net/FileX/index.php?dir=/Musica/Slipknot

FormatM4A.cls

Código (Vb) [Seleccionar]



'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo es requerido    //
'   // el agradacimiento al autor.                             //
'   /////////////////////////////////////////////////////////////
'   //////////////////////Lector Formato M4A/////////////////////
'   /////////////////////////////////////////////////////////////
'   //  1ra Version...                                         //
'   //      --> Verificación de Formato.                       //
'   //      --> Solo Lectura de Datos (Tag).                   //
'   /////////////////////////////////////////////////////////////

Option Explicit
Option Base 0
Option Compare Text

Private Str_Album                       As String
Private Str_Artist                      As String
Private Str_AlbumArtist                 As String
Private Str_Comment                     As String
Private Str_Year                        As String
Private Str_Title                       As String
Private Str_Genre                       As String
Private Str_TrackNumber                 As String
Private Str_DiskNumber                  As String
Private Str_Composer                    As String
Private Str_Encoder                     As String
Private Str_BPM                         As String
Private Str_Copyright                   As String
Private Str_Compilation                 As String
Private Arr_Artwork()                   As Byte
Private Str_ArtworkFormat               As String
Private Str_RatingAdvisory              As String
Private Str_Grouping                    As String
Private Str_qq_stik                     As String
Private Str_Podcast                     As String
Private Str_Category                    As String
Private Str_Keyword                     As String
Private Str_PodcastURL                  As String
Private Str_EpisodeGlobalUniqueID       As String
Private Str_Description                 As String
Private Str_Lyrics                      As String
Private Str_TVNetworkName               As String
Private Str_TVShowName                  As String
Private Str_TVEpisodeNumber             As String
Private Str_TVSeason                    As String
Private Str_TVEpisode                   As String
Private Str_PurchaseDate                As String
Private Str_GaplessPlayback             As String

Private Const lng_lAtom                 As Long = &H4
Private Const Str_Format                As String = "ftyp"
Private Const cContData                 As String = "udta"
Private Const cMetaData                 As String = "meta"
Private Const ChdlrData                 As String = "hdlr"

Private Const cAlbum                    As String = "©alb"
Private Const cArtist                   As String = "©art"
Private Const cAlbumArtist              As String = "aART"
Private Const cComment                  As String = "©cmt"
Private Const cYear                     As String = "©day"
Private Const cTitle                    As String = "©nam"
Private Const cGenre                    As String = "©gen|gnre"
Private Const cTrackNumber              As String = "trkn"
Private Const cDiskNumber               As String = "disk"
Private Const cComposer                 As String = "©wrt"
Private Const cEncoder                  As String = "©too"
Private Const cBPM                      As String = "tmpo"
Private Const cCopyright                As String = "cprt"
Private Const cCompilation              As String = "cpil"
Private Const cArtwork                  As String = "covr"
Private Const cRatingAdvisory           As String = "rtng"
Private Const cGrouping                 As String = "©grp"
Private Const cqq_stik                  As String = "stik"
Private Const cPodcast                  As String = "pcst"
Private Const cCategory                 As String = "catg"
Private Const cKeyword                  As String = "keyw"
Private Const cPodcastURL               As String = "purl"
Private Const cEpisodeGlobalUniqueID    As String = "egid"
Private Const cDescription              As String = "desc"
Private Const cStr_Lyrics               As String = "©lyr"
Private Const cTVNetworkName            As String = "tvnn"
Private Const cTVShowName               As String = "tvsh"
Private Const cTVEpisodeNumber          As String = "tven"
Private Const cTVSeason                 As String = "tvsn"
Private Const cTVEpisode                As String = "tves"
Private Const cPurchaseDate             As String = "purd"
Private Const cGaplessPlayback          As String = "pgap"

Private Str_File                        As String
Private Priv_ItsOkFormat                As Boolean

Private Function StringToLong(ByVal Str_Data As String) As Long
Dim TMP$, i&
Dim Byte_Str()      As Byte
   TMP$ = String$(Len(Str_Data) * 2 + 2, "0")
   Mid$(TMP$, 1, 2) = "&H"
   Byte_Str = StrConv(Str_Data$, vbFromUnicode)
   For i = LBound(Byte_Str) To UBound(Byte_Str)
       If Byte_Str(i) > 15 Then
           Mid$(TMP$, 3 + i * 2, 2) = Hex(Byte_Str(i))
       Else
           Mid$(TMP$, 3 + i * 2, 2) = "0" & Hex(Byte_Str(i))
       End If
   Next i
   StringToLong& = CLng(TMP$)
End Function

Private Function GetStrFromNumFile(ByVal IDFile As Integer, ByVal LngPos As Long, ByRef StrOut As String) As Long
   Get IDFile%, LngPos, StrOut$
   GetStrFromNumFile = LngPos + Len(StrOut$)
End Function

Public Property Let This_File(ByVal StrFilePath As String)
Dim Str_PointerStr      As String * lng_lAtom
Dim Str_CatNow          As String * lng_lAtom
Dim Str_DataPos         As String * lng_lAtom
Dim Str_CatData         As String
Dim lng_Pos             As Long
Dim int_FF              As Integer


   Str_Album$ = ""
   Str_Artist$ = ""
   Str_AlbumArtist$ = ""
   Str_Comment$ = ""
   Str_Year$ = ""
   Str_Title$ = ""
   Str_Genre$ = ""
   Str_TrackNumber$ = ""
   Str_DiskNumber$ = ""
   Str_Composer$ = ""
   Str_Encoder$ = ""
   Str_BPM$ = ""
   Str_Copyright$ = ""
   Str_Compilation$ = ""
   Erase Arr_Artwork
   Str_RatingAdvisory$ = ""
   Str_Grouping$ = ""
   Str_qq_stik$ = ""
   Str_Podcast$ = ""
   Str_Category$ = ""
   Str_Keyword$ = ""
   Str_PodcastURL$ = ""
   Str_EpisodeGlobalUniqueID$ = ""
   Str_Description$ = ""
   Str_Lyrics$ = ""
   Str_TVNetworkName$ = ""
   Str_TVShowName$ = ""
   Str_TVEpisodeNumber$ = ""
   Str_TVSeason$ = ""
   Str_TVEpisode$ = ""
   Str_PurchaseDate$ = ""
   Str_GaplessPlayback$ = ""
                                       
                                       
   Str_CatData$ = Space$(lng_lAtom&)
   Priv_ItsOkFormat = False
   Str_File$ = StrFilePath$
   int_FF% = FreeFile%
   
   Open Str_File$ For Binary As int_FF%
   
   If LOF(int_FF%) > 8 Then
   
       Get int_FF%, 5, Str_CatNow$
       
       If StrComp(Str_CatNow$, Str_Format$, vbBinaryCompare) = 0 Then
           'lng_Pos& = 148 '   //  Se puede Obviar, pero mejor comprovamos el formato...
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + 1, Str_DataPos$) - (lng_lAtom& - 1)
           lng_Pos& = GetStrFromNumFile&(int_FF%, StringToLong&(Str_DataPos$) + ((lng_lAtom& * 2) + 1), Str_DataPos$) + StringToLong&(Str_DataPos$) - lng_lAtom& - 1
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + 1, Str_DataPos$) + StringToLong&(Str_DataPos$)
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos&, Str_CatNow$)
           
           If StrComp(Str_CatNow$, cContData$, vbTextCompare) = 0 Then
               lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_DataPos$)
               If StrComp(Str_DataPos$, cMetaData$, vbTextCompare) = 0 Then
                   lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_CatData$)
                   lng_Pos& = lng_Pos& + StringToLong&(Str_CatData$) + lng_lAtom&
                   Do
                       lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_CatNow$)
                       If StrComp(Str_CatNow$, "free", vbTextCompare) = 0 Or StrComp(Str_CatNow$, "name", vbTextCompare) = 0 Then Exit Do
                       Call GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_DataPos$)
                       If StrComp(Str_DataPos$, "data", vbTextCompare) = 0 Then '   //  Atom Legible? (Sin Compresion o espesificaciones del Formato...)
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos&, Str_PointerStr$)
                           Str_CatData$ = Space$(StringToLong&(Str_PointerStr$) - (lng_lAtom& * 4))
                           If StrComp(Str_CatNow$, cArtwork$, vbTextCompare) = 0 Then
                               GetStrFromNumFile& int_FF%, lng_Pos& + lng_lAtom&, Str_PointerStr$
                               Select Case StringToLong&(Str_PointerStr$)
                                   Case 13
                                       Str_ArtworkFormat$ = "jpeg"
                                   Case 14
                                       Str_ArtworkFormat$ = "png"
                               End Select
                           End If
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + (lng_lAtom * 3), Str_CatData)
                           If Not StrComp(Str_CatNow$, "", vbTextCompare) = 0 Then
                               Select Case Str_CatNow$
                                   Case cAlbum$
                                       Str_Album$ = Str_CatData$
                                   Case cArtist$
                                       Str_Artist$ = Str_CatData$
                                   Case cAlbumArtist$
                                       Str_AlbumArtist$ = Str_CatData$
                                   Case cComment$
                                       Str_Comment$ = Str_CatData$
                                   Case cYear$
                                       Str_Year$ = Str_CatData$
                                   Case cTitle$
                                       Str_Title$ = Str_CatData$
                                   Case Split(cGenre$, "|")(0), Split(cGenre$, "|")(1)                 '  //  "©gen|gnre"
                                       Str_Genre$ = Str_CatData$
                                   Case cTrackNumber$
                                       Str_TrackNumber$ = Str_CatData$
                                   Case cDiskNumber$
                                       Str_DiskNumber$ = Str_CatData$
                                   Case cComposer$
                                       Str_Composer$ = Str_CatData$
                                   Case cEncoder$
                                       Str_Encoder$ = Str_CatData$
                                   Case cBPM$
                                       Str_BPM$ = Str_CatData$
                                   Case cCopyright$
                                       Str_Copyright$ = Str_CatData$
                                   Case cCompilation$
                                       Str_Compilation$ = Str_CatData$
                                   Case cArtwork$
                                       Arr_Artwork = StrConv(Str_CatData$, vbFromUnicode)
                                   Case cRatingAdvisory$
                                       Str_RatingAdvisory$ = Str_CatData$
                                   Case cGrouping$
                                       Str_Grouping$ = Str_CatData$
                                   Case cqq_stik$
                                       Str_qq_stik$ = Str_CatData$
                                   Case cPodcast$
                                       Str_Podcast$ = Str_CatData$
                                   Case cCategory$
                                       Str_Category$ = Str_CatData$
                                   Case cKeyword$
                                       Str_Keyword$ = Str_CatData$
                                   Case cPodcastURL$
                                       Str_PodcastURL$ = Str_CatData$
                                   Case cEpisodeGlobalUniqueID$
                                       Str_EpisodeGlobalUniqueID$ = Str_CatData$
                                   Case cDescription$
                                       Str_Description$ = Str_CatData$
                                   Case cStr_Lyrics$
                                       Str_Lyrics$ = Str_CatData$
                                   Case cTVNetworkName$
                                       Str_TVNetworkName$ = Str_CatData$
                                   Case cTVShowName$
                                       Str_TVShowName$ = Str_CatData$
                                   Case cTVEpisodeNumber$
                                       Str_TVEpisodeNumber$ = Str_CatData$
                                   Case cTVSeason$
                                       Str_TVSeason$ = Str_CatData$
                                   Case cTVEpisode$
                                       Str_TVEpisode$ = Str_CatData$
                                   Case cPurchaseDate$
                                       Str_PurchaseDate$ = Str_CatData$
                                   Case cGaplessPlayback$
                                       Str_GaplessPlayback$ = Str_CatData$
                               End Select
                           End If
                       ElseIf Str_CatNow$ = "----" Then
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& - 8, Str_DataPos$)
                           lng_Pos& = lng_Pos& + StringToLong&(Str_DataPos$) - lng_lAtom&
                       End If
                   Loop
                   Priv_ItsOkFormat = True
               End If
           End If
       End If
   End If
    Close int_FF%
End Property

Public Property Get ItsOkFormat() As Boolean
   ItsOkFormat = Priv_ItsOkFormat
End Property

Public Property Get This_File() As String
   This_File = Str_File$
End Property

Public Property Get Album() As String
   Album = Str_Album
End Property
Public Property Get Artist() As String
   Artist = Str_Artist
End Property
Public Property Get AlbumArtist() As String
   AlbumArtist = Str_AlbumArtist
End Property
Public Property Get Comment() As String
   Comment = Str_Comment
End Property
Public Property Get Year() As String
   Year = Str_Year
End Property
Public Property Get Title() As String
   Title = Str_Title
End Property
Public Property Get Genre() As String
   Genre = Str_Genre
End Property
Public Property Get TrackNumber() As String
   TrackNumber = Str_TrackNumber
End Property
Public Property Get DiskNumber() As String
   DiskNumber = Str_DiskNumber
End Property
Public Property Get Composer() As String
   Composer = Str_Composer
End Property
Public Property Get Encoder() As String
   Encoder = Str_Encoder
End Property
Public Property Get BPM() As String
   BPM = Str_BPM
End Property
Public Property Get Copyright() As String
   Copyright = Str_Copyright
End Property
Public Property Get Compilation() As String
   Compilation = Str_Compilation
End Property
Public Property Get Artwork() As Byte()
   Artwork = Arr_Artwork
End Property
Public Property Get ArtworkFormat() As String
   ArtworkFormat = Str_ArtworkFormat
End Property
Public Property Get RatingAdvisory() As String
   RatingAdvisory = Str_RatingAdvisory
End Property
Public Property Get Grouping() As String
   Grouping = Str_Grouping
End Property
Public Property Get qq_stik() As String
   qq_stik = Str_qq_stik
End Property
Public Property Get Podcast() As String
   Podcast = Str_Podcast
End Property
Public Property Get Category() As String
   Category = Str_Category
End Property
Public Property Get Keyword() As String
   Keyword = Str_Keyword
End Property
Public Property Get PodcastURL() As String
   PodcastURL = Str_PodcastURL
End Property
Public Property Get EpisodeGlobalUniqueID() As String
   EpisodeGlobalUniqueID = Str_EpisodeGlobalUniqueID
End Property
Public Property Get Description() As String
   Description = Str_Description
End Property
Public Property Get Lyrics() As String
   Lyrics = Str_Lyrics
End Property
Public Property Get TVNetworkName() As String
   TVNetworkName = Str_TVNetworkName
End Property
Public Property Get TVShowName() As String
   TVShowName = Str_TVShowName
End Property
Public Property Get TVEpisodeNumber() As String
   TVEpisodeNumber = Str_TVEpisodeNumber
End Property
Public Property Get TVSeason() As String
   TVSeason = Str_TVSeason
End Property
Public Property Get TVEpisode() As String
   TVEpisode = Str_TVEpisode
End Property
Public Property Get PurchaseDate() As String
   PurchaseDate = Str_PurchaseDate
End Property
Public Property Get GaplessPlayback() As String
   GaplessPlayback = Str_GaplessPlayback
End Property


'Public Property Let Album(ByVal vData As String)
'Public Property Let Artist(ByVal vData As String)
'Public Property Let AlbumArtist(ByVal vData As String)
'Public Property Let Comment(ByVal vData As String)
'Public Property Let Year(ByVal vData As String)
'Public Property Let Title(ByVal vData As String)
'Public Property Let Genre(ByVal vData As Integer)
'Public Property Let TrackNumber(ByVal vData As Integer)
'Public Property Let DiskNumber(ByVal vData As Integer)
'Public Property Let Composer(ByVal vData As String)
'Public Property Let Encoder(ByVal vData As String)
'Public Property Let BPM(ByVal vData As Integer)
'Public Property Let Copyright(ByVal vData As String)
'Public Property Let Compilation(ByVal vData As Integer)
'Public Property Let Artwork(ByRef vData() As Byte)
'   //  Public Property Let ArtworkFormat(ByRef vData As String)
'Public Property Let RatingAdvisory(ByVal vData As Integer)
'Public Property Let Grouping(ByVal vData As String)
'Public Property Let qq_stik(ByVal vData As Integer)
'Public Property Let Podcast(ByVal vData As Integer)
'Public Property Let Category(ByVal vData As String)
'Public Property Let Keyword(ByVal vData As String)
'Public Property Let PodcastURL(ByVal vData As Integer)
'Public Property Let EpisodeGlobalUniqueID(ByVal vData As Integer)
'Public Property Let Description(ByVal vData As String)
'Public Property Let Lyrics(ByVal vData As String)
'Public Property Let TVNetworkName(ByVal vData As String)
'Public Property Let TVShowName(ByVal vData As String)
'Public Property Let TVEpisodeNumber(ByVal vData As String)
'Public Property Let TVSeason(ByVal vData As Integer)
'Public Property Let TVEpisode(ByVal vData As Integer)
'Public Property Let PurchaseDate(ByVal vData As String)
'Public Property Let GaplessPlayback(ByVal vData As Integer)



Ejemplo de uso:

Código (Vb) [Seleccionar]



Option Explicit
Option Base 0

Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long

Sub main()
Dim clsFM4A         As Cls_FormatM4A
Dim StrDir          As String
Dim int_FF          As Integer

   Set clsFM4A = New Cls_FormatM4A
   With clsFM4A
   
       .This_File = App.Path & "\SCGJ.m4a"
       
       If .ItsOkFormat Then
       
           StrDir$ = Replace$("c:\Musica\" & .Artist & "\" & .Year & "-" & .Album & "\", "\\", "\")
           Call MakeSureDirectoryPathExists(StrDir$)
           
           '   //  extraemos la Imagen Cover
           int_FF% = FileSystem.FreeFile%
           Open StrDir & .Artist & " - " & .Title & "." & .ArtworkFormat For Binary As int_FF%
               Put int_FF%, , .Artwork
           Close int_FF%
           
           '   //  Extraemos la lirica del archivo
           int_FF% = FileSystem.FreeFile%
           Open StrDir & .Artist & " - " & .Title & ".txt" For Binary As int_FF%
               Put int_FF%, , .Lyrics
           Close int_FF%
           
       End If
   End With
   Set clsFM4A = Nothing
   
End Sub



Dulce Infierno Lunar!¡.
#1923
.
Antes que nada me podrias dejar un ejemplo de tu TXT  PARA DESCARGAR quiero ver el formato...!¡.

OTRAS cosas, POuedes dejar X cantidad de espacios entre "CALUMNAS" o usar Tabulaciones, asi sabras que estas leyendo en X Columna mas facil y sin complicarte la Vida...

Bueno solo suponiendo... Si es 10 entonces se me ocurre hacer algo asi... (Quedaria mejor con vbtab que espacios...)

Código (Vb) [Seleccionar]


Option Explicit
Option Base 0

Private Sub Form_Load()
Dim Str_RetArrayList$()
Dim Li&
Const StrFile$ = "C:\aaa.txt"

   Str_RetArrayList$() = Get_DataLineFromFile(StrFile)
   If (Not Str_RetArrayList$()) = -1 Then Exit Sub
   
   For Li& = LBound(Str_RetArrayList$()) To UBound(Str_RetArrayList$())
       'If InStr(1, Str_RetArrayList$(li&), vbtab & "10" & vbtab  ) > 0 Then
       If InStr(1, Str_RetArrayList$(Li&), "  10  ") > 0 Then
           MsgBox "Se exporta la linea " & Li& + 1
       End If
   Next
   
End Sub

'   //  Este metodo usara basta cantidad de Memoria... sería mejor un Do ... Loop y leyendo linea a linea y evaluarla...
Public Function Get_DataLineFromFile(ByVal StrFile As String) As String()
Dim TmpStrLine$, Lff%

   If Dir(StrFile, vbArchive) = "" Then Exit Function
   If Not GetAttr(StrFile) = vbArchive Then Exit Function
   
   Lff% = FileSystem.FreeFile%
   Open StrFile For Binary As Lff%
       TmpStrLine$ = Space$(LOF(Lff%))
       Get Lff%, , TmpStrLine$
   Close Lff%
   
   Get_DataLineFromFile = Split(TmpStrLine$, vbNewLine)
   
End Function



NOTA: Estructura mas el formato...

Dulce Infierno Lunar!¡.
#1924
Programación Visual Basic / Re: Insercion de exe
22 Septiembre 2010, 18:56 PM
@Petro_Boca

Deja de ctar asi, se entiende el Hilo almenos que sean arretrasados mentales... aun que lo dudo creo que igual lo entenderian... verdad.




Cita de: Petro_Boca en 22 Septiembre 2010, 05:43 AM
no creo q puedas actualizar el programa con el mismo PROGRAMA ABIERTO. (a noser q el nombre del EXE cambie, y cuando se abra mate al proceso del programa viejo y balbalbalablbalablabal)

Funcion Melt...

Aun que para plugins y Addons...

Descargar Source Plugin Ejemplo

http://infrangelux.sytes.net/FileX/?file=SRC_Plugin%20Chat.rar&dir=/BlackZeroX/Proyectos/Proyecto%20InfraExplorer

Compilar la DLL con el Nombre "PluginChat" en un form pegar esto... y ejecutar el Proyecto del Form...

Código (vb) [Seleccionar]


Option Explicit

Private Type StructPlugins
   ID              As String
   ObjectDLL       As Object
End Type
Private CollPlugins()               As StructPlugins
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel )            //
' //                                                            //
' // Web: http://InfrAngeluX.Sytes.Net/                         //
' //                                                            //
' // |-> Pueden Distribuir Este Código siempre y cuando         //
' // no se eliminen los créditos originales de este código      //
' // No importando que sea modificado/editado o engrandecido    //
' // o achicado, si es en base a este código                    //
' ////////////////////////////////////////////////////////////////
Enum GetFileStr
   FileName = 0
   extensión
   Ruta
End Enum
Public Function GetPatchInfo(ByVal StrRutaFull As String, Optional ByVal Options As GetFileStr = FileName) As String
Dim Puntero(1)              As Long
Dim lenStr                  As Long
   lenStr = Len(StrRutaFull)
   Puntero(0) = InStrRev(StrRutaFull, "\")
   If Puntero(0) > 0 Then
       Puntero(1) = InStrRev(StrRutaFull, ".")
       Puntero(1) = IIf(CBool(Puntero(1)), IIf(Puntero(0) < Puntero(1), Puntero(1), lenStr + 1), lenStr + 1)
       Select Case Options
           Case FileName
               GetPatchInfo = Mid$(StrRutaFull, Puntero(0) + 1, CLng(IIf(Puntero(1) = lenStr, lenStr - Puntero(0), Puntero(1) - Puntero(0)) - 1))
           Case extensión
               GetPatchInfo = Mid$(StrRutaFull, Puntero(1), Puntero(1))
           Case Ruta
               GetPatchInfo = Mid$(StrRutaFull, 1, Puntero(0))
           Case Else
               GetPatchInfo = -1
       End Select
   Else
       GetPatchInfo = -1
   End If
End Function

'   //  Esto es solo un ejemplo ( se Nesesita un ajuste del Array para no dejar Arrays vacios es decir Plugins/Addons entre los mismos )
Private Function ADD_PLugin(ByVal StrPath As String) As Boolean: On Error Resume Next
Dim TmpObject               As Object

   If Dir(StrPath, vbArchive) = "" Then Exit Function
   Shell "REGSVR32.EXE /s " & Chr(34) & StrPath & Chr(34) '   //  Registramos la DLL con RegSvr32.exe
   '   //  cMain es el nombre de la clase o plugin que se va a crear...
   Set TmpObject = CreateObject(GetPatchInfo(StrPath, FileName) & ".cMain")  '   //  Creamos el Plugin...
   
   If TmpObject Is Nothing Then Exit Function
   If (Not CollPlugins) = -1 Then
       ReDim CollPlugins(0)
   Else
       ReDim Preserve CollPlugins(UBound(CollPlugins) + 1)
   End If
   With CollPlugins(UBound(CollPlugins))
   
       Set .ObjectDLL = TmpObject
       Set TmpObject = Nothing
       
       With .ObjectDLL
           
           .CMain = Me
           MsgBox .Nombre    '   //  Nombre de la DLL...
           MsgBox .Version   '   //  Nombre de la DLL...
           MsgBox .ProcesoUno("Estos son solo parametros que no se toman en cuenta...", "Solo son ejemplos")    '   //  Nombre de la DLL...
           MsgBox .ProcesoDos("Estos son solo parametros que no se toman en cuenta...", "Solo son ejemplos")    '   //  Nombre de la DLL...
           
           .Inicializar '  //  Si aparece un error aqui, es que hay un error en el plugin... al igual que en sus procesos... esto es muy posible!¡.
           
       End With
       
       ADD_PLugin = True
   End With
End Function

'   //  este proceso se es llamado desde el Plugin Addon
Public Function Set_Configuración(ParamArray Paramertros())
Dim aa          As Variant
   If Not IsMissing(Paramertros) Then
       For Each aa In Paramertros
           If Not IsMissing(aa) Then
               If IsObject(aa) Then
                   Debug.Print TypeName(aa)
               Else
                   Debug.Print aa
               End If
           End If
       Next
   End If
End Function

Private Sub Form_Load()
   MsgBox IIf(ADD_PLugin("c:\PluginChat.dll"), "Se agrego con Exito", "Error")
   MsgBox IIf(ADD_PLugin("c:\PluginChat.dll"), "Se agrego con Exito", "Error")
   MsgBox IIf(ADD_PLugin("c:\PluginChat.dll"), "Se agrego con Exito", "Error")
   MsgBox IIf(ADD_PLugin("c:\PluginChat.dll"), "Se agrego con Exito", "Error")
   MsgBox IIf(ADD_PLugin("c:\PluginChat.dll"), "Se agrego con Exito", "Error")
End Sub

'   //  Se descargan los Addon... si no se quedan en memoria xP... IDE...
Private Sub Form_Unload(Cancel As Integer)
If (Not CollPlugins) = -1 Then Exit Sub
Dim lng_Index&
   For lng_Index& = LBound(CollPlugins) To UBound(CollPlugins)
       Set CollPlugins(lng_Index&).ObjectDLL = Nothing
   Next
End Sub



Notas:
* El Proyecto del Plugin DEBERA LLAMARSE IGUAL QUE EL NOMBRE DE LA DLL GENERADA)
* Los procesos del plugin serian publicos solo los que se deseen...

Dulces Lunas!¡.
#1925
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 09:47 AM

byref --> solo hace referencia al mismo objeto es decir que no crea una copia si no que, si realisas alguna modificacion a esta se vera reflejada al mismo tiempo al original

ByVal --> cualquier cambio realisado a un parametro declarado con este se realiza una copia, por lo tanto consume mas memoria, y cualquier cambio al mismo no se verá reflejado al original...

Nota: esto ya lo habia puesto, pero bueno...

Dulces Lunas!¡.
#1926
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 09:43 AM
Cita de: Javilondo en 22 Septiembre 2010, 08:41 AM
¿para estas APIs es necesario tener .NET?

NO... se jalan por decirlo de forma general "directamente del Sistema Operativo" ( aun que no es cierto ya que cada api dice su libreria donde se encuentra Lib "gdi32" ), en .Net tambien se puede pero... .Net lo veo oriendado a otrascosillas mas empresariales... no a juegos ni a tanto grafico... pero ueno para sacar el puntero puedes tomar Varprt(), strptr(), y Arrptr()... tambien por apis con la dll rountime de vb6 puedes... te toca investigar/indagar mas.

Dulce Infierno Lunar!¡.
#1927
Cita de: Og. en 19 Septiembre 2010, 18:52 PM
[youtube=425,350]http://www.youtube.com/watch?v=O3Cr7BaO7N0[/youtube]

Si no entienden eso, necesitan regresar a la primaria ¬¬

[Sarcasmos] madre O.O Tan importante eres!¡. [/sarcasmo], me parece que los problemas son de solucion visual rapida, no de analisis... aun que sobre la gerarquia
es

(). []
potencias, raizes
* /
+ -

Nota: lo de sarcasmo son para los que no entienda!n,

P.D.: Si me respondes mandame un Mp que ya no me paso en este post... es muy irregular, creo q ya te diste cuenta con las cosas logicas...

Dulce Infierno Lunar!¡.
#1928
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 07:14 AM
.
Perdon por los Post pero es que no te lei completamente solo vi lo de graficas y enseguida se me ocurrio lo del DC o hWnd para obtener asi el Handle y el rectangulo... pero bueno

y para lo del crash:

Código (vb) [Seleccionar]


Dim pic As PictureBox

Private Sub Command1_Click()
   pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
   Picture1 = pic
End Sub



Así:

Código (vb) [Seleccionar]


Public/Friend/Private pic As PictureBox ' Deja Dim para procesos, funciones, propiedades, Constantes del proceso... etc.

Private Sub Command1_Click()
   Set pic = picture1
   pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
   Set pic = Nothing
End Sub



Dulce Infierno Lunar!¡.
#1929
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 07:09 AM
Código (vb) [Seleccionar]


Private Sub Command1_Click()
   Picture1 = funcion(Text1)
End Sub

Private Function funcion(parametro string) As PictureBox

   'Codigo de interpretacion de vectores (tokenizer)
   'Bla, bla, bla, etc.

   'Codigo de graficado de vectores
   'ejemplo hipotetico de un vector graficado con el metodo line sobre la misma funcion:
   funcion.Line (50, 40)-(100, 150), vbRed
   'De esta manera la funcion devuelve el resultado en forma de un objeto tipo PictureBox

End Function



intenta asi

Código (vb) [Seleccionar]


Private Sub Command1_Click()
   call ProcesoX(Text1, Picture1 )
End Sub

Private sub ProcesoX(byval Parametro string, byref Pic PictureBox)
    'Codigo de interpretacion de vectores (tokenizer)
    'Bla, bla, bla, etc.
   Pic.Line (50, 40)-(100, 150), vbRed
End Function

[]
#1930
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 06:52 AM
EDITO:

OJO LO DEL hDC TE LO DIGO VIENDO A FUTURO!¡.




por cierto las apis son estas

Código (vb) [Seleccionar]


Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long



y podras pintar donde desees...

Mira aquí tienes un EJEMPLO (Cambia la linea resaltada por esta)

Código (vb) [Seleccionar]


hdcDestino = picture1.hdc



o por hdc del lugar deseado, por default esta el hDC del escritorio ( PINTARA EN TODA LA PANTALLA ).

Código (vb,60) [Seleccionar]


'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo es requerido    //
'   // el agradacimiento al autor.                             //
'   /////////////////////////////////////////////////////////////

Option Explicit

'   //  GetSystemMetrics
Const SM_CXSCREEN = 0 'X Size of screen
Const SM_CYSCREEN = 1 'Y Size of Screen
'   //  CreatePen
Const PS_DOT = 2
Const PS_SOLID = 0
'   //  Apis
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Private Type POINTAPI
   x                   As Long
   y                   As Long
End Type
Private Type tLineas
   PuntoInicio         As POINTAPI
   PuntoFinal          As POINTAPI
End Type
Dim RegionWindows       As RECT
Dim hdcDestino          As Long

Private Sub Form_Load()
   Hide
   '   //  Región/Resolución de Pantalla
   With RegionWindows
       .Bottom = GetSystemMetrics(SM_CYSCREEN)
       .Left = 1
       .Right = GetSystemMetrics(SM_CXSCREEN)
       .Top = 1
   End With
   hdcDestino = GetDC(0)
   Timer1.Interval = 100
   Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim Linea               As tLineas
Dim hPen                As Long
   '   //  Dibujamos lineas al Azar
       '   //  Calculamos el Punto de Inicio
   Linea.PuntoInicio.x = NumeroAleatorio(RegionWindows.Left, RegionWindows.Right)
   Linea.PuntoInicio.y = NumeroAleatorio(RegionWindows.Top, RegionWindows.Bottom)
       '   //  Calculamos el Punto Final
   Linea.PuntoFinal.x = NumeroAleatorio(RegionWindows.Left, RegionWindows.Right)
   Linea.PuntoFinal.y = NumeroAleatorio(RegionWindows.Top, RegionWindows.Bottom)
   '   //  Dibujamos la Linea
   '   //  Dibujamos los puntos    Inicio y Final en color rojo
       '   //  Color de la Linea
       hPen = CreatePen(PS_SOLID, 1, vbRed)
       DeleteObject SelectObject (hdcDestino, hPen)
       Ellipse hdcDestino, Linea.PuntoInicio.x - 2, Linea.PuntoInicio.y - 2, Linea.PuntoInicio.x + 2, Linea.PuntoInicio.y + 2
       Ellipse hdcDestino, Linea.PuntoFinal.x - 2, Linea.PuntoFinal.y - 2, Linea.PuntoFinal.x + 2, Linea.PuntoFinal.y + 2
       DeleteObject hPen
       '   //  Color de la Linea
       hPen = CreatePen(PS_SOLID, 1, (RGB(NumeroAleatorio(0, 255), NumeroAleatorio(0, 255), NumeroAleatorio(0, 255))))
       DeleteObject SelectObject (hdcDestino, hPen)
       '   //  Iniciamos una nueva Linea (Punto de Inicio)
       MoveToEx hdcDestino, Linea.PuntoInicio.x, Linea.PuntoInicio.y, ByVal 0&
       '   //  Finalizamos la Linea (Punto Final)
       LineTo hdcDestino, Linea.PuntoFinal.x, Linea.PuntoFinal.y
       DeleteObject hPen
End Sub
Public Function NumeroAleatorio(MinNum As Long, MaxNum As Long) As Long
Dim Tmp                                 As Long
   If MaxNum < MinNum Then: Tmp = MaxNum: MaxNum = MinNum: MinNum = Tmp
   Randomize: NumeroAleatorio = CLng((MinNum - MaxNum + 1) * Rnd + MaxNum)
End Function



Dulces Lunas!¡.