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:
var szPrinterName, szIniInfo, szSection: PChar; begin GetMem(szPrinterName,SizeOf(Char) * 256); //allocate memory GetMem(szIniInfo,SizeOf(Char) * 256); GetMem(szSection,10) ; StrPCopy(szPrinterName, Printer.Printers[PosImpresora]); //Fijo impresora por defecto en windows GetProfileString('DEVICES', szPrinterName, nil, szIniInfo, 254) ; {locate device info in win.ini} if szIniInfo^ <> #0 then begin {if device found, then..} StrCat(szPrinterName,',') ; {prepare new device line} StrCat(szPrinterName,szIniInfo) ; WriteProfileString('Windows','DEVICE',szPrinterName) ; {update ini file} StrCopy(szSection,'Windows') ; PostMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(szSection)) ; {notify all apps - ini has changed} end; //Libero recursos... FreeMem(szPrinterName,SizeOf(Char) * 256) ; {release memory} FreeMem(szIniInfo,SizeOf(Char) * 256) ; FreeMem(szSection,10) ; 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!