• Jueves 25 de Abril de 2024, 12:46

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

Páginas: 1 2 [3]
51
Visual Basic 6.0 e inferiores / Re: """busco Ejemplo Vb Para Enviar Mails""""
« en: Jueves 1 de Septiembre de 2005, 09:24 »
:comp: Te tengo dos opciones, ambas están interesantes, la primera es esta:

Código que sirve para mandar mails anónimos usando un servidor SMTP como por ejemplo el de hotmail.

Y el segundo no me acuerdo donde está la page, por lo que lo adjunto a este post.
 :suerte:

52
Visual Basic 6.0 e inferiores / Re: Copiar Foto A Carpeta
« en: Jueves 1 de Septiembre de 2005, 08:51 »
:comp: Si existe una forma de copiar una imagen o cualquier archivo de un lugar a otro con sus nombres y paths completos y es por medio de FileSystemObject

Un ejemplo de cómo usarlos es el siguiente:

Código: Text
  1.  
  2. Dim ArchivoObj As Variant
  3. Dim sArchivoOrigen, sArchivoDestino As String
  4. sArchivoOrigen = "c:\Carpeta1\ArchivoA.jpg"  'Archivo origen con ruta completa.
  5. sArchivoDestino = "c:\Otra_Carpeta\Otro_Archivo.jpg" 'Archivo destino con ruta completa.
  6. Set ArchivoObj = CreateObject("Scripting.FileSystemObject") 'Crea un objeto tipo FileSystemObject
  7. ArchivoObj.CopyFile sArchivoOrigen, sArchivoDestino 'Copia de un archivo al otro.
  8.  
  9.  
  10.  

Igual modifique un proyecto de VisualBasic para realizar la tarea que necesitas con unos extras interesantes.  Lo adjunto a este mensaje para que lo revises y me cuentes.

Nota:  Como la forma de crear el objeto es por medio de un script, si tienen activo algun programa anti spyware, les alarmará preguntando si lo dejan correr o no.  Solo es la primera vez si le dicen que sí.

 :suerte:

P.D.  Encontré esta información en el help de Visual Basic.

Código: Text
  1.  
  2. FileSystemObject (Objeto)
  3.                
  4. Descripción
  5.  
  6. Proporciona acceso al sistema de archivos de un equipo.
  7.  
  8. Sintaxis
  9.  
  10. Scripting.FileSystemObject
  11.  
  12. Comentarios
  13.  
  14. El código siguiente demuestra cómo se utiliza el objeto FileSystemObject para devolver un objeto TextStream que se puede leer o en el que se puede escribir:
  15.  
  16. Set fs = CreateObject("Scripting.FileSystemObject")
  17. Set a = fs.CreateTextFile("c:\archivoprueba.txt", True)
  18. a.WriteLine("Esto es una prueba.")
  19. a.Close
  20.  
  21. En el código que se muestra arriba, la función CreateObject devuelve el objeto FileSystemObject (fs). El método CreateTextFile crea entonces el archivo como un objeto TextStream (a) y el método WriteLine escribe una línea de texto al archivo de texto creado. El método Close vacía el búfer y cierra el archivo.
  22.  
  23.  
  24.  

 :jumpie:

53
Robótica / Re: Usb Y Port Paralelo
« en: Jueves 1 de Septiembre de 2005, 05:07 »
:wacko: Tu pregunta está un poco enredada, creo que quieres conectar un adaptador de puerto USB a puerto paralelo, y que por medio de este puerto paralelo quieres controlar unos motores por medio de un circuito de interfas?

De ser así me imagino que quieres realizar un programa o ya lo tienes, con el cual se controlaran desde la PC a los motores.

El único requisito es que el driver del adaptador de USB a paralelo sea compatible con el método de acceso del software que se utilizará.

Es posible que el adaptador que te refieras sea como este:

USB-to-Parallel Port Printer Cable

Especfica y explica un poco más sobre tu problema.  :think:

54
Robótica / Re: Creación De Un Robot
« en: Jueves 1 de Septiembre de 2005, 04:23 »
:comp: Encontré la librería IO.dll para controlar el puerto paralelo desde Windows 95 a Windows XP.  Como está pequeña la adjunto a este post.

Hasta el momento ha funcionado bien, no tengo ninguna queja.  Pero de todos modos les pasteo la licencia.

Código: Text
  1.  
  2.     Copyright 2002 Santiago Zeni, Todos los derechos reservados.
  3.     Email: zsanti@hotmail.com
  4. _______________________________________________________
  5.  
  6.    LICENCIA:
  7.  
  8. * PPort Control es freeware.
  9.  
  10. * Para Windows 95/98/Me/2000/XP
  11.  
  12. * Esta aplicación puede ser distribuida libremente.
  13.  
  14. * Esta aplicación utiliza el archivo IO.dll
  15. Si bien nunca tuve problemas, no me hago responsable de los daños que pueda causar este archivo en tu máquina. Usalo bajo tu propio riesgo.
  16.  
  17. * Toda alteración de este software esta prohibida, incluyendo la modificación de los archivos de texto.
  18.  
  19. * PPort Control ES DISTRIBUIDO "TAL CUAL ESTA". NO EXISTE GARANTIA ALGUNA. USELO BAJO SU PROPIA RESPONSABILIDAD. NO ME HAGO RESPONSABLE DE LA PERDIDA DE DATOS, DAÑOS AL EQUIPO O PERDIDA DE CUALQUIER NATURALEZA QUE PUEDA SURGIR DEL USO DE ESTE SOFTWARE.
  20.  
  21. * La instalación y el uso de este software implican la aceptación de los términos y condiciones de la licencia. Si no esta de acuerdo con los términos de la licencia, debe eliminar los archivos de PPort Control de sus dispositivos de almacenamiento y dejar de utilizar el producto.
  22.  
  23.  
  24.  

Espero les sirva para algo.   :suerte:

55
Robótica / Re: Creación De Un Robot
« en: Jueves 1 de Septiembre de 2005, 04:07 »
:wacko: Una ultima foto (no se aburran)  :hippi:

56
Robótica / Re: Creación De Un Robot
« en: Jueves 1 de Septiembre de 2005, 04:00 »
:comp: Otra fotografía  :wacko:

57
Robótica / Re: Creación De Un Robot
« en: Jueves 1 de Septiembre de 2005, 03:48 »
:comp: Este es el esquema básico del brazo.  Por cierto también tengo el circuito electrónico que le da potencia a los motores (cinco motores en total), el principio del funcionamiento (frecuencia de estados), y la forma de controlarlo a través del programa y por un joystick o joypad (cualquiera, USB o DB15).  El sistema está diseñado para realizar una rutina, grabarla y luego reproducirla cuantas veces sea.

A manera de historia, les cuento que al principio me costó mucho que reprodujera secuencias con exactitud, pues utilicé midiendo el tiempo en que el brazo permanecía en determinado estado (Ej.: estado de giro de muñeca, estado de giro de codo, estado de giro de hombro, etc., y todas las combinaciones posibles).  Pero, como Windows es un sistema multitarea, en ocasiones si funcionaba y en otras no, por ejemplo cuando iniciaba otra aplicación y esta requería de mas atención del sistema, el programa fallaba en los lapsos de tiempo, por lo que la reproducción colapsaba.

La solución, fue simple pero 100% efectiva.  El principio radica en el funcionamiento de los motores paso a paso (stepers), esto realizan un giro de determinado ángulo por cada cambio de estado en sus voltajes de entrada, es decir giran así como cambios que reciben, por lo que relacioné la cantidad de grados de giro con la cantidad de cambios necesarios, y listo me dedique a contar cambios realizados en determinado estado.  Y si la compu se retardaba en responder, el brazo sencillamente se detiene (como hacen las impresoras) y continuaban con su trabajo cuando la PC ya esta de nuevo lista.

Espero que todo este palabrerío les ayude en algo :suerte:  :beer:

58
Robótica / Re: Creación De Un Robot
« en: Jueves 1 de Septiembre de 2005, 03:20 »
:comp: Tengo un brazo que realicé hace como 8 años (está viejito), lo controlé por el puerto paralelo por medio de un programa hecho en Visual Basic.   El movimiento de cada articulación es por medio de stepers, dos de ellos son de drives de discos de 3.5., otros 3 son de maquinas fotocopiadoras (uno de mayor potencia que los otros dos).  

Puedo ayudar, transmitiendo lo poco que sé, por medio de este foro.

Hace poco termine una maquina que elabora bobinas (inductores), esta es controlada por una aplicación en Visual Basic por medio del puerto paralelo.  Tiene la capacidad de controlar cuantas espiras (vueltas) se enrollan en el núcleo del inductor y se detiene en él numero de espiras programado.  La aplicación funciona en WinXP.

El internas del software es una librería que baje de Internet, pero no me acuerdo de la pagina, sin embargo tengo la librería y se las puedo enviar por correo.

Adelantando les muestro el código para declarar las distintas funciones de la librería.

Código: Text
  1.  
  2. Option Explicit
  3. Public Const LPT1x = &H378
  4.  
  5. Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
  6. Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
  7. Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
  8. Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
  9. Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
  10. Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
  11. Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
  12. Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
  13. Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
  14. Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
  15. Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
  16. Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean
  17.  
  18.  
  19. '********************************************************
  20. '*********    Function Descriptions   *******************
  21. '********************************************************
  22.  
  23. 'PortOut - Outputs a byte to the specified port.
  24.    
  25. 'PortWordOut - Outputs a word (16-bits) to the specified port.
  26.    
  27. 'PortDWordOut - Outputs a double word (32-bits) to the specified port.
  28.    
  29. 'PortIn - Reads a byte from the specified port.
  30.    
  31. 'PortWordIn - Reads a word (16-bits) from the specified port.
  32.    
  33. 'PortDWordIn - Reads a double word (32-bits) from the specified port.
  34.    
  35. 'SetPortBit - Sets the bit of the specified port.
  36.    
  37. 'ClrPortBit - Clears the bit of the specified port.
  38.    
  39. 'NotPortBit - Nots (inverts) the bit of the specified port.
  40.    
  41. 'GetPortBit - Returns the state of the specified bit.
  42.    
  43. 'RightPortShift - Shifts the specified port to the right. The LSB is
  44. '                 returned, and the value passed becomes the MSB.
  45.    
  46. 'LeftPortShift - Shifts the specified port to the left. The MSB is
  47. '                returned, and the value passed becomes the LSB.
  48.    
  49. 'IsDriverInstalled - Returns non-zero if io.dll is installed and
  50. '                    functioning. The primary purpose of this function
  51. '                    is to ensure that the kernel mode driver for
  52. '                    NT/2000/XP has been installed and is accessible.
  53.    
  54.  
  55.  

Y unas funciones personalizadas para el caso.

Código: Text
  1.  
  2. Public Function OutPort1(ByVal Num As Byte) As Byte
  3.     PortOut LPT1x, Num
  4.     OutPort1 = Num
  5. End Function
  6.  
  7. Public Function InPort2() As Byte
  8. Dim XB As Byte
  9.     XB = PortIn(LPT1x + 1)
  10.     InPort2 = XB
  11. End Function
  12.  
  13. Public Function OutPort3(ByVal Num As Byte) As Byte
  14.     PortOut LPT1x + 2, Num
  15.     OutPort3 = Num
  16. End Function
  17.  
  18. Public Function InPort3() As Byte
  19. Dim XB As Byte
  20.     XB = PortIn(LPT1x + 2)
  21.     InPort3 = XB
  22. End Function
  23.  
  24.  
  25.  

El principio mecánico del brazo robotico es él sube y baja.  Específicamente cada articulación como el codo y el hombro, que es donde más se necesita potencia mecánica, se pueden utilizar contra pesos, de manera que si colocamos un eje la articulación esta se mantiene horizontal, es decir ninguna de sus partes flotantes no ejerce ningún torque hacia el eje, solamente su peso, por lo que es fácil de girar, es decir se requiere poca fuerza.  Con un motor pequeño se puede generar movimiento, el cual hay que incluir cuando se coloque contrapeso, de hecho este puede funcionar como contrapeso.  Bueno, son ideas que me funcionaron muy bien, revisen la foto adjunto ese es mi brazo mecánico.

 :suerte:

59
Visual FoxPro / Re: Actualizar Una Tabla Desde Un Grid
« en: Miércoles 31 de Agosto de 2005, 22:31 »
:comp: Con este código se puede desplegar un grid con casillas de verificación.

En un grid configuras las siguientes propiedades de la siguiente manera:


Código: Text
  1.  
  2. THISFORM.Tugrid.ColumnCount = 2 *O las que necesites.
  3. THISFORM.Tugrid.DeleteMark = .F. *Oculta la casilla de delete.
  4. THISFORM.Tugrid.GridLines = 0 *Sin líneas en el grid.
  5. THISFORM.Tugrid.HighlighRow = .F.  *Para que no resalte cada fila al enfocarla.
  6. THISFORM.Tugrid.PanlelLink = .F. *Inhabilita el link del panel.
  7. THISFORM.Tugrid.RecordMark = .F. *Oculta la marca de registro.
  8. THISFORM.Tugrid.ScrollBars = 2 *Vertical.
  9. THISFORM.Tugrid.SplitBar = .F. *SplitBar inhabilitada.
  10.  
  11.  
  12.  


Luego en el formulario en tiempo de diseño le das click derecho al grid (Tugrid) y selecciones edit (editar). Ahora el grid (Tugrid) aparece con un recuadro celeste, sin que este recuadro desaparezca seleccionas el control casilla de verificación y lo marcas dentro de la columna en donde quieras que aparezca. Por defecto cada columna tiene un cuadro de texto como control por defecto. Luego configuras en tu grid lo siguiente:


Código: Text
  1.  
  2. THISFORM.Tugrid.Column1.CurrentControl = 'Check1'
  3. * El nombre de la columna depende de cual quieras modificar, así también la casilla.
  4.  
  5.  
  6.  

Estero te sirva :suerte:

Revisa la imagen adjunto.  Esta tiene un grid configurado de esta manera.

60
Visual FoxPro / Re: Se Pierde La Tabla Cuando Paso De Form
« en: Miércoles 31 de Agosto de 2005, 22:23 »
:comp: Intenta cambiar la propiedad de tus formularios DataSession a 2 (Private Data Session), por defecto está en 1 (Default Data Session)

Encontré esto en el help de VFox

Código: Text
  1.  
  2. DataSession (Propiedad)
  3. Se aplica a   Vea también
  4.  
  5. Especifica si un formulario, un conjunto de formularios o una barra de herramientas puede ejecutarse en su propia sesión de datos y tener un entorno de datos separado. Está disponible en tiempo de diseño; es de sólo lectura en tiempo de ejecución.
  6.  
  7. Sintaxis
  8.  
  9. Objeto.DataSession[ = nSesión]
  10.  
  11. Configuración
  12.  
  13. nSesión
  14.  
  15. Las configuraciones posibles de la propiedad DataSession son:
  16.  
  17. Configuración    Descripción
  18. 1  (Valor predeterminado) Sesión de datos predeterminada.
  19. 2 Sesión de datos privada. Crea una nueva sesión de datos para cada instancia del formulario, el conjunto de formularios o la barra de herramientas que se crea.
  20.  
  21.  
  22.  
  23.  

 :suerte:

61
Visual FoxPro / Re: Problema Con .exe
« en: Miércoles 31 de Agosto de 2005, 22:10 »
Tu problema es que el al compilar tu exe hace falta una instrucción para iniciar el procesamiento de eventos.  Esto se resuelve de la siguiente manera:

Creas un programa en desde tu administrador de proyectos al cual le colocas el siguiente código:

Código: Text
  1.  
  2. DO FORM TuPath\TuFormulario.scx
  3. READ EVENTS
  4.  
  5.  
  6.  

Asegurate de que el programa este como principal antes de compilar tu exe.
Es decir:  botón derecho sobre el programa creado y selecciona SetMain.

La explicación de READ EVENTS en el help de Visual Fox

Código: Text
  1.  
  2. READ EVENTS (Comando)
  3. Vea también
  4.  
  5. Inicia el procesamiento de eventos.
  6.  
  7. Sintaxis
  8.  
  9. READ EVENTS
  10.  
  11. Comentarios
  12.  
  13. Cuando se ejecuta READ EVENTS, Visual FoxPro inicia el procesamiento de eventos.
  14.  
  15. Ejecute CLEAR EVENTS para detener el procesamiento de eventos. Cuando se ejecuta CLEAR EVENTS, continúa la ejecución del programa con la línea inmediatamente siguiente a READ EVENTS.
  16.  
  17. Observe que sólo un comando READ EVENTS puede estar activo a la vez. Si un comando READ EVENTS está activo, cualquier comando READ EVENTS subsiguiente no tendrá efecto.
  18.  
  19.  
  20.  

El único cuidado que hay que tener es de colocar el siguiente código en el evento UnLoad del TuFormulario o sea:

Código: Text
  1.  
  2. CLEAR EVENTS
  3.  
  4.  
  5.  

 :suerte:


***** :wacko: Lo siento, no leí tu nota final, pero de todos modos dejo el dato por si alguien mas necesita la información  :losiento: *****

62
Visual FoxPro / Re: Uso De Dodefault()
« en: Miércoles 31 de Agosto de 2005, 21:50 »
:comp: Es probable que ocurra esto porque DODEFAULT() ejecuta, desde dentro de una subclase, el evento o método de clase primaria del mismo nombre .

Utiliza en cambio el operador ::

Encontre lo siguiente en el help de Visual Fox

Código: Text
  1.  
  2. :: (Operador de resolución de alcance)
  3. Ejecuta un método de clase primaria desde un método de subclase.
  4.  
  5. Sintaxis
  6.  
  7. cNombreClase::cMétodo
  8.  
  9. Comentarios
  10.  
  11. El operador :: se utiliza para ejecutar un método de clase primaria desde un método de subclase. Cuando cree una subclase, los métodos de subclase se heredarán automáticamente de la clase primaria. El operador :: permite ejecutar el método de clase primaria y realizar después otros procesos adicionales para el método de subclase. Las definiciones de subclase del ejemplo demuestran cómo se utiliza el operador :: para ejecutar el método de clase primaria en un método de subclase.
  12.  
  13.  
  14. Ejemplo de :: (Operador de resolución de alcance)
  15.  
  16. El ejemplo siguiente crea un formulario y agrega dos botones de comando al formulario. Al hacer clic en los botones puede salir del formulario (el segundo botón, cmdOtroBotón, llama al procedimiento clic de cmdSalir). Esta acción es posible por la creación de subclases. El operador de resolución de alcance llama al código de la clase principal para el objeto subclase.
  17.  
  18. frmMiForm = CREATEOBJECT("Form")
  19. frmMiForm.Width      = 450
  20. frmMiForm.Height     = 100
  21. frmMiForm.Caption    = "Ejemplo de resolución de alcance"
  22. frmMiForm.AutoCenter =.T.
  23. frmMiForm.AddObject("cmdSalir","cmdBotónSalir")
  24. frmMiForm.AddObject("cmdOtro","cmdOtroBotón")
  25. frmMiForm.SHOW                   && Muestra el formulario.
  26. READ EVENTS                      && Inicia el procesamiento de eventos.
  27.  
  28. El siguiente ejemplo define dos botones de comando. El primer botón se utilizará como subclase del segundo botón. La creación de la subclase se puede ver en las propiedades FontBold y ForeColor que se definen para cmdSalir, pero nunca se establece explícitamente para cmdOtroBotón. Definimos cmdOtroBotón como una subclase de cmdBotónSalir. Como resultado, este botón heredará todos los atributos definidos para cmdBotónSalir.
  29.  
  30. DEFINE CLASS cmdBotónSalir AS CommandButton
  31.     Caption    = "\<Salir"    && Título del botón de comando.
  32.     Left       = 175          && Borde izquierdo del botón.
  33.     Top        = 60           && Posición de la parte superior del botón.
  34.     Height     = 25           && Altura del botón.
  35.     Visible    = .T.          && Mostrar el botón en el formulario.
  36.     FontItalic = .T.          && Activar texto en cursiva.
  37.     ForeColor  = RGB(0,0,255) && Cambiar el color del texto del botón.
  38.  
  39.     PROCEDURE Click
  40.      WAIT WINDOW "Ejecutando el procedimiento CLICK para cmdSalir." TIMEOUT 1
  41.      CLEAR EVENTS    && Detiene el procesamiento de eventos, cierra Form.
  42. ENDDEFINE
  43. DEFINE CLASS cmdOtroBotón AS cmdBotónSalir
  44.  
  45.     Caption = "Haga clic aquí para salir."
  46.     Left    = 175
  47.     Top     = 30
  48.     Height  = 25
  49.      
  50.     PROCEDURE Click
  51.       WAIT WINDOW "Evento Click para el botón: cmdOtroBotón." TIMEOUT 1
  52.       cmdBotónSalir::Click
  53. ENDDEFINE
  54.  
  55.  
  56.  

En tu caso sería de la siguiente forma

Código: Text
  1.  
  2. *EVENTO MOUSEDOWN
  3.  
  4. IF CONDICION1 = .T.
  5. NODEFAULT
  6. THIS.STATUSBARTEXT = 'The control is read-only'
  7. RETURN
  8. ELSE
  9. TUCOMBOBOX::MOUSEDOWN(nButton, nShift, nXCoord, nYCoord)
  10. ENDIF
  11.  
  12.  
  13.  

Espero te sirva :suerte:

63
Visual FoxPro / Re: Vfp + Com
« en: Miércoles 31 de Agosto de 2005, 21:31 »
:comp: Encontre esto en el help de visual fox 6.

Código: Text
  1.  
  2. Algunas funciones de DLL requieren parámetros más complejos, como estructuras o matrices. Si la función requiere un puntero a una estructura, debe determinar la distribución de la estructura y emularla como una cadena en Visual FoxPro antes de transferirla o recibirla de la función de DLL. Por ejemplo, la función del sistema de Windows GetSystemTime( ) espera un puntero a una estructura formada por ocho palabras o enteros de 16 bits sin signo que indican el año, el mes, el día, etc. La estructura se define de esta forma:
  3.  
  4. typedef struct _SYSTEMTIME {
  5.    WORD wYear&#59;
  6.    WORD wMonth&#59;
  7.    WORD wDayOfWeek&#59;
  8.    WORD wDay&#59;
  9.    WORD wHour&#59;
  10.    WORD wMinute&#59;
  11.    WORD wSecond&#59;
  12.    WORD wMilliseconds&#59;
  13. } SYSTEMTIME
  14.  
  15. Para pasar datos entre Visual FoxPro y la función GetSystemTime( ), tiene que crear un búfer de cadena de 40 bytes (formado inicialmente por espacios) y, a continuación, pasar la dirección de esta cadena a la función para llenarla. Cuando se devuelve la cadena, debe dividirla en trozos de 2 bytes para extraer los campos individuales de la estructura. El siguiente fragmento demuestra cómo podría extraer tres de los campos de la estructura:
  16.  
  17. DECLARE INTEGER GetSystemTime IN win32api STRING @
  18. cBuff=SPACE(40)
  19. =GetSystemTime(@cBuff)
  20.  
  21. tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * &#59;
  22.    256 + ASC(SUBSTR(cBuff,1))))
  23. tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) *&#59;
  24.    256 + ASC(SUBSTR(cBuff,3))))
  25. tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) *&#59;
  26.    256 + ASC(SUBSTR(cBuff,5))))
  27.  
  28. Para obtener más información, puede examinar el formulario de ejemplo Systime.scx del directorio ...\Samples\Vfp98\Solution\Winapi de Visual Studio. Para ver otros ejemplos de cómo pasar parámetros a funciones de DLL, vea el programa Registry.prg que se encuentra en el directorio ...\Samples\Vfp98\Classes de Visual Studio.
  29.  
  30. Si los datos con los que está trabajando en Visual FoxPro son una matriz, debe recorrer varias veces la matriz y concatenarlos en una única cadena que representa una matriz de tipo C antes de pasarlos a la función de DLL. Si la función de Windows espera valores de 16 bits o de 32 bits, tiene que convertir los valores a sus equivalentes hexadecimales antes de concatenarlos en una cadena. Cuando pasa la cadena que contiene los datos de la matriz, Visual FoxPro pasa la dirección de la variable de tipo cadena a la DLL, que puede manipularla como matriz. Para ver un ejemplo de esto, vea el formulario de ejemplo Syscolor.scx que se encuentra en el directorio ...\Samples\Vfp98\Solution\Winapi de Visual Studio.
  31.  
  32.  
  33.  

Este es un ejemplo de código de una funsión del API que utilizo con frecuencia

Código: Text
  1.  
  2. FUNCTION GetPath(nHex) && Numero Hexadecimal
  3. LOCAL sPathP
  4. Declare SHGetSpecialFolderPath In 'shell32.dll'&#59;
  5.         Long hWnd, String @sPath, Long Folder, Long Create
  6. *Regresa el path de carpetas en el sistema, como:
  7. *Mis documentos (de usuario actual o todos los usuarios)
  8. *Mis imagenes "
  9. *Usuario actual
  10. *Archivos de Programa, etc.
  11.  
  12. sPathP = SPACE(256) && Tamaño del string en blanco.
  13.  
  14. = SHGetSpecialFolderPath(1, @sPathP, nHex, .F.) && Llama el valor al API.
  15. *--- NOTA: @variable, pasa el parametro por referencia, es decir para que
  16. *--- sea modificado y retorne su valor.
  17.  
  18. sPathP = LEFT(sPathP,AT(Chr(0),sPathP) - 1) && Asigna el valor del Path.
  19.  
  20. RETURN sPathP
  21. ENDFUNC
  22.  
  23.  
  24.  

 :suerte:

64
Visual FoxPro / Re: Parametros A Sql?
« en: Miércoles 31 de Agosto de 2005, 21:00 »
:wacko: No entiendo muy bien tu problema, pero si explicaras qué es lo que quieres hacer sería un poco más fácil.

De todos modos creo que lo que quieres que el comando SQL reconozca a campo2 no como nombre si no como variable (en este caso de caracteres).

Una forma de solucionarlo es la siguiente:

Código: Text
  1.  
  2. *Crea una variable tipo string
  3. LOCAL sConsulta as String
  4. sConsulta = ''
  5.  
  6. *Asigna la instrucción como carácter de tu consulta.
  7. *campo1 puede ser igual a 'Mitabla.nombre'
  8. *campo2 puede ser igual a 'Mitaba.apellido'
  9. *tabla puede ser igual a 'mi_path\Mi_base_de_datos.Mitabla'
  10.  
  11. sConsulta = 'SELECT ' + campo1 + ',  ' + campo2 + ' FROM ' + tabla +&#59;
  12.  ' WHERE thisform.dato.text == '  +  campo1 + ' or thisfrom.dato.text == ' +&#59;
  13.    campo2 + ' ORDER BY ' + campo1 + ' INTO CURSOR cursor1'
  14.  
  15. *Luego utilizas el macro & y listo.  Este macro ejecuta el contenido de la variable,
  16. *en este caso sConsulta.
  17. *Ten cuidado con los espacios en blanco para que el macro &
  18. *pueda reconocer el codigo.
  19.  
  20. &sConsulta
  21.  
  22.  
  23.  

Como consejo previo puedes visualizar en una etiqueta como se ve la consulta armada antes de que el comando & la ejecute.  Por ejemplo:

Código: Text
  1.  
  2. THISFORM.Label1.caption = sConsulta
  3.  
  4.  
  5.  

Espero te sirva :suerte:

65
Visual FoxPro / Re: List Con Check
« en: Miércoles 31 de Agosto de 2005, 20:31 »
:comp: Según lo que entiendo, quieres hacer varias cosas...
La primera es poder desplegar un listado con casillas de verificación.  Hasta el momento no lo eh probado con un listbox, pero si con un grid y es relativamente fácil.

En un grid configuras las siguientes propiedades de la siguiente manera:

Código: Text
  1.  
  2. THISFORM.Tugrid.ColumnCount = 2 *O las que necesites.
  3. THISFORM.Tugrid.DeleteMark = .F. *Oculta la casilla de delete.
  4. THISFORM.Tugrid.GridLines = 0 *Sin líneas en el grid.
  5. THISFORM.Tugrid.HighlighRow = .F.  *Para que no resalte cada fila al enfocarla.
  6. THISFORM.Tugrid.PanlelLink = .F. *Inhabilita el link del panel.
  7. THISFORM.Tugrid.RecordMark = .F. *Oculta la marca de registro.
  8. THISFORM.Tugrid.ScrollBars = 2 *Vertical.
  9. THISFORM.Tugrid.SplitBar = .F. *SplitBar inhabilitada.
  10.  
  11.  
  12.  

Luego en el formulario en tiempo de diseño le das click derecho al grid (Tugrid) y selecciones edit (editar).  Ahora el grid (Tugrid) aparece con un recuadro celeste, sin que este recuadro desaparezca seleccionas el control casilla de verificación y lo marcas dentro de la columna en donde quieras que aparezca.  Por defecto cada columna tiene un cuadro de texto como control por defecto.  Luego configuras en tu grid lo siguiente:

Código: Text
  1.  
  2. THISFORM.Tugrid.Column1.CurrentControl = 'Check1'
  3. * El nombre de la columna depende de cual quieras modificar, así también la casilla.
  4.  
  5.  
  6.  

Para agregar una imagen a un cuadro de lista (o cuadro combinado) es más fácil:

Código: Text
  1.  
  2. THISFORM.TuListBox.picture(1) = 'C:\tu directorio\tu imagen.jpg'
  3. THISFORM.TuListBox.picture(2) = 'C:\tu directorio\tu otra imagen.jpg'
  4.  
  5. * Él numero entre paréntesis indica él numero de índice de tu lista.
  6. * Puedes usar mapas de bits también.
  7.  
  8.  
  9.  
Revisa la imagen adjunta.

Espero te sirva. :suerte:

66
Visual FoxPro / Re: Consulta En Grid
« en: Miércoles 31 de Agosto de 2005, 19:12 »
:comp: Es importante mencionar, que para que tu grid mantenga los títulos de los encabezados iniciales (los que configuraste en tiempo de diseño) así como el grosor de cada columna puedes hacer lo siguiente:  En el  método donde tienes tu consulta haces que la propiedad RecordSource sea nada ("") antes de realizarla y hasta después le asignas a RecordSource el nombre del cursor.  Por ejemplo:

Código: Text
  1.  
  2. *En el método InteractiveChange de un cuadro de texto.
  3.  
  4. thiform.tugrid.RecordSource = ""
  5.  
  6. SELECT * FROM TuTabla INTO CURSOR TuCursor
  7.  
  8. thisform.grdRes.RecordSource = "Tu Cursor
  9.  
  10.  
  11.  


:suerte:

67
Visual FoxPro / Re: Un Manual Para Los Principiantes
« en: Miércoles 31 de Agosto de 2005, 18:12 »
:D Gracias, me lo puedes enviar al digiarm@itelgua.com  :comp:

68
Visual C++ / Re: Publico Mi Tutorial Visual C++ 2005
« en: Martes 30 de Agosto de 2005, 10:22 »
:) En general está muy interesante y censillo. En efecto, le falta un poquito de mas cuidado en la presentación, y algo realmente importante:  la redacción, ya que de esta depende que el mensaje escrito sea lo suficientemente claro.

Un ejemplo es evitar la cacofonía. Definición: defecto del lenguaje que consiste en la repetición de letras o silabas que generan un sonido desagradable, construyendo una combinación inarmónica de los efectos acústicos de la palabra.  Otro ejemplo es el buen uso de los signos puntación.

Bueno respecto a todo esto, visita estos links, te pueden ser interesantes.

http://www.apuntes.org/materias/cursos/cli..._redaccion.html

http://personales.mundivia.es/jmallart/gramatic/puntua0.htm

existen muchos mas...

A continuación te muestro como escribiría la introducción de tu documento:

Este tutorial está enfocado a personas con nociones sobre programación estructurada (clásica C),  enfocada a objetos (POO) y con conocimientos básicos de programación C.

Espero, con este documento, exponer el estilo de programación de proyectos CLR de “Microsoft Visual C++ 2005 Express Edition Beta 2”,  haciendo uso de las funciones básicas más utilizadas.

Tutorial de uso didáctico sin fines de lucro.

Palabras del Autor.


En el caso del ejemplo que expones en tu trabajo, aún no lo puedo calificar, ya que no tengo el programa que utilizaste.  

 :comp:

69
Visual C++ / Re: Dll Creada En Visual C++ No Funciona En Vb
« en: Martes 30 de Agosto de 2005, 09:05 »
:hola: Gracias por la explicación sobre el macro WINAPI, realmente solo lo copie de un ejemplo que realicé en base a un link que indicó Diodo (http://alonso_m.tripod.com/visualc/creardll.htm.

Por cierto fue el primero que probé hacer pero no me funcionó, en realidad le encontré unos errores, pero no estoy completamente seguro.  Lo que sí sé es que al modificarlos, una de las funciones empezó a funcionar.

Código sin modificar en el archivo Demo.cpp:

void WINAPI LlenaDeX(char* cadena, int largo)
{
   char *puntero;
   puntero=cadena;
   for (int n=1;n=largo;n++)
   {
      *puntero='X';
      puntero++;
   };
};

Código modificado:

void WINAPI LlenaDeX(char* cadena, int largo)
{
   char *puntero;
   puntero=cadena;
   for (int n=0;n<largo;n++)
   {
      *puntero='X';
      puntero++;
   };
};

Cuando intente hacer funcionar esta función (con el código sin modificar), se trabaja la aplicación de visual basic (loop infinito), tenia que cerrarla a la fuerza.

 :hola: Me voy a descansar, hasta luego :blink: .

70
Visual C++ / Re: Dll Creada En Visual C++ No Funciona En Vb
« en: Martes 30 de Agosto de 2005, 07:31 »
---------------------------------------------------------------
*******  Continuación del anterior post *******
---------------------------------------------------------------
 :comp:

4.   En el archivo LCDx.h pegue el encabezado de la misma función justo arriba de la ultima línea de slash (////////////////////////) del código que automáticamente Visual C++ escribe en este archivo, de la siguiente manera:

#ifdef __cplusplus
extern "C" {
#endif
 
int WINAPI GetCharX(int, int, char*);
 
#ifdef __cplusplus
}
#endif


5.   Para que esta función pudiera ser acezada desde visual basic, en el archivo LCDx.def escribí justo por debajo de la palabra EXPORTS el nombre de la función quedando escrita como sigue:

; LCDx.def : Declares the module parameters for the DLL.

LIBRARY      "LCDx"
DESCRIPTION  'LCDx Windows Dynamic Link Library'

EXPORTS
   GetCharX

Nota:  Solo escribí el nombre de la función “GetCharX”, lo demás ya estaba escrito.

6.   Por ultimo el proceso de compilación.  El cual realicé con los archivos de la carpeta Source files de extensión “cpp”.  El primero en compilar fue el de nombre StdAfx.cpp (Ctrl+F7 o la primera opción “Compile LCDx.cpp” del menú Build), dicho paso fue necesario para que el siguiente archivo se pudiera compilar.  Paso siguiente, compile (Ctrl+F7 o ...) el archivo LCDx.cpp, y por ultimo inicié el proceso de construcción de la librería LCDx.dll presionando F7 o la segunda opción “build LCDx.dll” del menú build.  Esta ultima acción generó el archivo en la carpeta debut que se encuentra en la carpeta donde se salvé el proyecto completo.  Esta librería la copie en la carpeta del sistema (system) de Windows.

Como parte adicional (Anexo), escribo la sintaxis con la cual se declara la función en un proyecto de visual basic.  Esta se escribe en el cuerpo de un modulo (archivos .mod, por ejemplo:  recurso.mod) de la siguiente manera:

Declare Function GetCharX Lib "LCDx" (ByVal xCodigo As Long, _
                                      ByVal xPagina As Long, _
                                      ByVal sCodigo As String) As Long

Luego se puede generar una función un poco más simple para obtener cada valor en uno de los formularios del proyecto pudiendo ser de esta manera:

Public Function funcCodigo(ByVal xNumero As integer, _
                           ByVal xPagina As integer) As String
Dim iValor As Long
Dim sCodigo As String
sCodigo = Space(40)   'Inicializa el valor del string a 40 espacios en blanco.
iValor = GetCharX(xNumero, xPagina, sCodigo)
funcCodigo = sCodigo  

End Function


Al llamar la función resulta:

Print funcCodigo(2, 1)

Se imprime (en este caso sobre el formulario) lo siguiente:

0000001110101011111110001011100000000000

 :ph34r: Puede parecer un poco aburrido para los que tienen la habilidad y conocimiento sobre estos lenguajes, pero sé que puede ser de mucha utilidad para alguien, como en mi caso empieza a conocerlos  :blink: .

Gracias nuevamente.  :D

71
Visual C++ / Re: Dll Creada En Visual C++ No Funciona En Vb
« en: Martes 30 de Agosto de 2005, 07:28 »
Gracias Diodo y Etereal Idol  :comp:
Después de varias horas, investigando, probando lo sugerido y modificando la función un poco logre el desempeño esperado.
Para hacer efectiva la retro-alimentación, escribo lo que realice, paso a paso:

1.   Abrí un nuevo (New) proyecto (projects) en Visual C++ seleccionando el tipo MFC AppWizard (dll).  En el cuatro de texto del nombre (Project name), escribí el nombre de LCDx (El nombre de la librería a crear).  Después de hacer clic en aceptar (Ok) Visual C++ despliega un cuadro en el cual hay que seleccionar que tipo de librería quiere uno crear, para este caso se escoge la primera opción (Regular DLL with MFC statically linked).  Al presionar finalizar (finish) se visualiza un cuadro en el cual aparece la información del nuevo proyecto a crear (New Project Information), clic en aceptar (Ok) y listo.

2.   Visual C++ genera varios archivos necesarios en distintas carpetas (Source Files, Header Files, Resource Files y External Dependencias).  En la primer carpeta deben aparecer los siguientes archivos:  LCDx.cpp, LCDx.def, LCDx.rc y StdAfx.cpp.  En la segunda tenemos:  LCDx.h, Resource.h y StdAfx.h.  En las carpetas restantes aparecen otros archivos que no menciono pues no fueron modificados.

3.   Abrí el archivo LCDx.cpp en el cual pegue mi función (modificada) después de la ultima instrucción que empieza con # (#endif).  La función pegada es la siguiente:

extern "C"
int WINAPI GetCharX(int iCode, int bPage, char* sBits)
{
   char *sCBits;
   char sTheCode[40];
   strcpy(sTheCode, "0000000000000000000000000000000000000000");

   switch (iCode)
   {
   case 1: strcpy(sTheCode, "0000001110110111000111111011100000000000");   
      break;
   case 2: strcpy(sTheCode, "0000001110101011111110001011100000000000");   
      break;
   case 3: strcpy(sTheCode, "0000001010111111111101110001000000000000");   
      break;
   case 4: strcpy(sTheCode, "0000000100011101111101110001000000000000");   
      break;
   case 5: strcpy(sTheCode, "0111001110111111111101010001000111000000");   
      break;
   case 6: strcpy(sTheCode, "0010001110111111111101010001000111000000");   
      break;
   case 7: strcpy(sTheCode, "0000000000011100111001110000000000000000");   
      break;
   case 8: strcpy(sTheCode, "1111111111100011000110001111111111100000");   
      break;
   case 9: strcpy(sTheCode, "0000001110100011000110001011100000000000");   
      break;
   case 10: strcpy(sTheCode, "1111110001011100111001110100011111100000");   
      break;
   }

   sCBits=sBits;
    for (int n=0; n<40; n++)
    {
      *sCBits=sTheCode[n];
       sCBits++;
    };

    return (bPage);
}

Nota:  Esta función recibe 3 parámetros de los cuales los dos primeros son enteros y él ultimo es un char pero por referencia.   Dependiendo del numero recibido asigna un juego de caracteres por medio del switch case a la variable tipo carácter por medio de un puntero.  La versión anterior asignaba estos caracteres a la función como puntero, pero me imagino que por estar en una DLL, aún estando fuera de la función, la variable puntero perdía el valor y la función en la DLL fallaba.  Por esta razón modifique los parámetros a esta forma.

Continua en el siguiente post...... :comp:

72
Visual C++ / Dll Creada En Visual C++ No Funciona En Vb
« en: Lunes 29 de Agosto de 2005, 11:44 »
Soy principiante en programación en Visual C++,  por lo que me cuesta un poco entender, revise en el foro discusiones similares y que se puediera compilar mi proyecto y luego crear la dll, pero al intentar llamar la funcion de la dll desde visual basic me da el siguiente error:

Can´t find DLL entry point GetCharX in LCDse

Especificando la dll creada se llama LCDse y la funcion GetCharX.

Los archivos en visual C++ utilizados son los siguientes:

LCDse.h:

#define EXPORT __declspec( dllexport )

EXPORT char *GetCharX(int, int);

y el LCDse.cpp:

#include <windows.h>
#include "LCDse.h"

EXPORT char *GetCharX(int iCode, int bPage)
{
char sTheCode[40];
strcpy(sTheCode, "0000000000000000000000000000000000000000");

switch (iCode)
{
case 1: strcpy(sTheCode, "0000001110110111000111111011100000000000");
break;
case 2: strcpy(sTheCode, "0000001110101011111110001011100000000000");
break;
case 3: strcpy(sTheCode, "0000001010111111111101110001000000000000");
break;
case 4: strcpy(sTheCode, "0000000100011101111101110001000000000000");
break;
case 5: strcpy(sTheCode, "0111001110111111111101010001000111000000");
break;
case 6: strcpy(sTheCode, "0010001110111111111101010001000111000000");
break;
case 7: strcpy(sTheCode, "0000000000011100111001110000000000000000");
break;
case 8: strcpy(sTheCode, "1111111111100011000110001111111111100000");
break;
case 9: strcpy(sTheCode, "0000001110100011000110001011100000000000");
break;
case 10: strcpy(sTheCode, "1111110001011100111001110100011111100000");
break;
}
return sTheCode;
}

Disculpen las molestias, y les agradezco de antemano su ayuda.  :)

Páginas: 1 2 [3]