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

#2041
Foro Libre / Re: Clases de informatica [HUMOR]
25 Agosto 2010, 05:38 AM

Thomas@RamonMuchoSiempre.SI

No entiendo... ***** ¬¬"

Notas: soy de México no entiendo otras culturas... ¬¬"

Dulces Lunas!¡.
#2042
.
mmm como dato es cuando se consultan los valores de VarVariantDest despues de haber hecho el CopyMemory (en el For Next), bueno mejor dicho el Crash no se presenta al final del proceso se Produce en la Consulta

La solucion que estoy viendo es obtener el puntero a la matriz aaa() por medio de VarVariant, haber si lo calculo, ya les cuento!¡.


Dulces Lunas!¡.
#2043
Ok bien el problema es el siguiente

en aquel es de esta forma

VarVariantOri() -> VarVariantDest()

el problema aqui y ahora es

VarVariantOri() -> VarVariantAux - VarVariantDest()

Los codigos aunque se parecen, realmente SON DISTINTOS!¡.

Si pruebas el codigo de arriba veras que te va a Crashear, el otro no te crasheara por que ya esta bien!¡.

Dulces Lunas!¡.
#2044
PSA es el puntero a la estructura SafeArray

es decir hay algo que no saben muchos y es que una variable es una estructura... pero en este caso PSA son los 4 primeros bytes a esta (SAFEARRAY) la cual contiene informacion de la variable, si es una variable Variant sin matrix los 4 primeros bytes indican el tipo del mismo los siguientes estas vacios y los 4 siguientes indican el puntero al contenido (en este caso seria asi, si fuese un array la estructura que puse arribita es la usada para saber TODA la informacion de una variable tipo Array, Dimenciones, cuanto pesa una dimencion y por ende la lontitud en bytes del array, el incice inferior, el tipo Gral del Array)!¡.

aqui hay un link a la MSDN

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.safearray.aspx

Edito:-------------------------->

Código (Vb) [Seleccionar]


If SafeArrayAccessData(VarPtr(VarVariant), pData) = 0 Then



Esta mal debes pasarle el puntero del SafeArray mas no el de la Variable, SafeArrayAccessData = 0 cuando sale todo bien cualquier otro valor es un Error.

Dulces Lunas!¡.
#2045
solo como dato para no matarse , la estructura SafeArray es de 16 Bytes aqui se las dejo por si alguien la requiere con esta cuestion!¡.

Código (vb) [Seleccionar]


Private Type SafeArrayReader
   cDims As Integer            ' nr of dimensions for the array
   fFeatures As Integer        ' extra information about the array contents
   cbElements As Long          ' nr of bytes per array element. Possible Examples: 1=byte,2=integer,4=long,8=currency
   cLocks As Long              ' nr of times array was locked w/o being unlocked
   pvData As Long              ' address to 1st array item, can be a pointer to another structure/address
End Type



Nota: Solo Array's, aun queen este caso...

Dulces Lunas!¡.
#2046

Edito:

Antes que nada No es factible hacer un Simple Copymemory por que Crashea!¡ de forma instantanea asi que para esto hay que manipular y bloquear el Array con la estructura SafeArray.

Pero aun no encuentro la Solución
[/i][/b]

intento copiar el contenido de una variable tipo variant a una avriable de matrix variant

Código (vb) [Seleccionar]


Dim VarVariant as variant



a

Código (vb) [Seleccionar]


Dim VarVariantDest() as variant



La cosa es sencilla, copia bien la primera vez posteiormente me crashea... y creo que es por la Estructura SafeArray, ( ya intente varias cosas incluida sin Apis y con solo manejo de la dicha Estructura y sigue de la misma manera!¡. )

Aqui el codigo

Código (vb) [Seleccionar]


Option Explicit
Option Base 0

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
       (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SafeArrayAccessData Lib "Oleaut32" _
       (ByVal psa As Long, pvData As Long) As Long
Private Declare Function SafeArrayUnaccessData Lib "Oleaut32" _
       (ByVal psa As Long) As Long
'   //  msvbvm60.DLL
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
   (Var() As Any) As Long

Private Sub Test_Translate()
   Dim VarVariant          As Variant
   Dim VarVariantDest()    As Variant
   Dim aaa(0 To 3)         As Variant
   Dim psa                 As Long
   Dim pData               As Long
   
   aaa(0) = "Miguel"
   aaa(1) = "Angel"
   aaa(2) = "Ortega"
   aaa(3) = "Avila"
   
   VarVariant = aaa
   
   ReDim Preserve VarVariantDest(0 To 7)
   CopyMemory psa, ByVal VarPtr(VarVariant)+8, 4
   
   If SafeArrayAccessData(psa, pData) = 0 Then   ' Bloqueo el Array y obtengo el puntero de varptr(VarVariant(0))
       CopyMemory VarVariantDest(4), ByVal pData, 4 * 16  ' Copio el Contenido
       SafeArrayUnaccessData psa  ' Desbloqueo el array
   End If
   
   For psa = LBound(VarVariantDest) To UBound(VarVariantDest)
       Debug.Print psa, VarVariantDest(psa)
   Next psa
End Sub

Private Sub Form_Load()
Dim i       As Byte
   For i = 1 To 10
       Call Test_Translate
       MsgBox "Prueba: " & i
   Next i
End Sub



Dulces Infierno Lunar!¡.
#2048
puertos serie aqui tienes un Modulo de Clase para quitarte dependencias!¡.

Ojala te sirva

http://www.leandroascierto.com.ar/foro/index.php?topic=345.0

Dulces Lunas!¡.
#2049
Es mejor SubClasificar el ComboBox asi evitamos un PArpadeo como el codigo siguente, es algo cutre pero bueno de algo te servira!¡.

En un Modulo de Clase

Cls_CmbBox.cls

Código (Vb) [Seleccionar]


Option Explicit

Public WithEvents CmbBox                    As ComboBox
Public StrToVerific                         As String
Public StrExplicit                          As Boolean
Private SwitchErr                           As Boolean
Event ErrorSel()

Private Sub CmbBox_click()
Dim CmbBox_Index            As Long
Dim LenV                    As Long
   If SwitchErr = False Then SwitchErr = Not SwitchErr: Exit Sub
   With CmbBox
       LenV = Len(StrToVerific)
       If LenV <= 0 Then Exit Sub
       For CmbBox_Index = .ListIndex To 1 Step -1
           If Len(.List(CmbBox_Index)) >= LenV Then
               If StrComp(Left$(.List(CmbBox_Index), Len(StrToVerific)), StrToVerific, Abs(Not StrExplicit)) = 0 Then
'                    CmbBox.Text = .List(CmbBox_Index)
                   .ListIndex = CmbBox_Index ' // "es lo mismo que la linea de arriba" solo que rehubica el item seleccionado
                   Exit For
               End If
           End If
       Next CmbBox_Index
       If CmbBox_Index <= 0 Then RaiseEvent ErrorSel
   End With
End Sub



Codigo prueba en un Form.

Agrega run ComboBox con nombre Combo1

Código (Vb) [Seleccionar]


Option Explicit

Private WithEvents ClsCmbBox            As Cls_CmbBox

Private Sub ClsCmbBox_ErrorSel()
   Caption = "Error"
End Sub

Private Sub Combo1_Click()
   Caption = Combo1.Text
End Sub

Private Sub Form_Load()
   Set ClsCmbBox = New Cls_CmbBox
   With ClsCmbBox
       Set .CmbBox = Combo1
       .StrExplicit = True
       .StrToVerific = "----"
   End With
   Combo1.AddItem ("Miguel")
   Combo1.AddItem ("Angel")
   Combo1.AddItem ("Ortega")
   Combo1.AddItem ("Avila")
   Combo1.AddItem ("----comidas----")
   Combo1.AddItem ("pizza")
   Combo1.AddItem ("pollo")
   Combo1.AddItem ("choripan")
   Combo1.AddItem ("----bebidas----")
   Combo1.AddItem ("agua")
   Combo1.AddItem ("cerveza")
   Combo1.AddItem ("gaseosa")
   Combo1.AddItem ("vino")
   Combo1.ListIndex = 0
End Sub



Dulces Lunas!¡.
#2050
@79137913.

Lo unico malo con eso es que es tardado y no es rapido, de hecho es leento, y el codigo hay empleado no aceptaria las funciones de un Modulo BAS comun, ademas de que si hay errores manda un Feo Msgbox()!¡, sin contar que ese codigo estaria a manipulacion general por quien fuese!¡.

Nota: ademas de que tendria que redimensionar y modificar manualmenmte y eso laboralmente (Perder tiempo) no es rentable (Menos cuando es tuya xS)!¡.

Dulces Lunas!¡.