• Domingo 22 de Diciembre de 2024, 16:18

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 ... 38 39 [40] 41 42 43
976
Visual Basic 6.0 e inferiores / Re: Ejecutar un C desde VB
« en: Miércoles 27 de Agosto de 2003, 09:06 »
Aúnque ignoro como recibir el valor del parámetro de vuelta, se me ocurre que podrías escribir el resultado en un archivo de texto temporal y recuperarlo desde ahí.

Tal vez se podría hacer también escribiendo el valor que quieres devolver en una determinada dirección de memoria para luego recuperarlo con la api 'CopyMemory'...

Esperemos que alguien por ahí aporte alguna solución que vaya mejor.

Suerte.

977
Visual Basic 6.0 e inferiores / Ejecutar una aplicacion VB desde otra aplicacion VB
« en: Miércoles 27 de Agosto de 2003, 08:56 »
Utiliza la instrucción de esta forma:

SHELL "MiPrograma.Exe Parametro"

'MiPrograma.Exe' recibirá el valor de 'Parametro' en el objeto 'Command', de forma que obtendrás lo especificado en 'Parametro' como una cadena de texto en la que tú deberás identificar el o los distintos parámetros que hayas escrito.

Mira este ejemplo.

Desde el programa que hace la llamada:

SHELL "MiPrograma.Exe Hola"

Desde 'MiPrograma.Exe:

Private Sub Main
Dim strCmd as string
strCmd = Trim(Command)
If strCmd = "" then
Msgbox "No hay parámetros"
Else
Msgbox "Parámetro: " & strCmd
End if
End Sub

Suerte.

978
Visual Basic 6.0 e inferiores / Es posible en visual?????
« en: Miércoles 27 de Agosto de 2003, 08:45 »
Si conoces las direcciones IP o nombres de los pcs y tienes en ellos carpetas compartidas, no hay mayor problema, usa FileCopy.

Un detalle: ahora mismo tengo la duda de si algo del estilo 'FileCopy MiExec.Exe 123.123.123.123CarpetaTuExec.Exe' funciona. Si usamos el nombre del pc en vez de la IP, te aseguro que funciona, pero si sólo tienes la IP...
Si en tu caso sólo conoces la IP, podrías hacer varias cosas:
1- Asignar previamente la ruta '123.123.123.123Carpeta' a una unidad,
2- Ejecutar con SHELL el programa NET con el parámetro USE (NET USE unidad ruta), (escribe en una pantalla DOS para obtener ayuda NET HELP),
3-Editar el archivo Host o LMHost para asignar un nombre a la dirección IP.

Espero que te sirva.
Suerte.

979
Visual Basic 6.0 e inferiores / DATAREPORT PARA FACTURAS
« en: Miércoles 27 de Agosto de 2003, 08:32 »
La solución más sencilla es usar la correspondiente sentencia SQL como origen de registros para tu informe. La sintáxis de la sentencia sería de este estilo:

SELECT a.Campo1 , a.Campo2, a.CampoN, b.Campo1, b.CampoN FROM Tabla1 AS a LEFT JOIN Tabla2 AS b ON a.CampoN=b.CampoN

Es decir, en una sola consulta obtienes un recordset con todos los datos que te hagan falta a partir de las distintas tablas.

Ten en cuenta que la sintáxis de la sentencia puede variar (aunque poco) dependiendo del proveedor de la base de datos.
Otro detalle está en la palabra clave de unión (LEFT JOIN en el ejemplo) que podría ser INNER JOIN, RIGHT JOIN, EXCEPTION JOIN , JOIN ... dependiendo de la unión que quieras hacer y las relaciones entre las tablas. Si tienes problemas para construir la sentencia, te recomiendo que si usas una base de datos jet, utilices el generador de consultas de Access, uses la vista SQL de la consulta y observes como es la correspondiente sentencia SQL.

Sort.

980
Visual Basic 6.0 e inferiores / Deteccion de numeros negativos
« en: Martes 26 de Agosto de 2003, 08:23 »
If Val(Text1.Text) < 0 Then Msgbox "¡Negativo!"

Sort.

981
Visual Basic 6.0 e inferiores / Crear objeto
« en: Lunes 25 de Agosto de 2003, 13:52 »
Si te da ese mensaje puede ser por una de las razones siguientes:
- El sistema no puede reconocer la clase 'SpecialFolders' en la biblioteca 'Toolsack'.
- No se puede encontrar la biblioteca 'Toolsack'.
- La biblioteca 'Toolsack' no está correctamente registrada.

Aupa.

982
Visual Basic 6.0 e inferiores / Re: Obtener path del Escritorio
« en: Lunes 25 de Agosto de 2003, 13:46 »
El fallo está en que debes inicializar la variable m_wsShell como un objeto antes de usar ningún miembro de la misma. Hazlo tal que así:

Set m_wsShell = CreateObject("WScript.Shell")

Acuerdate de hacer cuando acabes Set m_wsShell = Nothing para liberar la referencia al objeto.

Me imagino que con esto arreglarás.
Aupa.

983
Visual Basic 6.0 e inferiores / Re: Obtener path del Escritorio
« en: Lunes 25 de Agosto de 2003, 13:14 »
Échale un vistazo a este link a ver si te sirve para lo que quieres.

Http://guille.costasol.net/ejemplos/crear_links.htm

Agur.

984
Visual Basic 6.0 e inferiores / Re: Clonar registros a otra tabla
« en: Lunes 25 de Agosto de 2003, 12:14 »
La 'traducción' del SQL sería algo así como...

Añade a TABLA2 todos los registros de TABLA1 que cumplan la condición de que el valor de su CAMPO CLAVE (o no clave, o varios campos en vez de uno,... pero no nos liemos) no se encuentre en el CAMPO equivalente de la TABLA2.

Es decir:

Tabla1 = Tabla original
Tabla2 = Clon de Tabla1
CampoTabla1 = Campo de Tabla1 que identifica el registro (podrías usar varios campos, vaya clave unica.)
CampoTabla2 = equivalente a CampoTabla1 pero en Tabla2.

Pero ojo con una cosa: este SQL no te garantiza que las dos tablas vayan a contener los mismos registros (pudiera ser que Tabla2 tuviera otros registros que no están en  Tabla1). Podrías usar un SQL similar pero a la inversa, actualizando Tabla1.

También podrías hacer otra cosa (santo remedio) si el número de registros te lo permite):

DELETE FROM Tabla2

INSERT INTO Tabla2 SELECT * FROM Tabla1

Espero haberme expresado con algo más de claridad.

Sort.

985
Visual Basic 6.0 e inferiores / Variables en un procedimiento
« en: Lunes 25 de Agosto de 2003, 12:00 »
Muchas gracias por tu respuesta.

Lo más lógico era suponer que sucediera como me cuentas, al fin y al cabo Dim es una instrucción, y mientras no se ejecute entiendo que no se debería notar ningún efecto. La incógnita para mi era si una vez que el programa se compila sigue ocurriendo lo mismo.
Bueno, me iré acostumbrando a declarar las variables conforme las vaya necesitando...

Muchas gracias de nuevo y recibe un cordial saludo.

986
Visual Basic 6.0 e inferiores / Re: Clonar registros a otra tabla
« en: Lunes 25 de Agosto de 2003, 10:56 »
Sería tan sencillo como leer el registro de una tabla y grabarlo en la otra con AddNew (si el registro no existe) o Edit (si existe) o con un SQL (INSERT o UPDATE).

Si lo que necesitas es actualizar la tabla con los registros de la otra que no existen en la primera y sin saber que registros son estos (o cuántos son), podrías hacer un proceso de actualización con un SQL de este estilo:

INSERT INTO Tabla2 SELECT * FROM Tabla1 WHERE CampoTabla1 NOT IN (SELECT CampoTabla2 FROM Tabla2)

A ver si te vale.
Sort.

987
Visual Basic 6.0 e inferiores / Re: Variables en un procedimiento
« en: Lunes 25 de Agosto de 2003, 10:41 »
Hace tiempo que me pregunto si es indiferente el momento en que se declara cada variable dentro de una sub o función. Normalmente declaro las variables al comienzo del procedimiento, más que nada por verlas todas juntas, pero cada vez que hago esto se me plantea la siguiente cuestión: Si una variable de las declaradas sólo se usa cuando se cumple una determinada condición tal vez convendría declararla en el momento que se va a usar. Es decir, imaginaos un código de este estilo

     Dim lng1 as Long , lng2 as Long

     If Condicion Then
         lng1 = 111111
         Msgbox lng1

         Exit Sub

     Else
         Lng1 = 222222
         Lng2 = 333333
               .
               .
               .
     End If

Supongo que si defino las variables al principio automáticamente se asigna memoria para ellas. Sin embargo, si hago lo siguiente

     Dim lng1 as Long
     If Condicion Then
         lng1 = 111111
         Msgbox lng1

         Exit Sub

     Else
         lng1 = 222222
         Dim lng2 as Long
         lng2 = 333333
               .
               .
               .
     End If

¿Si se cumple la condición me he ahorrado el espacio en memoria para lng2? Sospecho que realmente es así pero me gustaría confirmarlo.

Saludos a todos.

988
Visual Basic 6.0 e inferiores / Re: barra de progreso utilizando winsock o inet
« en: Lunes 25 de Agosto de 2003, 09:03 »
El evento SendProgress del control winsock devuelve como parámetros los bytes enviados desde la última vez que se desencadenó el evento y los bytes que quedan en el buffer. Creo que con esto encontrarás lo que buscas.

Suerte

989
Visual Basic 6.0 e inferiores / Sobre OCX
« en: Lunes 25 de Agosto de 2003, 08:57 »
Se podría probar con algo así:

Private Function ChkRegCom() as Boolean
On error Goto Error_Registro
Dim obj1 as Object
Set obj1 = CreateObject("NombreDeClase")
ChkRegCom = True
Salir_Registro:
Set obj1 = Nothing
Exit Function
Error_Registro:
If Err.Number <> 429 Then MsgBox(Err.Number & "  " & Err.Description, vbCritical, "Error")
Resume Salir_Registro
End Function

Si no se puede crear la clase "NombreDeClase", se desencadenará un error 429 (el componente activeX no puede crear el objeto), con lo que abría que registrarlo.

También podríais crear una clave en el registro con datos de vuestra aplicación y chequearla antes de llamar al programa que crea los componentes.

Espero que esto sirva para vuestros propósitos.
Suerte.

990
Visual Basic 6.0 e inferiores / Re: Sobre OCX
« en: Viernes 22 de Agosto de 2003, 08:30 »
Para averiguar en que directorio está instalado windows y cúal es el directorio del sistema (independientemente de la versión) puedes utilizar el siguiente código:

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Function WindowsSysDir() as String
   
    Dim strDir As String
    strDir = Space(255)
    GetSystemDirectory strDir, 255
    WindowsSysDir = left(strDir, Instr(1,strDir,Chr(0))-1)
   
End Function

Ten en cuenta que windows no siempre está instalado en el mismo directorio.

Espero que esto te sirva.
Suerte.

991
Visual Basic 6.0 e inferiores / ALINEACION DEL TEXTO EN UN DATAGRID
« en: Jueves 21 de Agosto de 2003, 13:22 »
No te preocupes hombre... Hace poco leí en no se dónde: "No hay preguntas tontas, sino tontos que no preguntan".

En tiempo de diseño abre la página de propiedades del control, selecciona la pestaña 'Diseño', elige la columna que quieras y modifica la alineación en los combos correspondientes.

En tiempo de ejecución:
DataGrid1.Columns(2).Alignment = dbgLeft
Por ejemplo.

Sort.

992
Visual Basic 6.0 e inferiores / Como recortar una imagen
« en: Jueves 21 de Agosto de 2003, 13:01 »
Suponiendo que tienes la imagen original en un PictureBox llamado Picture1 y que quieres copiar un trozo de esa imagen a otro PictureBox llamado Picture2, puedes hacer los siguiente.

Declara a nivel de módulo:

Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Luego cuando quieras hacer la copia

Dim lngRc As Long
lngRc = BitBlt(Picture2.hDC, x2, y2, Ancho, Alto, Picture1.hDC, x1, y1, &HCC0020)

Donde:
x2 , y2 = coordenada en el pictbox en la que quieres copiar la imagen
Ancho y Alto = Ancho y alto del cuadrado a copiarse
x1,y1=coordenada desde donde copiar el cuadrado en el pictbox origen.

Espero que esto te sirva.
Suerte.

993
Visual Basic 6.0 e inferiores / Conformar una tabla Pacientes
« en: Jueves 21 de Agosto de 2003, 08:52 »
A ver si me aclaro...

En principio no veo la necesidad de que las historias clínicas vayan en la tabla ordenadas como indicas, ya te ocuparás tú al darles salida de ordenarlas.
Lo único que se me ocurre por lo que puedas necesitar tener los registros ordenados en la tabla es que tuvieras la necesidad de asignar un cierto número consecutivo a esos historiales. Es decir,
Del número 1 al 500, historiales con 'A' , del número 501 al 100, historiales con 'B', etc.
Aún en este caso no tienes necesidad de grabar ordenadamente. Necesitarás un campo en la tabla de historiales para almacenar el número que quieres asignar (que este indexado preferiblemente) y otra tabla para controlar la numeración asignada a cada letra de apellido. Algo así:

Numero_Desde  Numero_Hasta   Letra
              1                         500                   A
         501                        1000                  B
             .                               .                      .
             .                               .                      .
    100001                    100500                Z

Esta tabla la tendrías que actualizar cuando el número de historiales en el intervalo de la letra se te quedara corto. Si no tuvieras las tablas correctamente relacionadas, también tendrías que actualizar los números de la tabla de historiales. Ten entonces en cuenta que el número de los historiales puede variar. Si quieres evitarlo debes hacer el intervalo para cada letra lo suficientemente grande y añadir de alguna forma al número de cada historial el año, de forma que puedas reutilizar anualmente los números del intervalo definido.

En fin... no sé si esto realmente se ajusta a tú caso y no me habré enrrollado mucho.De todas formas no puedes esperar que en un foro alguien te haga el análisis de una aplicación, eso debes currártelo tú, pero algunas ideas seguro que te valen.

Espero que te sirva.
Suerte.

994
Visual Basic 6.0 e inferiores / Re: Sobre OCX
« en: Jueves 21 de Agosto de 2003, 08:32 »
Para registrar tu componente:

Shell "REGSVR32 /S RutaNombreComponente.ocx"

El modificador /S es para registrar en modo silencioso.
Si quieres desregistrar utiliza el modificador /U.

Suerte.

995
Visual Basic 6.0 e inferiores / Re: Para quienes dominan SQL
« en: Jueves 21 de Agosto de 2003, 08:24 »
Donde dice:

rsbusca.Source = "select p.idproducto, p.nombreproducto, p.idcategoría, p.cantidadporunidad, p.preciounidad, c.NombreCategoría from productos p, categorías c where p.idcategoría=c.idcategoría and nombreproducto like '" & Text1.Text & "%' order by nombreproducto"

Debería decir:

rsbusca.Source = "select p.idproducto, p.nombreproducto, p.idcategoría, p.cantidadporunidad, p.preciounidad, c.NombreCategoría from productos p, categorías c where p.idcategoría=c.idcategoría and nombreproducto like '" & Replace(Text1.Text, Chr(29), Chr(180)) & "%' order by nombreproducto"

Por otro lado si metes este código en el evento Change del TextBox, cada vez que el usuario pulse una tecla y se modifique el contenido del textbox, se desencadenará el evento y la consiguiente consulta, cosa que no creo que te interese.
Puedes programar el evento Validate (ojo con la propiedad CauseValidation del resto de los controles) o puedes utilizar el evento LostFocus o puedes añadir un CommandButton o algo así para ejecutar la consulta.

A ver si esto te sirve. Suerte.

996
Visual Basic 6.0 e inferiores / Como cargar archivos .ini?
« en: Miércoles 20 de Agosto de 2003, 13:46 »
Te aseguro que no hay color de utilizar las api's a gestionar tú mismo el fichero de texto, y ya no digamos de usar SaveSetting, GetSetting, pero como para gustos hay colores y para problemas, soluciones, pues que cada uno vea lo que mejor le conviene.

Un saludo.

997
Visual Basic 6.0 e inferiores / Re: Para quienes dominan SQL
« en: Miércoles 20 de Agosto de 2003, 09:09 »
Cuando concatenes o montes la sentencia SQL , puedes hacer lo siguiente:

Replace(Text1.Text, Chr(29), Chr(180))

Que es ni más ni menos que sustituir el carácter ' (Chr(29)) por ´ (Chr(180)). Luego, a la hora de presentar el campo si te importa el que el carácter esté cambiado, haz el proceso contrario:

Text1.Text = Replace(Recordset1.Fields(0).Valur, Chr(180), Chr(29))

Otra cosa que podrías hacer es en el evento 'KeyPress' del TextBox, cambiar la pulsación de ' por ´ o otro carácter que tu vieras:

If KeyAscii = 29 Then KeyAscii = 180

Espero que esto te sirva de ayuda.
Suerte.

998
Visual Basic 6.0 e inferiores / Re: ¿Como armar una base de datos?
« en: Miércoles 20 de Agosto de 2003, 08:54 »
No comprendo muy bien lo rebuscado de la forma que planteas en el tema.

Yo introduciría los pacientes en la tabla que tengas para ello, que de seleccionar los que comiencen por una letra y de ordenarlos ya se encargará la correspondiente consulta, que para eso existen los índices de las tablas.

Por ejemplo, cuando quieras seleccionar los que comiencen por 'C':

SELECT * FROM TablaPacientes WHERE Left([Apellido],1) = 'C' ORDER BY Apellido

Suerte.

999
Visual Basic 6.0 e inferiores / Re: Como cargar archivos .ini?
« en: Miércoles 20 de Agosto de 2003, 08:38 »
Prueba con algo de este tipo:

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Private Function LeerIni(ByVal IniFile As String, ByVal Seccion As String, ByVal Clave As String, Optional ByVal DftValor As String) As String

    Dim lng1 As Long
    LeerIni = Space(255)
    lng1 = GetPrivateProfileString(Seccion, Clave, DftValor, LeerIni, 255, IniFile)
    LeerIni = Left(LeerIni, lng1)
   
End Function

Private Sub EscribirIni(ByVal IniFile As String, ByVal Seccion As String, ByVal Clave As String, ByVal Valor As String)

    Dim lng1 As Long
    lng1 = WritePrivateProfileString(Seccion, Clave, Valor, IniFile)
   
End Sub

Otra forma muy sencilla sería utilizando el registro. Podrías utilizar las apis necesarias para crear tus claves en la sección del registro que necesitaras, pero más sencillo y despreocupado resultaría utilizar 'SaveSetting' para guardar los valores de las propiedades y 'GetSetting' para recuperarlos, y luego 'DeleteSetting' cuando quieras borrar la propiedad del registro.

Espero que esto te vaya bien.
Suerte.

1000
Visual Basic 6.0 e inferiores / Re: Ayuda con Adodc
« en: Martes 19 de Agosto de 2003, 12:57 »
Si en tu caso el TextBox NO ESTÁ ENLAZADO al control data, entonces probablemente lo que ocurre es que el código que actualiza el valor (del estilo 'Adodc1.Recordset.Fields(1).Value = Text1.Text') para el campo correspondiente en el recordset se encuentra en un evento que no se desencadena:
- Si el código está en el evento 'Change', entonces es que el valor del texto es el mismo que el que asignas por código.
- Si el código está en el evento 'KeyPress' o 'KeyDown' o 'KeyUp', entonces es evidente que si no se produce una pulsación de teclas, no se desencadena el evento.

Si el TextBox ESTÁ ENLAZADO al control data, entonces... debería actualizar el valor él solito. No sé cual podría ser el problema.

Espero que esto te sirva. Sort.

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