Newsgroup: it.comp.lang.delphi
Titolo: Fastreport e stampa su stampante non default

Qualcuno che utilizza fastreport riesce a stampare sulla stampante che 
non è default?
 
Può dire come si fa?
 
Grazie.

Non ho modo di fare prove: qua niente fastreport.
Ho trovato questo:
 
https://www.fast-report.com/en/forum/lofiversion/index.php/t9154.html
 
 
A.


Grazie ma, sono stato troppo sintetico. Colpa mia.
 
In realtà io volevo dire:
Qualcuno riesce a stampare con una stampante che non è quella di default 
senza ottenere access violation prima, durante e/o dopo la stampa?
 
Grazie.
 
Ciao.

Rep := TfrxReport.Create(nil);
  Try
     Rep.LoadFromFile(c:\Report.fr3', True);
     // Lettura dati.........
     Rep.PrintOptions.Printer    := 'Nome_Stampante';
     Rep.PrintOptions.Copies     := 1;
     Rep.PrintOptions.ShowDialog := False;
     Rep.PrepareReport(True);
     Rep.Print;
  Finally
    Rep.free;
  End;
 
Cosi' funziona sia VCL che FMX
 
Ciao
Marzio

 non è default?
 
Ciao Luigi,
 
con il seguente codice partendo da una stampante predefinita stampo su una stampante virtuale.
 
Ciao da Enrico.
 
// Recupero i dati della stampante di default
cDefaultPrinter := DM.GetDefaultPrinterName;
Indice_Stampante := Printer.PrinterIndex;
 
// Setto come stampante di default la stampante virtuale PDF
// cPrintPDF è il nome della stampante virtuale
Printer.SetPrinter(pchar(cPrintPDF),nil,nil,0); 
 
// Stampo il report
Report.ChangePrinter(Indice_Stampante, Printer.PrinterIndex);
Report.PrepareReport;
Report.PrintPreparedReport('',1,false,frAll);
 
// Setto di nuovo la stampante predefinita originaria
DM.SetDefaultPrinter(cDefaultPrinter);
 
Qui di seguito le due funzioni che leggono e settano la stampante predefinita
 
function TDM.GetDefaultPrinterName : string;
begin
   if (Printer.PrinterIndex > 0)then begin
     Result :=
       Printer.Printers[Printer.PrinterIndex];
   end else begin
     Result := '';
   end;
end;
 
procedure TDM.SetDefaultPrinter(PrinterName: String) ;
var
    j: Integer;
    Device : PChar;
    Driver : Pchar;
    Port : Pchar;
    HdeviceMode: Thandle;
    aPrinter : TPrinter;
begin
   Printer.PrinterIndex := -1;
   getmem(Device, 255) ;
   getmem(Driver, 255) ;
   getmem(Port, 255) ;
   aPrinter := TPrinter.create;
   for j := 0 to Printer.printers.Count-1 do
   begin
     if Printer.printers[j] = PrinterName then
     begin
       aprinter.printerindex := j;
       aPrinter.getprinter(device, driver, port, HdeviceMode) ;
       StrCat(Device, ',') ;
       StrCat(Device, Driver ) ;
       StrCat(Device, Port ) ;
       WriteProfileString('windows', 'device', Device) ;
       StrCopy( Device, 'windows' ) ;
       SendMessage(HWND_BROADCAST, WM_WININICHANGE,0, Longint(@Device)) ;
    end;
   end;
   Freemem(Device, 255) ;
   Freemem(Driver, 255) ;
   Freemem(Port, 255) ;
   aPrinter.Free;
end;
 


 
Grazie per il codice suggerito ma, non cambia nulla :(
 
 > Report.PrintPreparedReport('',1,false,frAll);
 >
 
Dalla riga sopra vedo che la versione di fastreport non è la stessa, io 
sto utilizzando la versione 2.33 (in effetti freereport) e non vuole 
saperne di funzionare con una stampante virtuale PDF (bioPDF).
 
Restituisce un "Access violation at address" random che con le stampanti 
fisiche non da.
 
Grazie comunque.
 
Ciao.
 

 
 
Io per la stampante pdf virtuale utilizzo PDFCreator, dato che con stampanti fisiche non hai problemi hai provato cambiare il tool della stampante virtuale ?
 
Ciao da Enrico.


 
Non posso farlo, il pc non è il mio :(
 
Grazie.
 
Ciao.
 

 Può dire come si fa?
 
Io uso QuickReport, quindi non so come si fa con Fast/Free Report, pero' 
stampo su stampanti che NON sono quelle di default.
 
Per ottenere cio', come ti e' gia' stato suggerito, uso questo procedimento 
(ti do la logica cosi' la puoi adattare.
 
- In una stringa salvo il nome della stampante di defalut su quel computer
- Leggo la lista delle stampanti disponibili (evidentemente NON puoi 
stampare su una stampante che non esiste ..... o no?) in una lista
- Si seleziona la stampante su cui si vuole stampare e la si rende di 
default
- si stampa
- Una volta rientrati dalla procedura di stampa si resetta la stampante di 
fault originaria.
 
Ti sposto un pezzo del mio codice della funzione di stampa
 
  OldPrinterIndex:=Printer.PrinterIndex; // Questa e' la stampante di 
default
  I:= Printer.Printers.IndexOf(StampanteInUso); // trovo la stampante che ho 
salvato nel file di configurazione del programma
  if (I >= 0) and (I<>OldPrinterIndex) then Printer.PrinterIndex := I // **
  else
  begin
    // Visualizzare il dialog e selezionare la stampante
   // Puo' essere che la stampante sia stata rinominata o cancellata 
dall'elenco
    Exit;
  end;
 
  // qui fai quello che vuoi con la stampante ....
 
  // fine stampa
 
    Printer.PrinterIndex:=OldPrinterIndex;
 
** Se hai settato il nuovo Printer.PrinterIndex da questo momento PER IL TUO 
PROGRAMMA la stampante di riferimento e' quella appena settata.
Non ti devi preoccupare delle impostazioni del PC perche' Printer e' una 
variabile generale del TUO programma e basta.
 
Come vedi nella logica (e nella pratica) non faccio riferimento alcuno alla 
suite di stampa.
 
Comunque tutto cio', in forma diversa, ti era gia' stato detto.
 
Ciao e alla prossima
 
Daniele
 
PS: Se invece una volta selezionata la stampante da usare * LA VUOI ANCHE 
SETTARE COME QUELLA PRINCIPALE DEL PC IN USO * cosi che quando esci
dal programma tutte le stampe future saranno reindirizzate a questa 
stampante, allora  leggi qua:
 
http://www.swissdelphicenter.ch/torry/showcode.php?id=660
 
 
 
 
 
 

hello
 
 
add 
 
uses Winspool, Printers;
 
in quickreport Form.