Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-01-2009
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 14-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 14-01-2009
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 20-01-2009
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
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?
Responder Con Cita
  #5  
Antiguo 21-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 22-01-2009
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ShellExecute jorodgar Varios 8 07-05-2007 14:46:15
Al imprimir docs.word con shellexecute..... Javier_A OOP 4 18-01-2006 17:59:22
shellexecute. REHome API de Windows 2 26-09-2005 12:23:25
Imprimir con ShellExecute neon API de Windows 2 12-05-2005 09:19:45
ShellExecute arantzal Varios 0 04-05-2005 12:31:03


La franja horaria es GMT +2. Ahora son las 18:48:27.


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
Copyright 1996-2007 Club Delphi