Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Imprimir con ShellExecute (https://www.clubdelphi.com/foros/showthread.php?t=62779)

bbjb 14-01-2009 10:33:04

Imprimir con ShellExecute
 
Hola a tod@s,

Estoy utilizando el comando ShellExecute para imprimir documentos desde Delphi y hasta ahora no he tenido ningún problema, hasta que me encontrado con la siguiente situación:

Tengo que imprimir un documento cuyo nombre completo no conozco pero si el inicio del mismo, ejemplo:
Nombre del documento: 001_01_documento_nuevo.pdf
Y yo tengo la siguiente cadena: 001_01_*.pdf

Si envio este nombre como parametro al comando ShellExecute no imprime nada ya que busca un fichero con el nombre literal que le estoy pasando, es decir, 001_01_*.pdf.

¿Existe alguna manera de imprimir teniendo del nombre del fichero tal y como yo lo tengo??

Un saludo y gracias

Neftali [Germán.Estévez] 14-01-2009 12:45:21

Deberás realizar un "proproceso" para obtener el nombre completo de uno o varios documentos que puedan existir que cumpan esa especificación o máscara y luego una vez que tengas el nombre (o nombres) completo lanzas la impresión de la misma manera que hasta ahora.

Si conoces el directorio donde debe estar el fichero, con este procedimiento que hay en la sección de trucos del club.

Si haces una llamada del estilo a esta, debería funcionar:
Código Delphi [-]
var
  lista: TStrings;
  i:Integer;
begin
  lista := TStringList.Create;
  BuscarArchivos('C:\Listados', '001_01_*.pdf', faAnyFile, lista);

  // recorrer la lista
  for i := 0 to (lista.count - 1) do begin
    // para cada uno imprimir con SHELLEXECUTE
    // fileName == lista[i]
    ...
  end;

  // liberar
  lista.Free;

bbjb 14-01-2009 12:54:59

Ok, una vez más vuelves a sacarme del atolladero.

Voy a probar la opción que me dices,

De nuevo gracias por tus sabios consejos.

un saludo

bbjb 20-01-2009 18:09:52

Una cosa más;

Como mando imprimir varios documentos, la cola de impresión de windows los desordena y el resultado no es el esperado, por tanto, me planteo no imprimr el siguiente documento hasta que no me asegure que ha terminado con el actual.
El problema es que no se como detectar que ha terminado de imprimir el documento para poder lanzar el siguiente, ¿se os ocurre alguna manera?

Neftali [Germán.Estévez] 21-01-2009 10:22:18

Revisa estos dos procedimientos; Los encontré hace tiempo en Internet, porque necesitaba algo similar a lo tuyo. Conultar la cola de Jobs de la impresora, para saber cuando estaba libre.

Un saludo.

Código Delphi [-]
procedure TForm1._GetPagesLastJob(var TotalPages:Integer; var CurrentPage:Integer);
type
  TJobs = Array [0..1000] of JOB_INFO_1;
  PJobs = ^TJobs;
var
  hPrinter : THandle;
  bytesNeeded, numJobs, i: Cardinal;
  pJ: PJobs;
begin

  TotalPages := 0;
  CurrentPage := 0;

  hPrinter:= _GetCurrentPrinterHandle;

  try

    EnumJobs( hPrinter, 0, 1000, 1, Nil, 0, bytesNeeded,
              numJobs );
    pJ := AllocMem( bytesNeeded );

    If not EnumJobs( hPrinter, 0, 1000, 1, pJ, bytesNeeded,
                     bytesNeeded, numJobs ) Then begin
      RaiseLastWin32Error;
    end;

    // No ghay trabajos en cola?
    if (numJobs = 0) Then begin
      Exit;
    end
    else begin
      i:= Pred(numJobs);
      TotalPages := pJ^[i].TotalPages;
      CurrentPage := pJ^[i].Position;
    end; // if

  finally
    ClosePrinter( hPrinter );
  end;

end;


function TForm1._GetCurrentPrinterHandle: THandle;
var
  Device, Driver, Port : array[0..255] of char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not OpenPrinter(@Device, Result, nil) then
    RaiseLastWin32Error;
end;


function TForm1._EnumJobs():Integer;
type
  TJobs = Array [0..1000] of JOB_INFO_1;
  PJobs = ^TJobs;
var
  hPrinter : THandle;
  bytesNeeded, numJobs, i: Cardinal;
  pJ: PJobs;
  Cont:Integer;
begin

  Cont := 0;
  hPrinter:= _GetCurrentPrinterHandle;

  try
    EnumJobs( hPrinter, 0, 1000, 1, Nil, 0, bytesNeeded,
              numJobs );
    pJ := AllocMem( bytesNeeded );

    If not EnumJobs( hPrinter, 0, 1000, 1, pJ, bytesNeeded,
                     bytesNeeded, numJobs ) Then begin
      RaiseLastWin32Error;
    end;

    // No hay trabajos en cola?
    if numJobs = 0 Then
      // Nada
    else begin

      // Para todos los trabajos
      For i:= 0 to Pred(numJobs) Do begin
        Cont := Cont + 1;
      end; // for
    end; // if

  finally

    Result := Cont;
    ClosePrinter( hPrinter );
  end;

end;

bbjb 22-01-2009 08:58:50

He estado probando y el documento contiene imagenes que hace necesario un tiempo para que aparezca en la cola de impresión y pueda detectarlo el proceso.

Voy a ver si encuentro algo por la red y de valerme lo comparto por si pudiera interesar.

Gracias de nuevo, Neftali


La franja horaria es GMT +2. Ahora son las 21:53:24.

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