• Lunes 13 de Enero de 2025, 09:24

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Brroz

Páginas: 1 ... 37 38 [39] 40 41 ... 43
951
Visual Basic 6.0 e inferiores / Excel con VB
« en: Martes 2 de Septiembre de 2003, 08:39 »
Fíjate en las líneas siguientes:

Dim objApp  As Object ' Aplicación
Set objApp = GetObject(, "Excel.Application")
Dim objWb As Object ' WorkBook
Set objWb = objApp.WorkBooks(1)

'Aquí viene la parte que más te interesa

Dim objSh As Object ' WorkSheet

' Para añadir una hoja y ponerle un nombre:
Set objSh = objWb.Worksheets.Add()
objSh.Name = "Mi nueva hoja"

'Para obtener la referencia a la última hoja, saber cómo se llama y cambiarle el nombre
Set objSh = objWb.Sheets(objWb.Worksheets.Count)
MsgBox objSh.Name
objSh.Name = "Nuevo nombre"

'Para obtener la referencia a la primera hoja
Set objSh = objWb.Sheets(1)

'Para obtener la referencia a una hoja por su nombre
Set objSh = objWb.Sheets("Hoja x")

A partir de aquí, ya sabes como va el resto...

Suerte.

952
Visual Basic 6.0 e inferiores / Re: Utilizar los Informes de Acces
« en: Martes 2 de Septiembre de 2003, 08:22 »
Para imprimir el informe desde vb fíjate en este ejemplo:

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Public Function Imprimir(ByVal Formato As String, ByVal Filtro As String _
, Optional ByVal VistaPrevia As Boolean) As Boolean
   
    On Error GoTo Error_Imprimir
   
    Dim sngMouseP As Single
    sngMouseP = Screen.MousePointer
    Screen.MousePointer = 11
    DoEvents
   
    Dim dbW As Object
    Set dbW = GetObject("BaseDeDatos.mdb")
   If VistaPrevia Then ShowWindow dbW.hWndAccessApp, 3
    On Error Resume Next
    dbW.UserControl = False
    On Error GoTo Error_Imprimir
    Dim int1 As Integer
    If VistaPrevia Then int1 = 2 '2 = acViewPreview , 0 = acViewNormal
    If dbW.Reports.Count = 0 Then
        dbW.DoCmd.OpenReport Formato, int1, , Filtro
    Else
        Dim lng1 As Long
        For lng1 = 0 To dbW.Reports.Count - 1
            If dbW.Reports(lng1).Name = Formato Then
                dbW.Reports(Formato).Filter = Filtro
                GoTo Exit_Fn
            End If
        Next lng1
        dbW.DoCmd.OpenReport Formato, int1, , Filtro
    End If
   
Exit_Fn:
    Imprimir = True
   
Salir_Imprimir:
    On Error Resume Next
    If Not VistaPrevia Then
        dbW.Quit
    Else
        dbW.DoCmd.Maximize
        dbW.UserControl = True
    End If
    Set dbW = Nothing
    Screen.MousePointer = sngMouseP
    Exit Function
   
Error_Imprimir:
    MsgBox "Fallo al imprimir informe '" & Formato & "'" & String(2, vbCrLf) _
    & "(" & Err.Number & ") " & Err.Description, vbCritical, "Imprimir"
    VistaPrevia = False
    Resume Salir_Imprimir

End Function

Con respecto a lo de tener varias tablas como origen de registro para tu informe, utiliza como origen de registro para el informe (propiedad RowSource) una consulta de access o instrucción SQL.

Espero que esto te vaya bien.
Sort.

953
Visual Basic 6.0 e inferiores / Re: compara archivos o usar campos binarios
« en: Martes 2 de Septiembre de 2003, 08:14 »
Puedes abrir los archivos desde vb y compararlos línea a línea con algo así:

Private Function SonIguales(Byval Archivo1 As String, Byval Archivo2 as String) As Boolean

Dim int1 as integer, int2 as integer
Dim str1 as string, str2 as string

On Error Goto Error_Comparar

int1 = FreeFile
Open "Archivo1" For Input As #int1
int2 = FreeFile
Open "Archivo2" For Input As #int2

Do Until Eof(int1)
LineInput #int1, str1
LineInput #int2, str2
If str1 <> str2 then Goto Salir_Comparar
Loop

If Eof(int2) Then Son Iguales = True

Salir_Comparar:
On Error Resume Next
Close #int1
Close #int2
Exit Function

Error_Comparar:
MsgBox Err.Description
Resume Salir_Comparar

End Function

Si la comparación es algo puntual, también podrías utilizar el comando D.O.S. 'FC' (file compare).

Suerte.

954
Visual Basic 6.0 e inferiores / Re: Borrar carpetas del servidor
« en: Martes 2 de Septiembre de 2003, 08:02 »
Exacto. La carpeta no puede contener archivos ni otras carpetas (igual que con el 'RD' de D.O.S.).

Suerte.

955
Visual Basic 6.0 e inferiores / Re: averiguar ruta de un archivo abierto
« en: Lunes 1 de Septiembre de 2003, 14:18 »
En Access puedes recuperar el nombre y vía de acceso de la base de datos actual mediante la propiedad 'Name' del objeto 'CurrentDb'. Si es desde vb con DAO, mira la misma propiedad del objeto que definas como 'Database'. Si usas ADO, en la cadena de conexión tienes la base de datos, como te indica Angel-Mayor. Luego para recuperar el path :

Dim str1 as String
str1 = CurrentDb.Name
Dim int1 as Integer
int1 = InstrRev(str1,"")
Dim strDbPath as string
strDbPath =  Left(str1, int1)

Suerte.

957
Visual Basic 6.0 e inferiores / Re: Borrar carpetas del servidor
« en: Lunes 1 de Septiembre de 2003, 13:31 »
¿Estará vacía la carpeta?
Mira a ver. Suerte.

958
Visual Basic 6.0 e inferiores / Variables Single
« en: Lunes 1 de Septiembre de 2003, 13:27 »
Utiliza el código que te indiqué en http://foros.solocodigo.com/viewthread.php?tid=4724.

El valor para cada byte lo obtendrás como elemento de la matriz que le pases como parámetro.

Por ejemplo:

después de añadir el código aquel, añade este otro para probar en algún sitio.

Dim byt1() as Byte
PackNro 23434 , byt1 , LittleEndianByteOrder
Msgbox "Primer byte " & byt1(1)  'byt1(1) = 138
Msgbox "Segundo byte " & byt1(2)  'byt1(2) = 91
Msgbox "Tercer byte " & byt1(3)  'byt1(3) = 0
Msgbox "Cuarto byte " & byt1(4)  'byt1(4) = 0

Si te das cuenta 23434 = 138 * 256^0 + 91 * 256^1 + 0 * 256^2 + 0 * 256^3

A ver si esto te va bien.
Suerte y a ver que tal.

959
Visual Basic 6.0 e inferiores / Re: agregar datos a una lista de acces 97
« en: Lunes 1 de Septiembre de 2003, 08:39 »
Utiliza un código de este estilo:

Dim int1 As Integer, strRowSource As String, str1(5) as string
     
str1(0) = "Elemento 1"  
str1(1) = "Elemento 2"  
str1(2) = "Elemento 3"  
str1(3) = "Elemento 4"  
str1(4) = "Elemento 5"

For int1 = LBound(str1) To UBound(str1)
      strRowSource = strRowSource & str1(int1) & ";"
Next int1
With Lista1
.RowSourceType = "Value List"
.RowSource = strRowSource
.Requery
End With

Espero que esto te sirva.
Suerte.

960
Visual Basic 6.0 e inferiores / Re: Solo es posible con tu colaboración
« en: Sábado 30 de Agosto de 2003, 11:10 »
Prefiero no entrar en debates que nunca conducen a ninguna parte, pero en vista del éxito que está teniendo este post, no puedo evitar escribir algo para dar mi opinión.

Que quede claro que no me parece acertado el uso que Observador hace de este foro para hacerse propaganda. En la página inicial puedes ver una sección  'Ayúdanos a crecer'  que es a donde Observador debería acudir. Ahora bien cada cual sabrá a qué foros quiere acudir, participar y en cuál puede encontrar las mejores respuestas a sus dudas.

Más penoso sí que me parece la actitud de "mis respuestas son estupendas y las tuyas una merda": la peor respuesta es la que no se produce. Hablando de foros de calidad, busque, compare y si encuentra algo mejor... Me parece que lo que abunda por ahí es mucho EGO HAMBRIENTO (a ver si alguien se da por aludido).

Por último decir, desviándome del tema, que ya va siendo hora de cambiar de mentalidad en lo relativo a los POBRES LOBOS que bien que llevan pagado esa mala fama que tienen desde tiempos inmemoriables hasta extremos que rozan su extinción. Cada vez que rememoro su aullido en la sierra del Suído se me ponen los pelos de punta...

Saludos para todos y que no llegue la sangre al río.

961
Desconozco la forma de obtener el nº de serie de un equipo y si esto es realmente posible (imagínate el típico pc con una placa de su padre, un micro de su madre y discos del primo segundo...).
De todas formas imagino que tal vez necesitas el s/n para OBTENER UN NÚMERO ÚNICO para el equipo. Si esto es así, ahí va un ejemplo sacado del ¿desaparecido? AMBSoftware, copiado tal cual:

***************************************

Generar un número único para un ordenador

Es la función que se usa para crear las claves esas que están en el registro de windows (CLSID) y que el VB6 usa internamente para generar una clave única cuando creamos un nuevo componente ActiveX.

La función está encapsulada en una clase y se usa como cualquier objeto, es decir, declaras el tipo y llamas al método que te interesa, que en este caso es una función que devuelve el valor formateado al estilo de como lo vemos en el registro.
El valor devuelto es una cadena en la que, como mínimo, las últimas 8 cifras son siempre las mismas para cada equipo, por tanto, usando esas 8 cifras tienes identificado el equipo.

Parece que si el equipo tiene una tarjeta de red influye en esa cifra, pero si no la tiene, también hace que sea único por lo que puede que ese número cambie si se cambia la tarjeta de red o se instala en un equipo que no tenga.

Option Explicit

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long
Const S_OK = 0 ' return value from CoCreateGuid

Public Function GetGUID() As String
    Dim lResult As Long
    Dim lguid As GUID
    Dim MyguidString As String
    Dim MyGuidString1 As String
    Dim MyGuidString2 As String
    Dim MyGuidString3 As String
    Dim DataLen As Integer
    Dim StringLen As Integer
    Dim i As Integer
    On Error GoTo error_olemsg
    lResult = CoCreateGuid(lguid)
    If lResult = S_OK Then
        MyGuidString1 = Hex$(lguid.Data1)
        StringLen = Len(MyGuidString1)
        DataLen = Len(lguid.Data1)
        MyGuidString1 = LeadingZeros(2 * DataLen, StringLen) & MyGuidString1 'First 4 bytes (8 hex digits)
        MyGuidString2 = Hex$(lguid.Data2)
        StringLen = Len(MyGuidString2)
        DataLen = Len(lguid.Data2)
        MyGuidString2 = LeadingZeros(2 * DataLen, StringLen) & Trim$(MyGuidString2) 'Next 2 bytes (4 hex digits)
        MyGuidString3 = Hex$(lguid.Data3)
        StringLen = Len(MyGuidString3)
        DataLen = Len(lguid.Data3)
        MyGuidString3 = LeadingZeros(2 * DataLen, StringLen) & Trim$(MyGuidString3) 'Next 2 bytes (4 hex digits)
        MyguidString = MyGuidString1 & "-" & MyGuidString2 & "-" & MyGuidString3 & "-"
        For i = 0 To 7
            MyguidString = MyguidString & Format$(Hex$(lguid.Data4(i)), "00")
        Next
        'MyGuidString contains last 8 bytes of Guid (16 hex digits)
        GetGUID = MyguidString
    Else
        GetGUID = "00000000-0000-0000-0000000000000000" ' return zeros if function unsuccessful
    End If
    Exit Function
    error_olemsg:
    MsgBox "Error " & Str(Err) & ": " & Error$(Err)
    GetGUID = "00000000-0000-0000-0000000000000000"
    Exit Function
End Function

Private Function LeadingZeros(ExpectedLen As Integer, ActualLen As Integer) As String
    LeadingZeros = String$(ExpectedLen - ActualLen, "0")
End Function

Para usar la clase:

Private Sub cmdGenGUID_Click()
    'Creamos una instancia de la clase
    Dim tGuid As New cGUID
    'Asignamos el número generado, en este ejemplo lo asignamos a un Label
    Label2 = tGuid.GetGUID
    'Destruimos la referencia al objeto
    Set tGuid = Nothing
End Sub

***************************************

Espero que te sea útil.
Suerte.

962
Visual Basic 6.0 e inferiores / Re: fotos en un reporte
« en: Viernes 29 de Agosto de 2003, 11:31 »
Si el informe te lo curras tú utilizando el objeto Printer, no hay problema: utilizando su método PaintPicture podrás imprimir imágenes (ojo con el formato de la imagen, no lo he probado, pero me imagino que por ejemplo un tiff casi seguro que no lo imprime).

Suerte.

963
Visual Basic 6.0 e inferiores / Re: Puerto serie II
« en: Viernes 29 de Agosto de 2003, 10:43 »
Hombre, no sé si estarás usando 'CSng' como indicas... si es así, hazlo de este modo: varSingle = CSng(varVariant), donde varSingle es la variable single y varVariant es la variant (evidente). Si ya lo haces así (supongo), entonces es que el valor variant no puede ser convertido a single.

Ya contarás. Suerte.

964
Visual Basic 6.0 e inferiores / multitarea
« en: Viernes 29 de Agosto de 2003, 10:03 »
La gestión de la multitarea es cosa de windows. Un proceso que quieras abrir desde vb puede funcionar tanto de forma asíncrona como síncrona.
Suele jugar un papel muy importante la instrucción 'DoEvents' que permite que se ejecuten los eventos que estan en cola y permite respirar al resto de tus componentes. Esto, así a grandes rasgos, es lo que te puedo decir sobre multitarea en vb. Ahora bien, en mi ignorancia me da la sensación de que en tu caso el problema está en la captura de imagen de video, que debe ser una labor dedicada (dedicada, no delicada). De hecho, según creo, para poder capturar video con el pc se necesita un puerto firewall para la cámara, con otro puerto corriente y moliente no te funcionaría, lo que da que pensar...

En fin, a ver si algún experto arroja más luz sobre el tema.

Suerte.

965
El siguiente código te permite recuperar como elementos de una matriz las distintas aplicaciones activas.

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * 260
End Type

Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)

Private Type TareaActiva
    Id As Long
    ExeFile As String
End Type

Private Tareas() As TareaActiva

Private Sub ObtenerProcesos()
   
    Dim lngSnapShot As Long
    Dim Proceso As PROCESSENTRY32
    Dim lngRc As Long, lngCta As Long
    lngSnapShot = CreateToolhelpSnapshot(2&, 0&)
    If lngSnapShot <> 0 Then
        Proceso.dwSize = Len(Proceso)
        lngRc = ProcessFirst(lngSnapShot, Proceso)
        Do While lngRc
            lngCta = lngCta + 1
            ReDim Preserve Tareas(1 To lngCta)
            Tareas(lngCta).Id = Proceso.th32ProcessID
            Tareas(lngCta).ExeFile = Left(Proceso.szExeFile, InStr(Proceso.szExeFile, Chr(0)) - 1)
            lngRc = ProcessNext(lngSnapShot, Proceso)
        Loop
        CloseHandle lngSnapShot
    End If

End Sub

Suerte.

966
Si el programa lo iniciaste tú, fijate en este ejemplo que ejecuta un programa y si en 1 minuto no acaba por si solo, lo finaliza:

Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function GetExitCodeProcess Lib "Kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Sub Someter()

    Const STILL_ACTIVE = &H103
    Const PROCESS_QUERY_INFORMATION = &H400
    Dim lng1 As Long, lngRc As Long
    Dim intCta as Integer, lngExitCode as long
    lng1 = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell("MiPrograma.Exe", vbNormalFocus))
    Do
        GetExitCodeProcess lng1, lngRc
        intCta = intCta + 1
        if intCta > 60 Then
                lngRc = TerminateProcess(lng1 , lngExitCode)
                Exit Do
        Else
                Sleep 1000
                DoEvents
        End If
    Loop While lngRc = STILL_ACTIVE

End Sub

Suerte.

967
Yo muchas veces he utilizado los informes de access. Esto le permite a un usuario o a mi crear nuevos informes o modificar los existentes sin ninguna compilación. Otra ventaja es que puedo utilizar la presentación preliminar del informe. Todo esto mediante automatización.
Para luego incorporar el nuevo informe para ser llamado por el programa vb, utilizo el mantenimiento de una tabla que contiene los datos necesarios para ejecutar el informe desde la aplicación (su nombre, origen de registro, descripción, ...).

Es una idea más.
Sort.

968
Visual Basic 6.0 e inferiores / Accesos directos
« en: Viernes 29 de Agosto de 2003, 08:56 »
Échale un vistazo a este post:

http://foros.solocodigo.com/viewthread.php?tid=4680

Por cierto, ya de paso, no se si abrás leído de nuevo este:

http://foros.solocodigo.com/viewthread.php?tid=4629

Suerte.

969
Visual Basic 6.0 e inferiores / Hola de nuevo! :-)
« en: Viernes 29 de Agosto de 2003, 08:52 »
Hola Gerard, encantado...

970
Visual Basic 6.0 e inferiores / Re: Una cosa muy extraña <:-S
« en: Viernes 29 de Agosto de 2003, 08:49 »
Aparte de la correcta solución que te ha proporcionado J.M.Movilla, pienso en mi atrevimiento, que deberías replantearte el método y lógica de tu código: que abras un formulario no debe provocar que se mueva el puntero del recordset (sin saber más me da la sensación que se está desencadenando un evento en un momento que tú no deseas). Además veo que en los últimos mensajes te preocupas por el valor que muestra un textbox, cosa que debería ser indiferente si al textbox le asignas su valor en el momento adecuado. A lo mejor es mucho decir por mi parte, pero te aconsejaría que repasaras el código que tienes en los distintos eventos.
De todas formas, repito que la solución que te brindan debería solventar tu incidencia perfectamente.

Sort.

971
Visual Basic 6.0 e inferiores / Re: Comunicación con puerto serie
« en: Jueves 28 de Agosto de 2003, 11:26 »
Podrías probar 'empaquetando' los datos con algo así:

Public Enum ByteOrderEnum
    LittleEndianByteOrder = 0  'Primero el byte menos significativo
    BigEndianByteOrder = 1 'Primero el byte más significativo
End Enum

Public Sub PackNro(ByVal Valor As Long, bytRes() As Byte, Byval ByteOrder as ByteOrderEnum)
   
    Dim byt1(1 To 4) As Byte
    Dim intMaxExp As Integer
   
    ReDim bytRes(1 To 4)
   
    Valor = Abs(Valor)
    byt1(1) = 0
    byt1(2) = 0
    byt1(3) = 0
    byt1(4) = 0
   
    Do While intMaxExp <= 4
        If Int(Valor / 256 ^ intMaxExp) > 255 Then
            intMaxExp = intMaxExp + 1
        ElseIf intMaxExp = 0 Then
            byt1(1) = Valor
            GoTo Salir_PackLong
        Else
            Exit Do
        End If
    Loop
       
    Do Until Valor = 0
        byt1(intMaxExp + 1) = Int(Valor / 256 ^ intMaxExp)
        Valor = Valor - byt1(intMaxExp + 1) * 256 ^ intMaxExp
        intMaxExp = intMaxExp - 1
    Loop
   
Salir_PackLong:
    If byteOrder = LittleEndianByteOrder Then
        bytRes = byt1
    Else
        bytRes(1) = byt1(4)
        bytRes(2) = byt1(3)
        bytRes(3) = byt1(2)
        bytRes(4) = byt1(1)
    End If

End Sub

Ya contarás a ver que tal.
Suerte.

972
Visual Basic 6.0 e inferiores / Re: Ejecutar un C desde VB
« en: Jueves 28 de Agosto de 2003, 11:19 »
Ahora que lo pienso se podría hacer al revés de lo que sugería:

Defino una variable, obtengo con VarPtr la dirección del puntero de la variable, paso como parámetro ese puntero y el tamaño deseado para el parámetro y el programita en C sólo tiene que modificar esas posiciones de memoria (eso si que n.p.i. de cómo hacerlo).

Espero que nos cuentes algo.
Suerte.

973
Visual Basic 6.0 e inferiores / Re: barra de progreso utilizando winsock o inet
« en: Jueves 28 de Agosto de 2003, 11:05 »
Si lo que deseas es hacer un FTP, yo usaría el control Inet o ejecutaría un archivo de proceso por lotes, la pega para tu necesidad sería que el evento que te comentaba no estaría disponible.

Ops! Veo que ya te han dado otras soluciones al problema, mejor así.

Disculpas y suerte.

974
Usa este código a ver que tal.

 Private Function Copiar(Byval Origen as string, Byval Destino as string) as Boolean
Dim intO as integer, intD as integer, byt1() as Byte
On Error Goto Error_Copiar
intO = FreeFile
Open Origen For Binary as #intO
' En el caso de que el fichero no fuera muy grande.
Redim byt1(1 to Lof(intO))
'Si el fichero es demasiado grande, deberás implementar un buffer dimensionando 'byt1' al tamaño que tu veas y haciendo un bucle hasta que llegues a la longitud del fichero.
intD = FreeFile
Open Destino For Binary as #intD
Get #intO,,byt1
Put #intD,,byt1
Copiar = True
Salir_Copiar:
On Error resume next
Close #intO
Close #intD
Exit Function
Error_Copiar:
MsgBox Err.Description
Resume Salir_Copiar
End Function

Suerte.

975
Visual Basic 6.0 e inferiores / Re: SUMAR COLUMNA DE UN DATAGRID
« en: Miércoles 27 de Agosto de 2003, 09:21 »
El ejemplo que te da Giomar suma el número de facturas, pero supongo que tú necesitas sumar los importes de las lineas, con lo que abría que utilizar un SQL tal que así:

SELECT Sum(CampoImporte) FROM LineasFacturas WHERE NumFactura = '001' GROUP BY NumFactura

Si como dices en un mensaje más abajo prefieres la opción del 'acumulador', entonces añade una pregunta filtrando los valores que te interesen antes de sumar:

If Datagrid1.Columns(IndiceClave).Value = "001" Then
acumulador=acumulador+Datagrid1.Columns(IndiceDeColumna_a_Sumar).Value

Esto te irá algo más lento pero...

Sort.

Páginas: 1 ... 37 38 [39] 40 41 ... 43