2009-04-05 15 views
0

Wie kann der letzte vom Benutzer ausgewählte Drucker beim Drucken aus einem Vorschaufenster in Fast Report (Basic Edition ver. 4.7.1) abgerufen werden?Letzter Drucker beim Drucken mit Fast Report (in Delphi)

Ich versuchte

frxReport.PrintOptions.Printer 

in OnAfterPrintReport Ereignis, aber es gibt nur die System-Standarddrucker.

Nachdem der Benutzer den Bericht gedruckt hat, druckt das Programm einige Word-Dokumente und ich muss wissen, welcher Drucker zuletzt verwendet wurde.

+0

Welchen Drucker erhalten Sie, wenn Sie das OnBeforePrint-Ereignis verwenden? – stukelly

+0

@stukelly: Ich habe jedes vernünftige Ereignis ausprobiert und sie alle geben den Systemstandarddrucker und nicht den vom Benutzer ausgewählten zurück. – mwore

Antwort

2

Nach viel Forschung in eine ganz andere Richtung (API Einhaken) kam ich mit auf den Punkt:

var 
    sLastUsedPrinter: String; 

threadvar 
    ghHook: Integer; 

... 

//set frxPrintDialog hook 
ghHook := SetWindowsHookEx(WH_CBT, @PrintDialogHookProc, 0, GetCurrentThreadId); 
//show prepared report 
frxReport.ShowPreparedReport; 
//unhook frxPrintDialog hook 
UnhookWindowsHookEx(ghHook); 

... 

function PrintDialogHookProc(uMsg, wParam, lParam: Integer): Integer; stdcall; 
var 
    //15 chars in 'TfrxPrintDialog' + 1 for string terminator 
    sClassName: array [0..15] of Char; 
    frxPrintDialog: TForm; 
    PrintersCB: TComboBox; 
begin 
    //when a windows gets activated 
    if uMsg = HCBT_ACTIVATE then 
    begin 
    //get window class name 
    GetClassName(wParam, sClassName, 16); 
    //window class name is Fast Report's Print Dialog 
    if String(sClassName) = 'TfrxPrintDialog' then 
    begin 
     frxPrintDialog := FindControl(wParam) as TForm; 
     PrintersCB := frxPrintDialog.FindComponent('PrintersCB') as TComboBox; 
     //remember currently selected printer 
     sLastUsedPrinter := PrintersCB.Text; 
     //OnChange event handler for the printer selection ComboBox 
     PrintersCB.OnChange := PrintersCBChange; 
    end; 
    end; 
    Result := CallNextHookEx(ghHook, uMsg, wParam, lParam); 
end; 

procedure PrintersCBChange(Sender: TObject); 
begin 
    //remember last user selected printer 
    sLastUsedPrinter := (Sender as TComboBox).Text; 
end; 

In echten Code sLastUsedPrinter und PrintersCBChange sind tatsächlich Mitglieder Klasse aber ich änderte sie die Dinge kurz zu halten (er) .

0

Sie können Ihren Standarddrucker für Ihre Anwendung in Ihrer Registrierung speichern und vor dem Drucken abrufen.

+0

Haben Sie die Frage gelesen? – mwore

+0

und du? (manchmal schlechte Antwort wird durch eine schlechte Frage verursacht!) Mit Ihrer Antwort verstehe ich endlich, was Sie wollen. Nächstes Mal, kaufen Sie den Code Ihrer Komponente: P –

2

Die Verwendung von API-Hook zum Speichern von zuletzt verwendeten Drucker ist ein wenig zu viel, oder?

ich diesen besseren Ansatz in dem Fastreport offiziellen Forum gefunden:

S:=.../Load From Registry 
frxreport1.PrintOptions.Printer:=S;//thats the last selected printer 
frxreport1.Print; 
S:=frxPrinters.Items[frxPrinters.PrinterIndex].Name;//thats a global var defined in frxPrinter 
//Save S to Registry. 
1

am Code Fastreport Quelle der Suche nach der TfrxPreviewPages.Print Funktion ist es klar, dass die OnPrintReport Ereignishandler nach der Auswahl des Druckers aufgerufen wird, aber bevor die Druckauftrag wird ausgeführt.

Ich habe den folgenden Code in meinem OnPrintReport Handler:

PrinterName := frxPrinters.Printers[frxPrinters.PrinterIndex]; 

und PrinterName was Drucker lieferte ich in der Fastreport Druckerauswahl ausgewählt.

Sobald Sie das haben, können Sie sie auswählen später durch folgende Operationen:

frxReport.PrepareReport(True); 
frxReport.PrintOptions.Printer := PrinterName; 
frxReport.PrintOptions.ShowDialog := True; 
frxReport.Print; 

ich überprüft haben, dass all dies funktioniert.

Verwandte Themen