none
Dejar imprimiendo y volver a la aplicación RRS feed

  • Pregunta

  • Hola

    Tengo una aplicación en VB 6.0 que envía a impresora unas 1000 páginas por medio del objeto Printer. La rutina de impresión está dentro de un módulo BAS, y es invocada desde un formulario. Me piden que libere la aplicación mientras se imprimen los documentos para que el usuario pueda continuar su trabajo. Que sugerencias me pueden dar?

    Se me ocurre en el mismo EXE pasarle via comandos (proyecto.exe param1...paramN) unos valores para cargar otra instancia de la App que se encargue únicamente de realizar la impresión de los documentos.

    Pensé en crear una DLL u OCX pero la rutina puede cambiar con el tiempo y la reinstalación de estos componentes no me agrada.

    No sé si el método DoEvents sirve en este caso.

    Espero sus comentarios.

    Saludos

    MV

    martes, 18 de mayo de 2010 16:54

Todas las respuestas

  • Tenes que poner el doevents en la rutina por cada cosa que hagas,yo preferirira llamar a otra instancia de algo que haga la impresion.
    martes, 18 de mayo de 2010 19:33
  • Olvídate del doevents... eso vale para 'cosillas de andar por casa' no para imprimir 1000 folios.

    Tienes que usar un timer, para hacer la tarea de mod asíncrono...

    Lo mejor es que esa parte la desvíes a un formulario sólo para eso...

    La tarea la guardas en una colección que está declarada en un módulo (bas) y que por tanto queda compartido y disponible desde ambos formularios... se describe un poco más adelante...

     

    En el form que se encarga impimir :

    funcion EncolarTarea(Datos...)
     dim Tarea as DatosTarea ' una estructura...
     Tarea = AsignarDatos(datos...)
     colColaTareasImpresion.Add(Tarea)
     if frmImpresion.Timer1.enabled=false then ' aquí activamos el timer si estuviera desactivado, para que recoja esta tarea.
      FrmImpresion.timer1.Enabled = true
     end if
    fin funcion

    Tarea es una estructura que contiene los datos necesarios para que cuando se lea la tarea, pueda saberse que se debe hacer si hay algo conreto que se precisa saber.

    empezamos creando un módulop, el código sería más o menos éste....

    Option private module
    
    ' esto en el módulo, ya que lo necesitan ambos formularios
    Public type DatosTarea
     ' los campos del tipo que se precise
    end type
    
    ' esta colección es una cola, el formulario principal añade tareas alfinal de la colección y el formulario encargado de imprimir toma las tareas desde el principio y las elimina de la colección y las imprime ...
    public colColaTareasImpresion as new collection
    
    ' en el promulario que manda imprimir NO en el módulo: FRIEND function AsignarDatos(datos...) as DatosTarea dim dt as datostarea dt.campox = dato1 dt.campo2 = dato2 '...... AsignarDatos= dt end function ' OJO: esta función tiene que se rdeclarada friend, para poder devolver una estructura.

    finalmente en el formulario de inmpresión en el evento del timer

    
    private dt as DatosTarea
    private dtVar as variant 
    
    Private Sub Timer1_Timer()
      timer1.enabled = false
      set dtVar = colColaTareasImpresion.item(1)
      dt= dtvar
     set colColaTareasImpresion.remove(1)
       
     call ImprimirTarea(dt) ' no hay tareas pendientes
    End Sub
    
    private function ImprimirTarea(Tarea as DatosTarea)
     ...imprime la tarea, tarea.campo1, tarea.campo2 etc..
     'contienen los datos que se pudiera necesitar para saber qué y cómo proceder
     
     ' si hay tareas pendientes se activa de nuevo el timer para recoger la siguiente tarea
     if colColaTareasImpresion.Count >0 then 
      timer1.enabled = true
     end if
    fin función
    Bueno espero que te haya quedado más o menos claro...
    • Editado NEBIRE miércoles, 26 de mayo de 2010 18:27 se ha montado el código en una única línea que hace oscuro de leer
    miércoles, 26 de mayo de 2010 18:23
  • Hola NEBIRE

    ¿En la colección "colColaTareasImpresion" se van a cargar, por ejemplo, la primary key que identifica a cada documento?

    ¿Si mis documentos son facturas, en dicha colección va el ID de cada factura, de forma tal que en el proceso de impresión se imprima cada factura una a una?

    ¿O en dicha colección le envío los parámetros que me permiten seleccionar los 1000 registros de una vez en mi rutina de impresión?

    Muchas gracias por tu respuesta, está bien interesante el modelo. Espero por tu respuesta a estas últimas dudas.

    Saludos
    miércoles, 26 de mayo de 2010 20:18
  • Lo que quieras... es una tarea, puedes meter los datos de todo el lote que se precisa en un momento dado o puedes meter caso a caso, eso como prefieras (pero tiene que ser coherente, una cosa o la otra salvo que en ambos casos los mismos campos tengan idéntico significado), lo que importa es que de este modo trabaja asíncrono.

    El trabajo se deja en una cola de tareas y el timer entrega el la tarea que toma en ese momento a la función que lo imprime, cuando esa función termina esa tarea verifica si hay más tareas enla colección y si es así, activa el timer para tomar la siguiente tarea, si no hay más tareas en la colección  es el formulario que realiza el encargo quien tras depositar trabajo en la cola activa el timer.

    En la estructura tendrás que hacer unos campos  que sean acorde al  modelo que elijas para que una vez enla función estén disponibles las variables que determinan como se ha de llevar a cabo la tarea.... esos son detalles particulares de cada aplicación... pero no  deberías tener problemas de entenderlo.

    Al timer dale un valor de intérvalo tal como 100 milisegundos y en diseño enabled = false.
    • Editado NEBIRE miércoles, 26 de mayo de 2010 20:51 añado una aclaración última...
    miércoles, 26 de mayo de 2010 20:49