• Domingo 22 de Diciembre de 2024, 22:26

Autor Tema:  Guardado Secuencial  (Leído 1945 veces)

ijceba

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Guardado Secuencial
« en: Viernes 6 de Marzo de 2009, 18:35 »
0
Saludos soy nuevo en VB y quisiera que me ayudaran con algo que de seguro para ustedes sera muy sencillo, tengo este codigo:

Private Sub Command1_Click()

Dim i%
Dim Result As Boolean
Dim FileName As String


Result = SapAcquisition1.Buffer.Save("F:datospbaprueba.jpg", "-format jpg", 0, 1)


End Sub

donde SapAcquisition1 es un componente de una camara que estoy utilizando, y esto lo que hace es que me guarda una imagen llamada prueba en jpg en la careta F:datospba ok.

Hasta ahi todo bien, ahora lo que quiero es que cuando yo le de click a este button me guarde en esa carpeta un archivo prueba1.jpg, y cuado le de de nuevo click me guarde otro si borrarme el anterior llamado prueba2.jpg, y asi la cantidad de veces que sea, de tal forma que yo pueda llegar a tener un archivo prueba1552.jpg si le di click 1552 veces.

Y otra cosa, me gustaria tambien que si yo cierro el programa, apago la maquina y en un mes lo buelo a abrir y le doy de nuevo click me guarde el que continuaria osea prueba1553.jpg

Esta un poco loca mi propuesta pero es de mucha importacia este programa para mi ojala me puedan ayudar

Gracias

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #1 en: Domingo 8 de Marzo de 2009, 15:03 »
0
Cita de: "ijceba"
Saludos soy nuevo en VB ...seguro para ustedes sera muy sencillo, tengo este codigo:

Private Sub Command1_Click()
   Dim i%
   Dim Result As Boolean
   Dim FileName As String

    Result = SapAcquisition1.Buffer.Save("F:datospbaprueba.jpg", "-format jpg", 0, 1)
End Sub

...lo que quiero es que cuando yo le de click a este button me guarde en esa carpeta un archivo prueba1.jpg, ... asi la cantidad de veces que sea, de tal forma que yo pueda llegar a tener un archivo prueba1552.jpg si le di click 1552 veces.
..tambien si yo cierro el programa, apago la maquina y en un mes lo buelo a abrir y le doy de nuevo click me guarde el que continuaria osea prueba1553.jpg
Gracias

Efectivamente es muy simple....

Básicamente debes trasladar el código del botón a una función, para tenerlo más ordenado. La función debe recibir 3 ó 4 parámetros : ruta donde guardar, nombre del archivo, último nº usado y el formato con que se guardará.

El código sería algo parecido a: (las explicaciones al final... )

Código: Visual Basic
  1.  
  2. ' a nivel de formulario proveemos la siguiente variables:
  3.  
  4. public type InfoDatos
  5.      Ruta as string
  6.      Nombre as string
  7.      ImgIndex as long    
  8. end type
  9. const Config= "Config.ini"
  10. public ImgSalva as infoDatos
  11.  
  12. ' carga el fichero que tiene la configuración del programa, si no existe se crea
  13. Private Sub Form_Load()
  14.    Dim f As Integer
  15.    Dim fichero As String
  16.  
  17.    On Local Error GoTo errorAbrirConfig
  18.  
  19.     fichero = App.Path & "" & Config
  20.     f = FreeFile
  21.  
  22.     ' abrimos el archivo config
  23.     Open fichero For Binary As #f
  24.       ' leemos los datos del config
  25.        Get #f, 1, ImgSalva
  26.  
  27.     ' aseguramos que tiene valores válidos
  28.      Call Verificar_ValoresCorrectos
  29.        ' por si corregimos valores no válidos los volvemos a guardar
  30.         Put #f, 1, ImgSalva
  31.     ' cerramos el archivo
  32.     Close f
  33.  
  34.     ' verter los valores de la estructura a unos controles en el formulario, la ruta sería mejor ponerla en dirbox y drive y el nombre en un textbox y el index en un label o textbox....
  35.     ' TxtIndex.Text = ImgSalva.ImgIndex
  36.     ' TxtRuta.Text = ImgSalva.Ruta
  37.     ' TxtNombre.Text = ImgSalva.Nombre
  38.    
  39.     Exit Sub
  40.  
  41. errorAbrirConfig:
  42.     Close f
  43.     Call Guardar_Config
  44.     MsgBox "Ocurrió un problema al tratar de guardar el archivo config (la ruta es accesible?, de sololectura ?)" & Err.Description, vbCritical, "Error de lectura"
  45.     End  ' si no tenemos los datos adecuados finalizamos el programa.
  46. End Sub
  47.  
  48. '  guardamos la configuración actual antes de salir
  49. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  50.     Call Guardar_Config
  51. End Sub
  52.  
  53. '  botón guardar imagen/es de la cámara, si se precisa se podría poner un bucle iterativo que recorriera todas las imágenes que tenga el  'buffer' de la cámara... 
  54. Private Sub Command1_Click()
  55.     Dim k As Long
  56.  
  57.     ' es posible que exista una propiedad count quepueda usarse en un bucle, estos detalles son específicos y hay que referirse a la documentación del control
  58.    ' for k= 0 to SapAcquisition1.Buffer.count
  59.        If Salvar_Imagen(ImgSalva.Ruta, ImgSalva.Nombre, ImgSalva.ImgIndex) = False Then
  60.             Beep  ' ...     código adicional cuando  falló
  61.        Else
  62.             '...   código adicional cuando  todo fue bien
  63.        End If
  64.         ' si hay una propiedad count, es posible que deba apuntarse a la siguiente imagen, tal vez un SapAcquisition1.Buffer.next
  65.        ' o tal vez SapAcquisition1.Buffer.Select(k)
  66.        ' o tal vez sea uno de los parçametros de la propia función salvar: SapAcquisition1.Buffer.save(,,,,K), en este caso debería pasarse también el parámetro k a la función.
  67.    ' next
  68. End Sub
  69.  
  70. ' intenta guardar una imagen, procedente de un buffer en la cámara a un archivo en la ruta especificada en el formato indicado.
  71. Private Function Salvar_Imagen(ByVal Ruta As String, ByVal Nombre As String, ByRef UltimoIndex As Long, Optional Formato As SapAcquisitionFormts = SAP_FORMAT_JPG) As Boolean
  72.     Dim FileName As String
  73.  
  74.     On Local Error GoTo ErrorGuardar
  75.    
  76.     FileName = Ruta & "" & Nombre & (UltimoIndex + 1) & CorresponderExtension(Formato)
  77.         ' para pruebas  con y sin dicho control, activar una línea y desactivar la otra
  78.         Salvar_Imagen = SapAcquisition1.Buffer.Save(FileName,Formato,0,1)  
  79.         'Salvar_Imagen = True    ' False
  80.         If Salvar_Imagen = True Then
  81.             UltimoIndex = UltimoIndex + 1  ' el parámetro se pasó por referencia, por tanto se actualiza...
  82.         End If
  83. ErrorGuardar:
  84. End Function
  85.  
  86. ' dado un formato se devuelve la extensión que le corresponde...
  87. Private Function CorresponderExtension(ByVal Formato As SapAcquisitionFormts) As String
  88.     Dim ext As String
  89.  
  90.     Select Case Formato
  91.         Case SAP_FORMAT_JPG
  92.             ext = ".JPG"
  93.         Case SAP_FORMAT_BMP
  94.             ext = ".BMP"
  95.         Case SAP_FORMAT_PNG
  96.             ext = ".PNG"
  97.         Case SAP_FORMAT_GIF
  98.             ext = ".GIF"
  99.         Case Else
  100.             ext = ".Imagen_formato_no_determinado"
  101.     End Select
  102.  
  103.    CorresponderExtension = ext
  104. End Function
  105.  
  106. ' guardamos la configuración actual
  107. Private Sub Guardar_Config()
  108.    Dim f As Integer
  109.    Dim fichero As String
  110.  
  111.    On Local Error GoTo errorAbrirConfig
  112.      fichero = App.Path & "" & Config
  113.      f = FreeFile
  114.  
  115.     Call Verificar_ValoresCorrectos
  116.     ' abrimos el archivo config
  117.     Open fichero For Binary As #f
  118.         '  guardamos configuración actual
  119.         Put #f, 1, ImgSalva
  120.     ' cerramos el archivo
  121.     Close f
  122.     Exit Sub
  123.  
  124. errorAbrirConfig:
  125.      Close f
  126.      MsgBox "Ocurrió un problema al tratar de guardar el archivo config (la ruta es accesible?, de sololectura ?)" & vbCrLf & Err.Description
  127. End Sub
  128.  
  129. '  sin embargo esto no restituye estos mismos datos a los controles ya queda como trabajo para ti...
  130. Private Sub Verificar_ValoresCorrectos()
  131.     If ImgSalva.Ruta = "" Then ImgSalva.Ruta = App.Path
  132.     If ImgSalva.Nombre = "" Then ImgSalva.Nombre = "Prueba"
  133.     If ImgSalva.ImgIndex < 1 Then ImgSalva.ImgIndex = 1
  134. End Sub
  135.  
  136.  
  137.  

De entrada la configuración que ha de permanecer entre sesiones se guarda en un simple fichero llamado config.ini que se localiza en la misma carpeta en la que está ala aplicación (app.path)
Cuando se arranca el formulario, se lee dicha configuración, si no existe el archivo se crea, y si existe pero tiene datos no válidos garantiza datos válidos, sisucede un error al tratar de leer y rescribir la configuración la aplicación se finaliza, esto lo podrás cambiar a tu gusto...

Tras leer la configuración esta se almacena en una estructura, cuando se invoca a la función de guardar imágenes, se utilizan los valores de la estructura.
Estos valores deberían poderse cambiar desde la interfaz cambiando cuando interese la ruta, el nombre para el archivo y si se desea el índice de la imagen, usando para ellos los controles necesarios... quizás un menú y un pequeño formulario de entrada de datos, al cargarse el formulario se escribirían los datos de la estructura en los controles, si se pulsa un botón cambiar, recogería dichos datos en la estructura e invocaría a la función de guardar el archivo config, si se cierra el formulario sin pulsar dicho botón se descaratarían los cambios.... antes de guardar los datos en la estructura habría que validar (evento validate) que los valores tienen valores correctos...

En la función de guardar la imagen se envían los parámetros actuales de la estructura (de configuración), el numero que se une al nombre del fichero, sólo se actualiza cuando tuvo éxito guardar la imagen.

Importante: el formato que recibe la función no es real es decir se ha simulado una enumeración que se supone que tiene el control 'sapAdqui... ', es decir deberás localizar dicha enumeración si existe, y sustituirla por lo que yo he puesto, si no existe una enumeración pero utiliza valores tu mismo podrás crear una enumeración... si tratas de usar la enumeración que yo he 'supuesto' salvo pura casualidad te saldrá un error de objeto no encontrado....  para simular esta enumeración puede utilizarse el siguiente código de ejemplo añadido al código de arriba, y activando y desactivando las líneas oportunas en la función de salvar_imagen... que in situ se comenta.

Código: Visual Basic
  1.  
  2. ' ejemplo para simular una posible enumeración de formatos... si se tiene el control debe usarse la enumeración correcta y los valores adecuados...
  3. Public Enum SapAcquisitionFormts
  4.     SAP_FORMAT_JPG = 0
  5.     SAP_FORMAT_BMP = 1
  6.     SAP_FORMAT_PNG = 2
  7.     SAP_FORMAT_GIF = 3
  8. End Enum
  9.  
  10.  

La función que trata la extensión del archivo deberá igualmente atenerse a las indicaciones que señalan en el párrafo anterior...

Adicionalmente podrías incluir el formato a la estructura de configuración....
Desconozco el significado de los últimos parámetros de la función (aunque supongo que podrían ser para otras opciones, como por ejemplo definir la calidad para guardar la imagen,etc...), que utlizas para salvar la imagen para cualquier duda al respecto tendrás que dirigirte a la documentación del propio control....

p.d.: el código está hecho 'al vuelo' por lo que es posible que haya algún pequeño error, si sucede así, y no lo descubres informa del error...

saludos.
«Ma non troppo»
----> ModoVacaciones = False<----

ijceba

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #2 en: Lunes 9 de Marzo de 2009, 16:53 »
0
Saludos tu progrma esta de lo mas completo te agrdesco tu tiempo y quisiera pedirte mas ayuda, me marca un error en esta liena:

Private Function Salvar_Imagen(ByVal Ruta As String, ByVal Nombre As String, ByRef UltimoIndex As Long, Optional Formato As SapAcquisitionFormts = SAP_FORMAT_JPG) As Boolean

y el error dice:

Error de compilacion:
No se ha definido el tipo definido por el usuario

y otra cosa unicamente tengo que agregar tres txt y un button vdd?...

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #3 en: Martes 10 de Marzo de 2009, 02:17 »
0
Cita de: "ijceba"
me marca un error en esta liena:
Private Function Salvar_Imagen(ByVal Ruta As String, ByVal Nombre As String, ByRef UltimoIndex As Long, Optional Formato As SapAcquisitionFormts = SAP_FORMAT_JPG) As Boolean

No se ha definido el tipo definido por el usuario
Eso no es un error es una 'ignorancia'... piensa.. yo no tengo el control ese 'sapAdquisition...' como no lo tengo ignoro cuales son los métodos y propiedades que pueda tener, haciendo uso de la lógica ayudado por un poco de imaginación, ASUMO que debe tener una enumeración que refleje los formatos. Pero esto, como digo, yo lo ignoro, porque eso es específico de ese control 'sapadquisition...' como comprenderás yo no voy a conocer al detalle los miles de controles que hay en el mercado de las cámaras de fotos, la enumeración de formatos debes buscarla tú en la documentación de ese control.

Yo he SIMULADO (lo puedo poner más grande, pero el problema supongo que no es de vista sino de comprensión) un probable nombre que podría tener la enumeración. dicho de otro modo: esta enumeración 'SapAcquisitionFormts' probablemente no exista pero la que exista debe ser bastante semejante y las contantes como:  'SAP_FORMAT_JPG' probablemente tampoco existan ni se correspondan con el valor que yo les dí. Un arquitecto conoce todos los elementos de un baño y sabe como funcionan, lo que no va a saber un arquitecto es como están distribuidos en tu casa ni de qué color o marca son, eso sólo lo sabes tú que eres quien tiene el control 'sapadquisition...loquesea'...

.. capische ???

Cita de: "ijceba"
y otra cosa unicamente tengo que agregar tres txt y un button vdd?...
Si no quieres hacer nada más, eso sería todo... sin embargo en vez de usar controles textbox, como te indicaba en  comentarios en el mensaje anterior sería más acorde usar un control Drive y un control DirListbox para proveer más cómodamente la ruta, para el nombre y el número si basta con un textbox... pero vamos eso va en el criterio de cada uno.
«Ma non troppo»
----> ModoVacaciones = False<----

ijceba

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #4 en: Martes 10 de Marzo de 2009, 18:33 »
0
Nebire te felicito por tu excelente aporte, ya resolvi mis dudas y con tu codigo de base hice las modificaciones para sacar el mio con las caracteristicas de mi contro, muchas gracias por ayudarme.

Ahora tengo otra inquietud que me gustaria ver si me puedes resolver, ahora no quiero que lo guarde como imagen1.*, imagen2.* sino imagen00001.*,
imagen00002.* etc...

Gracias por su tiempo

ijceba

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #5 en: Martes 10 de Marzo de 2009, 18:49 »
0
Listo quedo:

Numeracio = Formato (Variable, "000")

Gracias

ijceba

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #6 en: Martes 10 de Marzo de 2009, 19:34 »
0
Mejor si me puedes ayudar con lo que dijiste que era tarea mia pero no le  he encontrado como, me refiero a los textbox y reescribir el config.ini a placer de tal forma que pueda modificar la ruta de guardado, el nombre y el numero inicial a cualquier momento de uso del programa, ojala me puedas ayudar y muchas gracias

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Guardado Secuencial
« Respuesta #7 en: Miércoles 25 de Marzo de 2009, 05:33 »
0
Esto ya sería una tarea.
Te he proporcionado toda la base, sólo te falta 'decorar'...
Si no sabes como cambiar 4 textbox, entonces es mejor que tomes un manual y te apliques a la lectura.
«Ma non troppo»
----> ModoVacaciones = False<----