Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Crear Pdf con pulsar un botón (https://www.clubdelphi.com/foros/showthread.php?t=77859)

Cabanyaler 09-03-2012 11:29:57

Ya lo tengo y ahora si que está todo completo.
Después de la instrucción de la función:
Código Delphi [-]
// Cerramos el monitor
      PdfCreator.cClose;
Se debe hacer la llamada a la función con esta sintaxis:
Código Delphi [-]
KillTask('PDFCreator.exe')

Y a continuación escribo la función:

Código Delphi [-]
uses
  Tlhelp32;

(...)

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Esta función KillTask (me encanta el nombre :D), sirve para la eliminación de cualquier proceso que se esté ejecutando en el sistema, si sabes que exe lo lanza.

roman 10-03-2012 02:28:04

En mi opinión, esto no es algo bueno para hacer; digamos que no es "educado". La impresora virtual puede estar siendo usada por otros procesos y tú simple y llanamente la matas junto con todo lo que estuviera haciendo. A decir verdad, es lo mismo que estaba haciendo yo :o.

No sé bien porqué no te funciona imprimir un documento después de otro pues no observé errores. Sin embargo, he puesto en el FTP un ejemplo algo más currado, como dicen por allá en España.

Se trata del componente TPDFCreator que tiene un sólo método (CreateFile) para generar el archivo y un sólo evento (OnPrint) en donde pones el código con el que produzcas la impresión. De esta manera, puedes reusarlo para diversas impresiones.

Junto con el componente, viene una demo en la que podrás ver, además, como poner a tu documento propiedades como autor, título y tema, así como protegerlo con contraseña.

El archivo incluye un paquete (ClubDelphi.dpk) listo para instalar el componente.

Pd: Se me olvidaba comentar que el componente se fija si la impresora ya está trabajando y, en tal caso, no intenta cerrarla.

// Saludos

Cabanyaler 12-03-2012 18:19:17

Magnifico Román.
He utilizado tu componente y funciona perfecto, simplificando aún más el código.

Nota:
Cuando realizamos la asignación de la impresora como impresora determinada de Windows con la instrucción:
Código Delphi [-]
Printer.PrinterIndex := PrinterIndex;
Debemos del mismo modo asignarla al Quikreport (si es el caso), con la siguiente instrucción
Código Delphi [-]
NombreQuickReport.PrinterSettings.PrinterIndex := PrinterIndex;

Espero esto sirva a tanta gente como neuronas he quemado estos últimos días. :rolleyes:


La franja horaria es GMT +2. Ahora son las 05:04:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi