2009-04-05 12 views
0

ファストレポート(Basic Edition ver。4.7.1)のプレビューウィンドウから印刷するときに最後に選択したプリンタを取り込む方法は?ファストレポート(Delphi)で印刷する際に最後に使用されたプリンタ

私はOnAfterPrintReportイベントで

frxReport.PrintOptions.Printer 

を試みたが、それだけでシステムのデフォルトプリンタを返します。

ユーザーがレポートを印刷した後、プログラムはいくつかのWord文書を印刷し、どのプリンタが最後に使用されたかを知る必要があります。

+0

OnBeforePrintイベントを使用すると、どのプリンタが表示されますか? – stukelly

+0

@stukelly:すべての合理的なイベントを試しましたが、それらはすべてシステムのデフォルトのプリンタであり、ユーザーが選択したものではありません。 – mwore

答えて

2

は完全に異なる方向(APIフック)における多くの研究の後、私はこの思い付いた:実際のコードのsLastUsedPrinterとPrintersCBChangeで

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; 

は、実際には、クラスメンバーですが、私は(ER)の短いものを維持するためにそれらを変更しました。

0

アプリケーションのデフォルトプリンタをレジストリに保存し、印刷する前に取得できます。

+0

あなたは質問を読んだことがありますか? – mwore

+0

とあなたですか? (ときどき悪い答えは悪い質問によって引き起こされる!) あなたの答えで、私はついにあなたが望むものを理解します。 次回は、コンポーネントのコードを購入してください:P –

2

APIを使用して最後に使用したプリンタを保存するためのフックが多すぎますね。

私はFastReportの公式フォーラムでこのより良いアプローチを見つけた:

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

TfrxPreviewPages.Print機能のためFastReportのソースコードを見ると、OnPrintReportイベントハンドラは、プリンタを選択した後ではなく前に呼び出されることは明らかです印刷ジョブが実行されます。

私は私のOnPrintReportハンドラに次のコードを置く:

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

PrinterNameは、私はFastReportのプリンタの選択で選択したものは何でもプリンタが得られました。あなたはそれを持っていたら

は、次の手順を実行して、後でそれを選択することができます:私はこのすべてが動作することを確認した

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

関連する問題