Newsgroup: it.comp.lang.delphi
Titolo: Stampare fronte/retro (alias usare copie di driver delle stampanti)

In sostanza dovrei, non ora ma in un prossimo futuro, implementare la 
stampa fronte-retro in una mia applicazione.
Poniamo che nella LAN dove lavoriamo ci siano due stampanti:
- StampanteA che si trova nello sgabuzzino in fondo alle scale e stampa 
fronte/retro, ma anche solo fronte (ovviamente) - a seconda di come viene 
configurato di volta in volta il driver dall'utente:
- StampanteB che si trova nel piano degli uffici dove lavoriamo e che 
stampa solo fronte.
La mia applicazione attualmente stampa ovunque le si dica di stampare. Per 
certi documenti è richiesto il fronte/retro e allora l'utente deve aprire 
il driver della stampante (Pannello di Controllo > Stampanti ecc ecc) e 
settare l'apposita voce fornita appunto dall'interfaccia utente della 
stampante stessa (una Xerox 55 Pro se non sbaglio).
Beh io vorrei che l'applicazione stampi (a seconda dei casi, lo deciderà 
lei):
- su StampanteA fronte/retro;
- su StampanteA solo fronte;
- su StampanteB.
Non ho fretta, ma questo sarebbe un bel bonus per gli utenti.
Un'idea che mi è venuta in mente è quella di imitare il comportamento di 
FinePrint, non so se lo conoscete (una "stampante virtuale" con cui si 
possono applicare bordi aggiuntivi, firme, numeri di pagina, stampare 2-4-8 
pagine su una, ecc...). FinePrint, non so come, "si fa una copia" dei 
driver delle stampanti in uso. Questo l'avevo letto su qualche rivista dove 
presentavano il programma, ma si vede anche in pratica: se tu imposti 
determinate opzioni su una stampante, accedendo al relativo driver da 
FinePrint, le opzioni sono e restano differenti da quelle impostate che ne 
so in Word o da Pannello di Controllo > Stampanti.
Quindi è una copia del driver, fin qua ci sono. Se riuscissi a emulare 
questo meccanismo sarei a cavallo, perchè l'utente si imposterebbe solo una 
volta per tutte la sua "stampante fronte/retro preferita" e la sua 
"stampante solo fronte preferita".
Qualcuno ha suggerimenti o ha già fatto qualcosa del genere?
-- 
Mauro Falzari 
 
  La teoria è quando si sa tutto ma non funziona niente. 
  La pratica è quando funziona tutto ma non si sa il perchè. 
  In ogni caso si finisce sempre a coniugare la teoria con la pratica: 
  Non funziona niente e non si sa il perchè. 
   (Albert Einstein)

Se fossimo dei bruti, ti direi che si potrebbe, per la stampante fisica A, 
installare due stampanti sul pc, la prima col driver configurata per 
stampare solo fronte, la seconda configurata per stampare fronte/retro.
Ma ovviamente, non essendo bruti, cerchiamo una soluzione piu' elegante.
Ecco cerchiamola insieme perche' a me non viene in mente niente se non 
utilizzare da linguaggio pcl le istruzioni specifiche per il fronte/retro, 
ma cosi' si vincolerebbe il programma applicativo a 'parlare' in pcl e non 
credo che sia una scelta ottimale.
Ciao
RobertoA


Installare una stampante virtuale che poi gestisci tu come
preferisci?
Guarda qua:
http://mabuse.de/vprinter.mhtml
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio 


Non è farina del mio sacco, ho trovato in rete questa unit che salva e
recupera da file le impostazione di una stampante, la uso da anni e non
ho avuto problemi,  ciao Brunello.
unit PrinterSetup;
interface
Uses printers, windows, Classes, WinSpool, SysUtils;
Type
  TPrinterSetup = class
private
  Device, Driver, Port: array[0..CCHDEVICENAME] of char;
  DeviceMode:THandle;
  Procedure Refresh;
protected
public
  Procedure SaveSetup(Filename:TFilename);
  Procedure LoadSetup(Filename:TFilename);
end;
  TPrinterConfig=record
  ADevice, ADriver, APort: array[0..CCHDEVICENAME] of char;
  SizeOfDeviceMode:DWORD;
end;
implementation
Procedure TPrinterSetup.Refresh;
begin
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
end;
Procedure TPrinterSetup.SaveSetup(Filename:TFilename);
var
  StubDevMode: TDeviceMode;
  SetupPrinter:TPrinterConfig;
  FPrinterHandle:THandle;
  fFileConfig: file of TPrinterConfig;
  fFileDevMode: file of Char;
  pDevMode:Pchar;
  i:Integer;
begin
  Refresh;
  With SetupPrinter do
    begin
      StrLCopy(ADevice, Device, SizeOf(ADevice));
      StrLCopy(ADriver, Driver, SizeOf(ADriver));
      StrLCopy(APort, Port, SizeOf(APort));
      OpenPrinter(Device, FPrinterHandle, nil);
      SizeOfDeviceMode := DocumentProperties(0, FPrinterHandle, Device,
StubDevMode, StubDevMode, 0);
    end;
  AssignFile(fFileConfig, FileName);
  ReWrite(fFileConfig);
  write(fFileConfig, SetupPrinter);
  CloseFile(fFileConfig);
  AssignFile(fFileDevMode, FileName);
  Reset(fFileDevMode);
  Seek(fFileDevMode, FileSize(fFileDevMode));
  pDevMode := GlobalLock(DeviceMode);
  for i := 0 to SetupPrinter.SizeOfDeviceMode - 1 do
    write(fFileDevMode, pDevMode[i]);
  CloseFile(fFileDevMode);
  GlobalUnLock(DeviceMode);
end;
Procedure TPrinterSetup.LoadSetup(Filename:TFilename);
var
  SetupPrinter: TPrinterConfig;
  fFileConfig: file of TPrinterConfig;
  fFileDevMode: file of Char;
  ADeviceMode: Thandle;
  pDevMode: Pchar;
  n: char;
  i: Integer;
begin
  if FileExists(Filename) then
    begin
      AssignFile(fFileConfig, FileName);
      Reset(fFileConfig);
      read(fFileConfig, SetupPrinter);
      CloseFile(fFileConfig);
      AssignFile(fFileDevMode, FileName);
      Reset(fFileDevMode);
      Seek(fFileDevMode, SizeOf(SetupPrinter));
      ADeviceMode := GlobalAlloc(GHND, SetupPrinter.SizeOfDeviceMode);
      pDevMode := GlobalLock(ADeviceMode);
      for i := 0 to SetupPrinter.SizeOfDeviceMode - 1 do
        begin
          read(fFileDevMode, n);
          pDevMode[i] := n;
        end;
      CloseFile(fFileDevMode);
      GlobalUnLock(ADeviceMode);
      Printer.SetPrinter(SetupPrinter.ADevice, SetupPrinter.ADriver,
SetupPrinter.APort, ADeviceMode);
    end;
end;
end.

io ho trovato un componente free tpbprintersetup (se volete ve lo inoltro) 
che personalizza le proprietą della stampante, le salva ne registro e le 
ricarica con l'applicazione
Simo 

 Simo 
raga, grazie a tutti per il momento; purtroppo (per fortuna!) parto per le 
agognate ferie, per cui sarebbe irrealistico mettermi a testare componenti 
o provare codice di fretta, con l'auto carica sotto casa e tutti pronti per 
partire. Mi tengo evidenziato il thread e lo riesumerò dopo le ferie, 
intanto grazie a tutti per i contributi e poi vi saprò dire.


Beato te che vai in ferie, io per sapere delle ferie... devo andare a 
cercarmele sul vocabolario!!! Ma non è detto, perché IO forse mi 
rilasso, TU, sicuramente, NO! Fammi sapere se ho ragione Eh eh eh
Allora
Per quel che so io, il componente TPrinter contiene anche l'elenco dei 
driver; io ho gli stessi problemi, e mi sono organizzato memorizzando un 
driver per ogni stampa, cioè ogni finestra di stampa dei miei programmi 
memorizzano in un apposito file di testo il codice del driver prescelto.
Se ti interessa, quindi:
- nella Uses della Unit ci metti Printers;
- nella finestra di richiesta di stampa, inserire un pulsante "Setup", 
che apre una lista dei drivers disponibili (la finestra di sistema 
TPrintDialog;
- quando l'utente sceglie la stampante, (PrintDialog.Execute), registro:
----------------
  Fn := TIniFile.Create(IndirProc+'\PROGRAMS\NOTE.INF');
  Fn.WriteInteger('3','v11',Printer.PrinterIndex);
----------------
- in OnShow della finestra, invece:
----------------
var Cd: string; Fn: TIniFile;
begin
  Fn := TIniFile.Create(IndirProc+'\PROGRAMS\NOTE.INF');
  Cd := Fn.ReadString('3','v11',',');
  if Cd <> '' then begin
     EdDrive.Text := '  '+Printer.Printers[StrToInt(Cd)]; // nome driver
     Printer.Copies := StrToInt(EdCopy.Text);             // n° copie
     Printer.PrinterIndex := StrToInt(Cd);                // cod. driver
  end
  else EdDrive.Text := '  '+Printer.Printers[Printer.PrinterIndex];
end;
----------------
e va bene, fino a quando non vengono cancellate della stampanti da 
Windows, per cui il driver successivo prende il posto del precedente e 
va rimemorizzato  il driver scelto.
Spero di essere stato chiaro
Semmai, fammi sapere
NioBi
--- posted by geoForum on 
http://www.delphiedintorni.it