Querido César,
Aqui tienes el análisis de deepwiki al respecto. Te agradezco tu opinión:
Sí, se puede implementar, pero hay un detalle importante a considerar sobre cómo funciona actualmente SetCopies en TPrinter.
Estado actual de la clase TPrinter
El método SetCopies actual delega las copias al driver de Windows mediante PrnSetCopies(): 0-cite-0
Esto llama internamente a la API de Windows para establecer dmCopies en el DEVMODE: 0-cite-1
El problema es que cuando Windows gestiona las copias a nivel de driver, la aplicación envía el documento una sola vez y el driver produce N copias idénticas. La aplicación no tiene visibilidad sobre qué copia se está imprimiendo, porque ni siquiera participa en la duplicación.
La clase NO tiene nCurrentCopy ni nTotalCopies
La definición actual de DATA en TPrinter no incluye esas variables: 0-cite-2
También existe PrnGetCopies() que lee dmCopies del DEVMODE, pero sólo devuelve el número total configurado, no la copia actual: 0-cite-3
Consideración clave para la implementación
Tu propuesta es conceptualmente correcta, pero hay un conflicto: si SetCopies sigue llamando a PrnSetCopies() y además haces el loop en PrintCopies, obtendrás copias duplicadas (N copias del driver x N iteraciones del loop).
La solución correcta sería que PrintCopies gestione las copias a nivel de aplicación y no use PrnSetCopies para el driver, o bien que ponga PrnSetCopies(1) para que el driver sólo envíe 1 copia por iteración. Algo así:
// Nuevas DATA
DATA nCurrentCopy INIT 0
DATA nTotalCopies INIT 1
// Nuevo método PrintCopies - gestiona copias a nivel aplicación
METHOD PrintCopies( bBlock ) CLASS TPrinter
LOCAL nCopia
// Asegurar que el driver sólo imprime 1 copia por iteración
PrnSetCopies( 1 )
::Rebuild()
FOR nCopia := 1 TO ::nTotalCopies
::nCurrentCopy := nCopia
Eval( bBlock, Self, nCopia )
NEXT
::nCurrentCopy := 0
RETURN Self
De esta forma, cada iteración del FOR genera un documento/página completo que pasa por StartPage()/EndPage() controlado por el bloque de código, y puedes diferenciar el contenido entre "ORIGINAL" y "COPIA".