Ir al contenido


Foto

Problema al cambiar de impresora en delphi


  • Por favor identifícate para responder
13 respuestas en este tema

#1 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 29 febrero 2012 - 07:51

Tengo el siguiente problema y no se por donde tirar:

Resulta que cierta impresora (kyocera) que admite elegir la bandeja de papel, cuando por programa vas y cambias de impresora del sistema (para poder imprimir un excel y me genere un PDF) pues al volver luego a la kyocera te llega (en delphi) con la "bandeja por defecto" en lugar de la 3, que es la que tiene en las propiedades del windows.

Más en detalle: Kyocera con la bandeja 3 es mi impresora por defecto de windows, entro al programa y efectivamente es la impresora por defecto de mi aplicación, y si pido ver sus propiedades, la bandeja es la correcta, la 3. Hasta aquí 100% perfecto.

Ahora, le digo al programa que me convierta un documento de Excel a PDF, lo cual implica que, por código, he de cambiar de impresora tanto de delphi como de windows (según sea el documento que imprimo interno de delphi o externo, necesito una de las dos cosas), imprimir, y finalmente volver a la que tenía antes.

Al volver a elegir la kyocera (tanto como por defecto de windows como en delphi), resulta que en window sigue usando la bandeja 3, pero en la "printer" de delphi, si imprimes o si miras sus propiedades, la bandeja ahora es "por defecto", es decir, la 1.

Supongo que el problema está en el código que uso para cambiar de impresora del sistema, no recuerdo de donde copie ese código, pero es este:



delphi
  1. var
  2.   szPrinterName, szIniInfo, szSection: PChar;
  3. begin
  4.       GetMem(szPrinterName,SizeOf(Char) * 256); //allocate memory
  5.       GetMem(szIniInfo,SizeOf(Char) * 256);
  6.       GetMem(szSection,10) ;
  7.       StrPCopy(szPrinterName, Printer.Printers[PosImpresora]);
  8.       //Fijo impresora por defecto en windows
  9.       GetProfileString('DEVICES', szPrinterName, nil, szIniInfo, 254) ;    {locate device info in win.ini}
  10.       if szIniInfo^ <> #0 then begin                                      {if device found, then..}
  11.         StrCat(szPrinterName,',') ;                                        {prepare new device line}
  12.         StrCat(szPrinterName,szIniInfo) ;
  13.         WriteProfileString('Windows','DEVICE',szPrinterName) ;            {update ini file}
  14.         StrCopy(szSection,'Windows') ;
  15.         PostMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(szSection)) ; {notify all apps - ini has changed}
  16.       end;
  17.       //Libero recursos...
  18.       FreeMem(szPrinterName,SizeOf(Char) * 256) ;                          {release memory}
  19.       FreeMem(szIniInfo,SizeOf(Char) * 256) ;
  20.       FreeMem(szSection,10) ;
  21. end;



Uso delphi 7, por cierto.

¿Hay alguna otra forma de cambiar la impresora del sistema más fiable o correcta que esta?

Gracias de antemano a los sabios del lugar!
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 29 febrero 2012 - 08:00

Otro dato curioso: En las mismas condiciones, si antes de cambiar la impresora del sistema cambio la impresora de delphi llamando al dialogo, y elijo la PDF, ahora al convertir a PDF no toco la impresora de delphi, solo la de windows, y en ese caso, la bandeja no cambia.

Supongo que esto lía más el tema que otra cosa, pero ocurre así, y quizás sea la combinación de cambiar impresora del sistema más la impresora de delphi lo que genera el problema.

Quizás la solución sea cambiar siempre una de las dos solamente, la de delphi o la de windows, peor si alguien sabe algo al respecto preferiría no hacer más pruebas "a ciegas", llevo ya unas cuantas, la verdad. 
  • 0

#3 qtdpd

qtdpd

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 09 mayo 2012 - 10:43

Hola.

A ver si te vale este código que uso yo para fijar la impresora por defecto, etc.

Necesitas:
1 Combobox
1 PrintSetupDialog
2 Buttons



delphi
  1. unit impresoras;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, Buttons, Printers, ExtCtrls;
  8.  
  9. type
  10.   Tconf_impr = class(TForm)
  11.     Label1: TLabel;
  12.     ComboBox1: TComboBox;
  13.     predeterminada: TBitBtn;
  14.     configuracion: TBitBtn;
  15.     cerrar: TBitBtn;
  16.     PrinterSetupDialog1: TPrinterSetupDialog;
  17.     Bevel1: TBevel;
  18.     Label2: TLabel;
  19.     procedure configuracionClick(Sender: TObject);
  20.     procedure FormActivate(Sender: TObject);
  21.     procedure predeterminadaClick(Sender: TObject);
  22.     procedure FormCreate(Sender: TObject);
  23.   private
  24.     { Private declarations }
  25.   public
  26.     { Public declarations }
  27.   end;
  28.  
  29. var
  30.   conf_impr: Tconf_impr;
  31.  
  32. implementation
  33.  
  34. {$R *.DFM}
  35.  
  36. // Impresora por defecto actual
  37. function GetDefaultPrinter: string;
  38. var
  39.   ResStr : array[0..255] of Char;
  40. begin
  41.   GetProfileString('Windows', 'device', '', ResStr, 255);
  42.   Result := StrPas(ResStr);
  43. end;
  44.  
  45. // procedure para fijar impresora por defecto
  46. procedure SetDefaultPrinter(NewDefPrinter: string);
  47. var
  48.   ResStr            : array[0..255] of Char;
  49. begin
  50.   StrPCopy(ResStr, NewdefPrinter);
  51.   WriteProfileString('windows', 'device', ResStr);
  52.   StrCopy(ResStr, 'windows');
  53.   SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@ResStr));
  54. end;
  55.  
  56. procedure Tconf_impr.configuracionClick(Sender: TObject);
  57. begin
  58.   PrinterSetupDialog1.Execute;
  59. end;
  60.  
  61. procedure Tconf_impr.FormActivate(Sender: TObject);
  62. begin
  63.   // Lista de impresoras disponibles en el combobox
  64.   Combobox1.Items.Clear;
  65.   Combobox1.Items.AddStrings(Printer.Printers);
  66. end;
  67.  
  68. procedure Tconf_impr.predeterminadaClick(Sender: TObject);
  69. begin
  70.   // Fijar impresora predeterminada
  71.   if Combobox1.Text <> '' then
  72.   begin
  73.     SetDefaultPrinter(ComboBox1.Text);
  74.     label2.Caption := Format('Impresora predeterminada: %s', [GetDefaultPrinter]);
  75.   end
  76.   else ShowMessage('Elije primero una impresora !');
  77. end;
  78.  
  79. procedure Tconf_impr.FormCreate(Sender: TObject);
  80. begin
  81.   label2.Caption := Format('Impresora predeterminada: %s', [GetDefaultPrinter]);
  82. end;
  83.  
  84. end.



Saludos.



  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 10 mayo 2012 - 06:48

Tu código para fijar la impresora por defecto en windows es identico al mio, se llaman a las mismas funciones de las API con los mismos parámetros, pero eso ya me funciona perfectamente.

Mi problema es como queda la printer de delphi tras todo este follón: Inicialmente partia con la kyocera, bandeja 3, "clonada" de la impresora por defecto de windows, pero si cambio esa printer a otra y luego la redefino de nuevo como la kyocera, termino con la bandeja 1 en lugar de la 3. Este paso de volver aponer en printer lo que tenía al iniciar la aplicación es lo que falla.

Es como si al iniciarse delphi se leyese la impresora por defecto de windows bien, pero al volver a querer poner esa misma impresora de nuevo como impresora elegida en delphi por código (SIN mostrar el dialogo de elegir impresora, si lo haces así no problem) algo se quedase mal, se pierde la bandeja elegida en windows.
  • 0

#5 Pratasvenska

Pratasvenska

    Member

  • Miembros
  • PipPip
  • 38 mensajes
  • LocationSuecia

Escrito 23 febrero 2015 - 04:11

Buenas,

Descubrí éste hilo con una búsqueda y me ha sido múy útil. Aunque me encuentro con un problema: Si ejecuto mi programa de forma local, funciona perfecto, ya que el combobox me enlista todas las impresoras locales y de red. Pero si ejecuto mi programa en un servidor, no me muestra las impresoras locales. Es posible modificar el código para poder seleccionarlas también?

Saludos.
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 23 febrero 2015 - 08:19

Buenas,

Descubrí éste hilo con una búsqueda y me ha sido múy útil. Aunque me encuentro con un problema: Si ejecuto mi programa de forma local, funciona perfecto, ya que el combobox me enlista todas las impresoras locales y de red. Pero si ejecuto mi programa en un servidor, no me muestra las impresoras locales. Es posible modificar el código para poder seleccionarlas también?

Saludos.


Si te refieres a una aplicacion a la que accedes por un terminal server, puedes usar las impresoras locales si antes de conectar, en las propiedades de la conexion, activas el uso de impresoras (o discos) locales.
  • 0

#7 Pratasvenska

Pratasvenska

    Member

  • Miembros
  • PipPip
  • 38 mensajes
  • LocationSuecia

Escrito 23 febrero 2015 - 09:06


Buenas,

Descubrí éste hilo con una búsqueda y me ha sido múy útil. Aunque me encuentro con un problema: Si ejecuto mi programa de forma local, funciona perfecto, ya que el combobox me enlista todas las impresoras locales y de red. Pero si ejecuto mi programa en un servidor, no me muestra las impresoras locales. Es posible modificar el código para poder seleccionarlas también?

Saludos.


Si te refieres a una aplicacion a la que accedes por un terminal server, puedes usar las impresoras locales si antes de conectar, en las propiedades de la conexion, activas el uso de impresoras (o discos) locales.


Gracias por tu respuesta, debí aclarar un poco mejor la situación. Estoy trabajando con una aplicación web desarrollada en Delphi XE5 + Intraweb 14, al ejecutar de forma local todo funciona bien, pero al instalar la aplicación como un servicio y accesarla via la red, entonces (lógicamente) el combobox del ejemplo anterior sólo muestra las impresoras instaladas en el servidor donde está también instalada la app.

Aunque creo que está sería una solución alternativa, un workaround para el problema que realmente tengo, no sé si deba abrir otro hilo? Bueno, aquí va: Tengo una impresora de etiquetas marca Brother, y en la app que les menciono es necesario enviar impresiones a dicha impresora. Todo funciona perfecto cuando está seleccionada como impresora predeterminada. Pero cuando ésta cambia a una impresora común y corriente, entonces Internet explorer (y también Chrome) no entienden que el tamaño y orientación deben venir de la impresora que selecciono para esa impresión en concreto y trata de imprimir en A4 y con orientación portrait.

Trataré de ilustrarlo un poco mejor:

Impresora de etiquetas (Brother QL-720NW) predeterminada
Impresora HP 4250
Resultado : OK, tamaño 10x6 cm, landscape

Impresora de etiquetas (Brother QL-720NW)
Impresora HP 4250 predeterminada
Resultado : Error! Se envían tamaño A4 (portrait) a las etiquetas

Claro que se puede cambiar los ajustes manualmente cada vez que se imprima, pero esto sería indeseable para el cliente.
Creo que es un problema se tiene en general con las impresoras de etiquetas? aqui se describe una situación muy similar:
http://www.experts-e...Q_28297417.html En inglés, y hasta el momento sin solución concreta.

Alguna sugerencia?
Gracias por leer tanto rollo! Un saludo

Edito: Éste puede ser un problema de windows en general? o será que algo está mal con mi computadora. Porque si tengo la impresora de etiquetas como predeterminada y después envio una impresión desde notepad a una impresora normal, el tamaño y orientación también están mal, vienen de la predeterminada (de la de etiquetas)
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 09:42

Éste puede ser un problema de windows en general? o será que algo está mal con mi computadora. Porque si tengo la impresora de etiquetas como predeterminada y después envio una impresión desde notepad a una impresora normal, el tamaño y orientación también están mal, vienen de la predeterminada (de la de etiquetas)


Alguna vez afronté una situación parecida que casi me enloquece, después de probar mil cosas resultó que el problema estaba en la impresora HP, cambié de impresora y ya no hubo más problemas, así que no pierdes nada probando con otra impresora.

Un cordial saludo.
  • 0

#9 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 23 febrero 2015 - 12:25

¿Intentaste hacerlo por medio de la interfaz que provee la VCL?
Me refiero a la biblioteca Printers de la VCL.

No se me ocurre otra cosa.  :sad:

Saludos
(b)
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 febrero 2015 - 03:00

¿Intentaste hacerlo por medio de la interfaz que provee la VCL?
Me refiero a la biblioteca Printers de la VCL.

No se me ocurre otra cosa.  :sad:

Saludos
(b)


Iba a hacer la misma pregunta. Pruébalo y ya nos dirás Sergio.



delphi
  1.     Printer.PrinterIndex := -1;



Si no funciona como debería, lo único que se me ocurre para parchear el problema es que antes de cambiar a la impresora PDF te guardes en unas variables todos los datos de la impresora predeterminada, para después poder restaurarlos manualmente (es decir, que además de volver a seleccionar la impresora predeterminada, también asignes de nuevo la bandeja por defecto).

http://www.scalabium...faq/dct0019.htm
http://www.scalabium...faq/dct0020.htm

Saludos.
  • 0

#11 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 febrero 2015 - 04:41


¿Intentaste hacerlo por medio de la interfaz que provee la VCL?
Me refiero a la biblioteca Printers de la VCL.

No se me ocurre otra cosa.  :sad:

Saludos
(b)


Iba a hacer la misma pregunta. Pruébalo y ya nos dirás Sergio.



delphi
  1.     Printer.PrinterIndex := -1;



Si no funciona como debería, lo único que se me ocurre para parchear el problema es que antes de cambiar a la impresora PDF te guardes en unas variables todos los datos de la impresora predeterminada, para después poder restaurarlos manualmente (es decir, que además de volver a seleccionar la impresora predeterminada, también asignes de nuevo la bandeja por defecto).

http://www.scalabium...faq/dct0019.htm
http://www.scalabium...faq/dct0020.htm

Saludos.


Gracias por la idea de usar printers, ya la probe y no valia (este post es antiguo y se ha reabierto por un nuevo comentario) pero el final fue triste: El problema eran los drivers de Kyocera que son una... magnifica obra de ingenieria  *-) y cambiar de impresora fue la solución.

Lo de guardarme los parametros de la impresora y esas complicaciones, la verdad, si es problema de su driver yo paso de calentarme la cabeza, por un lado porque no es mi culpa, que llamen a kyocera, y por otro porque ni tengo ni planeo tener una kyocera para hacer pruebas, y probar cosas por probar como que me puede afectar al resto de impresoras "buenas", y no quiero.

Vamos, que pase del tema.
  • 0

#12 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 24 febrero 2015 - 08:09

Esto me pasa por vago, por leerme solo el primer mensaje y el último :-(.

No me di cuenta que el post era antiguo. Gracias por responder igualmente Sergio.

Saludos.
  • 0

#13 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 24 febrero 2015 - 12:24

Ya que los decís, sin ánimos de hacer publicidad. Tuve una FS-720, la compré como descartable ya que con el uso del ciclo de vida del cartucho el costo de impresión promedio se hacía igual que con el uso de recambios en otras.
Y también tuve líos con el software (pero no con Delphi), sino, con que la empresa Kyocera se olvida de ciertos modelos y no renueva los controladores.
:s
  • 0

#14 Pratasvenska

Pratasvenska

    Member

  • Miembros
  • PipPip
  • 38 mensajes
  • LocationSuecia

Escrito 25 febrero 2015 - 02:16

Hola otra vez, creo que se creó algo de confusión ya que posteé mi problema en un hilo viejo ya que estaba relacionado. Creo un nuevo tema aqui : http://www.delphiacc...-'server-side'/

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.