Como generar un .vcx para la clase PDFEvent???

420 views
Skip to first unread message

Miguel Ab

unread,
Feb 14, 2013, 12:19:36 PM2/14/13
to publice...@googlegroups.com
Hola.

Necesito crear un pdf de forma autónoma (sin intervención del usuario) ... para lo cual encontré el siguiente código que lo hace (encontrado en un foro de todoexpertos y que he traducido, estaba en francés).

--------------------------------------------
GenerarPDFAutomatico("C:\_prueba\prueba.frx", "prueba.pdf", "c:\_prueba")
?"FIN"


FUNCTION GenerarPDFAutomatico
    PARAMETERS informeGeneraPDF, nombrePDF, destinoPDF
   
    DECLARE Sleep IN WIN32API INTEGER
    ReadyState = 0 && Variable que indica que la impresora no está lista.
    PDFCreator = CREATEOBJECT("PDFCreator.clsPDFCreator")
    PDFReady = CREATEOBJECT("PDFEvent") && Ver la definición de la clase.
    EVENTHANDLER(PDFCreator,PDFReady)
   
    WITH PDFCreator
        * Iniciar proceso sin lanzar la impresión.
        .cStart ("/NoProcessingAtStartup")
       
        * Opciones de Respaldo
        .cOption("UseAutosave") = 1
        .cOption("UseAutosaveDirectory") = 1
        .cOption("AutosaveDirectory") = "&destinoPDF"
        .cOption("AutosaveFilename") = nombrePDF
        .cOption("AutosaveFormat") = 0 && 0 para formato PDF
       
        * Cambio temporal de la impresora predeterminada
        DefaultPrinter = .cDefaultprinter
        .cDefaultprinter = "PDFCreator"
        .cClearcache
    ENDWITH
   
    * Genera el informe.
    REPORT FORM &informeGeneraPDF TO PRINTER NOCONSOLE
   
    * Inicia el proceso de impresión.
    PDFCreator.cPrinterStop = .F.
   
    * Espera hasta que la impresión esté lista o 10 segundos han pasado 10 segundos.
    c = 0
    DO WHILE (ReadyState = 0) AND (c < 20)
        c = c + 1
        Sleep (500)
    ENDDO
   
    * Restaura la impresora por defecto.
    PDFCreator.cDefaultprinter = DefaultPrinter
   
    Sleep(200)
   
    * Limpieza y finalización
    PDFCreator.cClearcache
    PDFCreator.cClose
    RELEASE PDFCreator
    RELEASE PDFReady
ENDFUNC

* Definición de los eventos de manipulación de clase
DEFINE CLASS PDFEvent AS Custom
    IMPLEMENTS __clsPDFCreator IN "PDFCreator.clsPDFCreatorOptions"
   
    * Evento que indica si la impresora está preparada
    PROCEDURE __clsPDFCreator_eReady() AS VOID
        ReadyState = 1
    ENDPROC
   
    * Gestión de errores
    PROCEDURE __clsPDFCreator_eError() AS VOID
    ENDPROC
ENDDEFINE
--------------------------------------------

El problema es que tengo que meter el código en una librería (.vcx) por temas de la aplicación en la que se quiere poner y no se como meter el código de:
             IMPLEMENTS __clsPDFCreator IN "PDFCreator.clsPDFCreatorOptions"

¿Alguien sabe como generar una clase .vcx con esta línea de código?
Muchas gracias.
Saludos.

Guillermo MDQ

unread,
Feb 14, 2013, 12:40:04 PM2/14/13
to publice...@googlegroups.com
Miguel,si necesitas generar PDF de una manera sencilla podes utilizar la libreria Print2PDF de Victor Espina que funciona muy bien y es muy sencilla de utilizar y la llamas con solo una linea:

Print2PDF("archivo.pdf","mireporte.frx")

La podes bajar de aca, viene con ejemplos:
http://victorespina.com.ve/hs/files/vfp/dwn/ps2pdf.rar

Saludos
Guillermo

extremo

unread,
Feb 14, 2013, 12:43:36 PM2/14/13
to publice...@googlegroups.com
Investigare un poco al respecto, pero te adelanto que no es totalmente autonomo ya que necesita que el usuario instale el software PDFCreator. si no lo tiene no podra imprimir a pdf.

Tal vez se logre si se conociera las librerrias que usa el pdfCreator para generar el pdf y luego no instalar el software sino grabar solo las librerias necesarias en los pc. Eso seria muy util.

Bendiciones


El jueves, 14 de febrero de 2013 14:19:36 UTC-3, Miguel Ab escribió:

Irwin Rodriguez

unread,
Feb 14, 2013, 1:07:04 PM2/14/13
to publice...@googlegroups.com
Para crear una clase ve al menu File-New y seleccionas Class en la ventana de nuevos archivos, pulsa el botón New File para que te aparezca la ventana de nueva clase (New Class)

2. Agrega un nombre en Class Name (PDFCreator)
3. Coloca Collection en Based On:
4. Pulsa el botón de Explorar (...), en (Store in) y selecciona la carpeta donde se va a alojar el archivo VCX y agregale un nombre.
5. Adjunta la clase creada a tu proyecto
6. Despliega la clase y abre "PDFCreator" (Objeto Collection) para que lo modifiques
7. Crea el metodo "clsPDFCreator" en el menu Class-New Method
8. Ubica el nuevo metodo y agregale las líneas que deseas.

Repite los pasos 7 y 8 para agregar los metodos restantes.

Espero te sirva.
Saludos.!
--
Ing. Irwin Rodríguez
Consultor Informático
0412-521.06.79
 

Antes de imprimir este documento piense bien si es necesario hacerlo, el árbol que servirá para hacer el papel tardará 7 años en crecer. 

 
NOTA: La información mostrada en este mensaje es de caracter Confidencial y está dirigida unicamente a los contactos señalados en el encabezado; si el lector de este correo no es el destinatario del mismo, se le notifica que cualquier copia o distribución queda totalmente prohibida. Si usted ha recibido este mensaje por error, por favor notifique inmediatamente al remitente por este mismo medio y bórrelo de su sistema.

Miguel Ab

unread,
Feb 15, 2013, 3:16:39 AM2/15/13
to publice...@googlegroups.com
Hola.

He encontrado un enlace que aclara algo la cuestión (y no muy favorablemente):

http://www.portalfox.com/index.php?name=News&file=article&sid=1084&mode=nested&order=0&thold=0

En párrafo que interesa es este:

Esto presenta problemas en Visual FoxPro, porque no soporta múltiples herencias, la cual es requerida para hacerla de esta vía. Una nueva característica que fue introducida en Visual FoxPro 7.0 es la palabra IMPLEMENTS que permite una clase Visual FoxPro, definida en código utilizando el comando DEFINE CLASS, para heredar una interfaz que está definida en un tipo de biblioteca. Sin embargo, debido a que depende del tipo de biblioteca puede ser utilizada solamente con objetos COM, y no con clases nativas de Visual FoxPro, tales que es no realmente mucha ayuda en este concepto.

Si esto no se solucionó en las versiones posteriores ... pues resulta que no se puede.

Saludos.

Miguel Ab

unread,
Feb 15, 2013, 3:23:38 AM2/15/13
to publice...@googlegroups.com
Muchas gracias por las respuestas.

El instalara el PDFCREATOR no es problema, se instala en todos los ordenadores que van a ejecutar la aplicación. Por lo que va de "serie" en todos los ordenadores que se ponen nuevos o se reinstalan.

Comentaré el empleo de la clase que comenta Guillermo MDQ pero me temo que no será factible.

Y es una pena, porque el código anterior va muy bien desde un .prg y la aplicación no admite fácilmente el recompilado (además que lleva mucho tiempo sin hacerse y abría que aplicar muchos cambios a mano, ... no se yo soy cuasi un recién llegado a VFP y la verdad que en ciertos puntos me pierdo).

Si encuentro algo, os lo hago saber (y si tenéis alguna idea será bien recibida).

Reitero las gracias.
Saludos.

FidelJ

unread,
Feb 15, 2013, 6:11:47 AM2/15/13
to publice...@googlegroups.com
Días atrás pasaron este código en la comunidad. No tuve tiempo de ensayar.


* El Código no es mío pero lo tengo implementado
* Enviado por Richard Gaviria 
* En tu botón "Generar PDF" colocas lo siguiente:
 
MiReporte="hojavida5.frx"
RutaParaGuardaro="C:\Reportes\"
NombrePDF_Como_quedara="Nombre_del_Reporte"
=GeneraPDF(MiReporte,RutaParaGuardaro,NombrePDF_Como_quedara)
 
Procedure GeneraPDF
Lparameters cNameReport, cNameDirTarget, cNameFilePdf
Local oPdf As Object
oPdf= Createobject("PDFCreator.clsPDFCreator")
With oPdf
.cStart
.cVisible = .T.
.cclearCache
.cPrinterStop = .T.
.cOption("AutosaveDirectory") = cNameDirTarget
.cOption("AutosaveFilename")= cNameFilePdf
.cOption("UseAutosave")= 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveFormat") = 0
.cOption("PDFUseSecurity") = 1
.cOption("PDFHighEncryption") = 1
.cOption("PDFOwnerPass") = 0
.cOption("PDFOwnerPasswordString") = "tu_contraseña"
.cPrinterStop = .F.
.cSaveOptions()
Set Printer To Name 'PDFCreator'
 
Report Form (cNameReport) To Printer Nodialog Noconsole
ENDWITH
ENDPROC

 
 

El jueves, 14 de febrero de 2013 14:19:36 UTC-3, Miguel Ab escribió:

Miguel Ab

unread,
Feb 15, 2013, 10:24:40 AM2/15/13
to publice...@googlegroups.com
Hola FidelJ.

El problema del código que comentas (el que he probado es el que comento arriba quitando la clase) es que no puedes ver cuando ha terminado de generar el PDF.

PERO se me ha ocurrido una chapuzilla para solucinar este problema. La voy a probar y ahora os cuento.

Saludos.

Miguel Ab

unread,
Feb 15, 2013, 11:05:07 AM2/15/13
to publice...@googlegroups.com

Hola de nuevo.

Me falta probarlo más a fondo (pero hoy lo tengo complicado), pero las primeras pruebas parece que funcionan.

La chapuza:


    * Inicia el proceso de impresión.
    PDFCreator.cPrinterStop = .F.
   
    LOCAL forg AS String, fdes AS String, fin AS Logical, c AS Integer
    forg = destinoPDF+"\"+nombrePDF
    fdes = forg+"_"
    fin = .F.
    c = 0
    * Espera hasta que crea lo cree o pasen 10 segundos.
    DO WHILE !fin AND c<20
        TRY
            RENAME (forg) TO (fdes)
            fin = .T.
        CATCH
            Sleep(500)
        ENDTRY

        c = c + 1
    ENDDO
   
    IF fin
        RENAME (fdes) TO (forg)
    ENDIF

Saludos.
Buen fin de semana.

HernanCano

unread,
Feb 17, 2013, 12:37:34 PM2/17/13
to publice...@googlegroups.com

Me parece que ésto es una vuelta muy larga y de cierto modo peligrosa (¿y si a los diez segundos no ha terminado? ¿y si la ubicación es inaccesible? ¿y si el archivo de destino ya existe? ¿y si el archivo de origen ya existe?)

HernanCano

unread,
Feb 17, 2013, 12:40:59 PM2/17/13
to publice...@googlegroups.com

1.
Copiar FoxyPreviewer.app al dir de tu app (sólo copiar, ¿te parece difícil?).

2.
En tu prg cuando vas a generar el PDF haces:
(( ObjType 10 significa PDF ))

DO FoxyPreviewer.App
REPORT FORM MiReporte.frx OBJECT TYPE 10 TO FILE "c:\TestReport.Pdf" PREVIEW

3.
Yo no me inventé ésto. Lo desarrolló Cesar Chalom y lo puso para toda la comunidad ((¿se entiende "todo el mundo" o no?))
Me parece muy fácil, extremadamente fácil.

4.
Conozco PDFCreator y lo uso y me gusta y lo recomiendo, pero para los efectos que deseas es mucho más fácil FoxyPreviewer.

Miguel Ab

unread,
Feb 18, 2013, 2:47:05 AM2/18/13
to publice...@googlegroups.com
Hola HernanCano.

Si todo eso puede pasar y más, y eso que buena parte de las que comentas ya están muy controladas. Por eso no dejar de ser una chapuza (y aún no he realizado pruebas con informes complejos).

Probaré lo que indicas, pero instalar cosas es una tarea muy compleja por factores externos a los temas informáticos ...

Muchas gracias.
Saludos.

HernanCano

unread,
Feb 18, 2013, 10:41:49 AM2/18/13
to publice...@googlegroups.com

>>> ... pero instalar cosas es una tarea muy compleja...

Sí, Miguel, tienes toda la razón sobre instalaciones (yo descarto muchas cosas como treeviews por los ActiveX).

Pero dime:
en FoxyPreviewer: ¿qué tan difícil es su instalación si se basa en sólo copiar FoxyPreviewer.app en el mismo dir de tu app? ¿y si, para involucrarlo dentro de tu app, sólo basta un "do FoxyPreviewer.app"?

Miguel Ab

unread,
Feb 19, 2013, 12:39:11 PM2/19/13
to publice...@googlegroups.com
Hola.

Si tienes toda la razón, pero el problema es que es un problema que podemos llamar político. Y todo lo que ello conlleva.

Saludos.

Reply all
Reply to author
Forward
0 new messages