{******************************************} { } { Report Machine v2.0 } { Print dialog } { } { } {******************************************} unit RM_PrintDlg2; interface {$I RM.inc} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, WinSpool, RM_Ctrls, RM_Printer; type TRMPrintDialogForm = class(TForm) GroupBox2: TGroupBox; rdbPrintAll: TRadioButton; rbdPrintCurPage: TRadioButton; rbdPrintPapges: TRadioButton; edtPages: TEdit; Label2: TLabel; btnOK: TButton; btnCancel: TButton; GroupBox1: TGroupBox; cmbPrinters: TComboBox; btnPrinterProp: TButton; GroupBox3: TGroupBox; lblCopies: TLabel; chkCollate: TCheckBox; Label4: TLabel; Label5: TLabel; Image1: TImage; cmbPrintAll: TComboBox; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; imgCollate: TImage; lblStatus: TLabel; lblType: TLabel; lblPosition: TLabel; lblCommon: TLabel; Image3: TImage; Image2: TImage; chkTaoda: TCheckBox; GroupBox4: TGroupBox; Label3: TLabel; cmbScalePapers: TComboBox; lblScale: TLabel; GroupBox5: TGroupBox; lblPrnOffsetTop: TLabel; lbllblPrnOffsetLeft: TLabel; chkColorPrint: TCheckBox; procedure cmbPrintersDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure FormCreate(Sender: TObject); procedure btnPrinterPropClick(Sender: TObject); procedure E2Click(Sender: TObject); procedure rbdPrintPapgesClick(Sender: TObject); procedure chkCollateClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure cmbPrintersChange(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } FOldIndex: Integer; FScale: TRMSpinEdit; FSpinOffsetTop, FSpinOffsetLeft: TRMSpinEdit; FPrintOffsetTop, FPrintOffsetLeft: Integer; FSpinCopies: TRMSpinEdit; procedure SpinOffsetTopChangeEvent(Sender: TObject); procedure Localize; procedure UpdateCollationSettings; procedure UpdatePrinterSettings; procedure FillScalePapers; function GetScale: Integer; function GetCopies: Integer; procedure SetCopies(Value: Integer); public { Public declarations } NeedRebuild: Boolean; CurrentPrinter: TRMPrinter; procedure GetPageInfo(var aPaperWidth, aPaperHeight, apgSize: Integer); procedure ChangeVirtualPrinter; property ScaleFactor: Integer read GetScale; property PrintOffsetTop: Integer read FPrintOffsetTop write FPrintOffsetTop; property PrintOffsetLeft: Integer read FPrintOffsetLeft write FPrintOffsetLeft; property Copies: Integer read GetCopies write SetCopies; end; implementation {$R *.DFM} uses RM_Const, RM_Common, RM_Utils, RM_Class; procedure TRMPrintDialogForm.Localize; begin Font.Name := RMLoadStr(SRMDefaultFontName); Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize)); Font.Charset := StrToInt(RMLoadStr(SCharset)); RMSetStrProp(Self, 'Caption', rmRes + 040); RMSetStrProp(GroupBox1, 'Caption', rmRes + 041); RMSetStrProp(btnPrinterProp, 'Caption', rmRes + 042); RMSetStrProp(GroupBox3, 'Caption', rmRes + 043); RMSetStrProp(GroupBox2, 'Caption', rmRes + 044); RMSetStrProp(rdbPrintAll, 'Caption', rmRes + 045); RMSetStrProp(rbdPrintCurPage, 'Caption', rmRes + 046); RMSetStrProp(rbdPrintPapges, 'Caption', rmRes + 047); RMSetStrProp(Label2, 'Caption', rmRes + 048); RMSetStrProp(Label4, 'Caption', rmRes + 049); RMSetStrProp(lblCopies, 'Caption', rmRes + 050); RMSetStrProp(chkCollate, 'Caption', rmRes + 051); RMSetStrProp(Label5, 'Caption', rmRes + 052); RMSetStrProp(Label6, 'Caption', rmRes + 56); RMSetStrProp(Label7, 'Caption', rmRes + 57); RMSetStrProp(Label8, 'Caption', rmRes + 58); RMSetStrProp(Label9, 'Caption', rmRes + 1831); RMSetStrProp(chkTaoda, 'Caption', rmRes + 375); RMSetStrProp(GroupBox4, 'Caption', rmRes + 1860); RMSetStrProp(Label3, 'Caption', rmRes + 1861); RMSetStrProp(lblScale, 'Caption', rmRes + 1863); RMSetStrProp(lblPrnOffsetTop, 'Caption', rmRes + 370); RMSetStrProp(lbllblPrnOffsetLeft, 'Caption', rmRes + 404); RMSetStrProp(GroupBox5, 'Caption', rmRes + 414); RMSetStrProp(chkColorPrint, 'Caption', rmRes + 369); cmbPrintAll.Items.Add(RMLoadStr(rmRes + 53)); cmbPrintAll.Items.Add(RMLoadStr(rmRes + 54)); cmbPrintAll.Items.Add(RMLoadStr(rmRes + 55)); btnOK.Caption := RMLoadStr(SOk); btnCancel.Caption := RMLoadStr(SCancel); end; procedure TRMPrintDialogForm.ChangeVirtualPrinter; begin UpdatePrinterSettings; // FillScalePapers; end; procedure TRMPrintDialogForm.GetPageInfo(var aPaperWidth, aPaperHeight, apgSize: Integer); var liPrintInfo: TRMPrinterInfo; liPrinterIndex: Integer; begin apgSize := FScale.AsInteger; if cmbScalePapers.ItemIndex < 1 then begin apgSize := -1; end else begin if cmbPrinters.ItemIndex = 0 then liPrinterIndex := 0 else liPrinterIndex := cmbPrinters.ItemIndex + 1; liPrintInfo := RMPrinters.PrinterInfo[liPrinterIndex]; apgSize := liPrintInfo.PaperSizes[cmbScalePapers.ItemIndex - 1]; aPaperWidth := liPrintInfo.PaperWidths[cmbScalePapers.ItemIndex - 1]; aPaperHeight := liPrintInfo.PaperHeights[cmbScalePapers.ItemIndex - 1]; end; end; procedure TRMPrintDialogForm.FillScalePapers; var i: Integer; liPrintInfo: TRMPrinterInfo; liPrinterIndex: Integer; begin cmbScalePapers.Items.Clear; cmbScalePapers.Items.Add(RMLoadStr(rmRes + 1862)); if cmbPrinters.ItemIndex = 0 then liPrinterIndex := 0 else liPrinterIndex := cmbPrinters.ItemIndex + 1; if liPrinterIndex >= 0 then begin liPrintInfo := RMPrinters.PrinterInfo[liPrinterIndex]; with liPrintInfo do begin for i := 0 to PaperSizesCount - 2 do begin cmbScalePapers.Items.Add(PaperNames[i]); end; end; end; cmbScalePapers.ItemIndex := 0; end; procedure TRMPrintDialogForm.UpdateCollationSettings; begin if (chkCollate.Checked) then imgCollate.Picture.Bitmap.Assign(Image2.Picture.Bitmap) else imgCollate.Picture.Bitmap.Assign(Image3.Picture.Bitmap) end; procedure TRMPrintDialogForm.UpdatePrinterSettings; var info: PPrinterInfo2; pcbNeeded, count: DWORD; str: string; liPrinterIndex: Integer; begin lblType.Caption := ''; lblPosition.Caption := ''; lblCommon.Caption := ''; lblStatus.Caption := ''; if cmbPrinters.ItemIndex = 0 then liPrinterIndex := 0 else liPrinterIndex := cmbPrinters.ItemIndex + 1; if liPrinterIndex >= 0 then begin WinSpool.GetPrinter(CurrentPrinter.PrinterHandle, 2, nil, 0, @count); GetMem(info, count); try if WinSpool.GetPrinter(CurrentPrinter.PrinterHandle, 2, info, count, @pcbNeeded) then begin lblType.Caption := info^.pDriverName; lblPosition.Caption := info^.pPortName; lblCommon.Caption := info^.pComment; if info^.cJobs > 0 then str := RMLoadStr(rmRes + 1864) else str := RMLoadStr(rmRes + 1865); if info^.Status <> 0 then begin case info^.Status of PRINTER_STATUS_BUSY: str := RMLoadStr(rmRes + 1833); PRINTER_STATUS_DOOR_OPEN: str := RMLoadStr(rmRes + 1834); PRINTER_STATUS_ERROR: str := RMLoadStr(rmRes + 1835); PRINTER_STATUS_INITIALIZING: str := RMLoadStr(rmRes + 1836); PRINTER_STATUS_IO_ACTIVE: str := RMLoadStr(rmRes + 1837); PRINTER_STATUS_MANUAL_FEED: str := RMLoadStr(rmRes + 1838); PRINTER_STATUS_NO_TONER: str := RMLoadStr(rmRes + 1839); PRINTER_STATUS_NOT_AVAILABLE: str := RMLoadStr(rmRes + 1840); PRINTER_STATUS_OFFLINE: str := RMLoadStr(rmRes + 1841); PRINTER_STATUS_OUT_OF_MEMORY: str := RMLoadStr(rmRes + 1842); PRINTER_STATUS_OUTPUT_BIN_FULL: str := RMLoadStr(rmRes + 1843); PRINTER_STATUS_PAGE_PUNT: str := RMLoadStr(rmRes + 1844); PRINTER_STATUS_PAPER_JAM: str := RMLoadStr(rmRes + 18345); PRINTER_STATUS_PAPER_OUT: str := RMLoadStr(rmRes + 1846); PRINTER_STATUS_PAPER_PROBLEM: str := RMLoadStr(rmRes + 1847); PRINTER_STATUS_PAUSED: str := RMLoadStr(rmRes + 1848); PRINTER_STATUS_PENDING_DELETION: str := RMLoadStr(rmRes + 1849); PRINTER_STATUS_PRINTING: str := RMLoadStr(rmRes + 1850); PRINTER_STATUS_PROCESSING: str := RMLoadStr(rmRes + 1851); PRINTER_STATUS_TONER_LOW: str := RMLoadStr(rmRes + 1852); PRINTER_STATUS_USER_INTERVENTION: str := RMLoadStr(rmRes + 1853); PRINTER_STATUS_WAITING: str := RMLoadStr(rmRes + 1834); PRINTER_STATUS_WARMING_UP: str := RMLoadStr(rmRes + 1855); end; end; if info^.cJobs > 0 then begin if Length(str) > 0 then str := str + ':'; str := str + Format(RMLoadStr(rmRes + 1856), [info^.cJobs]); end; lblStatus.Caption := str; end; finally FreeMem(info, count); // WinSpool.ClosePrinter(CurrentPrinter.PrinterHandle); end; end; end; procedure TRMPrintDialogForm.FormCreate(Sender: TObject); begin NeedRebuild := False; FScale := TRMSpinEdit.Create(Self); with FScale do begin Parent := GroupBox4; SetBounds(cmbScalePapers.Left, lblScale.Top, cmbScalePapers.Width, 21); Value := 100; MinValue := 1; end; FSpinOffsetTop := TRMSpinEdit.Create(Self); with FSpinOffsetTop do begin Parent := GroupBox5; SetBounds(lblPrnOffsetTop.Left+lblPrnOffsetTop.Width + 2, lblPrnOffsetTop.Top, GroupBox5.Width- lblPrnOffsetTop.Left-lblPrnOffsetTop.Width -10, 21); ValueType := rmvtFloat; MinValue := -MaxInt; Increment := 0.1; Tag := 1; OnChange := SpinOffsetTopChangeEvent; end; FSpinOffsetLeft := TRMSpinEdit.Create(Self); with FSpinOffsetLeft do begin Parent := GroupBox5; SetBounds(FSpinOffsetTop.Left, lbllblPrnOffsetLeft.Top, FSpinOffsetTop.Width, 21); ValueType := rmvtFloat; MinValue := -MaxInt; Increment := 0.1; Tag := 2; OnChange := SpinOffsetTopChangeEvent; end; FSpinCopies := TRMSpinEdit.Create(Self); with FSPinCopies do begin Parent := GroupBox3; SetBounds(chkCollate.Left, lblCopies.Top, 64, 21); MinValue := 1; end; Localize; end; procedure TRMPrintDialogForm.cmbPrintersDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var r: TRect; begin r := ARect; r.Right := r.Left + 18; r.Bottom := r.Top + 16; OffsetRect(r, 2, 0); with cmbPrinters.Canvas do begin FillRect(ARect); BrushCopy(r, Image1.Picture.Bitmap, Rect(0, 0, 18, 16), clOlive); TextOut(ARect.Left + 24, ARect.Top + 1, cmbPrinters.Items[Index]); end; end; procedure TRMPrintDialogForm.btnPrinterPropClick(Sender: TObject); begin if CurrentPrinter.PropertiesDlg then NeedRebuild := True; UpdatePrinterSettings; end; procedure TRMPrintDialogForm.E2Click(Sender: TObject); begin rbdPrintPapges.Checked := True; end; procedure TRMPrintDialogForm.rbdPrintPapgesClick(Sender: TObject); begin edtPages.SetFocus; end; procedure TRMPrintDialogForm.chkCollateClick(Sender: TObject); begin UpdateCollationSettings; end; procedure TRMPrintDialogForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if ModalResult <> mrOk then CurrentPrinter.PrinterIndex := FOldIndex; end; procedure TRMPrintDialogForm.cmbPrintersChange(Sender: TObject); begin if cmbPrinters.ItemIndex = 0 then CurrentPrinter.PrinterIndex := cmbPrinters.ItemIndex else CurrentPrinter.PrinterIndex := cmbPrinters.ItemIndex + 1; UpdatePrinterSettings; FillScalePapers; end; procedure TRMPrintDialogForm.FormShow(Sender: TObject); begin cmbPrinters.Items.Assign(RMPrinters.Printers); cmbPrinters.Items.Delete(1); FOldIndex := CurrentPrinter.PrinterIndex; if FOldIndex <= 1 then cmbPrinters.ItemIndex := 0 else cmbPrinters.ItemIndex := FOldIndex - 1; if cmbPrinters.ItemIndex < 0 then cmbPrinters.ItemIndex := 0; chkCollateClick(nil); cmbPrintAll.ItemIndex := 0; cmbPrintAll.Left := Label5.Left + Label5.Width + 11; cmbScalePapers.ItemIndex := -1; cmbPrintersChange(nil); FSpinOffsetTop.Value := FPrintOffsetTop / 10000; FSpinOffsetLeft.Value := FPrintOffsetLeft / 10000; end; function TRMPrintDialogForm.GetScale: Integer; begin try Result := FScale.AsInteger; if Result < 1 then Result := 1; except Result := 100; end; end; procedure TRMPrintDialogForm.SpinOffsetTopChangeEvent(Sender: TObject); begin if TControl(Sender).Tag = 2 then FPrintOffsetLeft := Round(FSpinOffsetLeft.Value * 10000) else FPrintOffsetTop := Round(FSpinOffsetTop.Value * 10000); end; function TRMPrintDialogForm.GetCopies: Integer; begin Result := FSpinCopies.AsInteger; end; procedure TRMPrintDialogForm.SetCopies(Value: Integer); begin FSpinCopies.Value := Value; end; procedure TRMPrintDialogForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var i: Integer; begin if ModalResult = mrOK then begin edtPages.Text := Trim(edtPages.Text); if (Length(edtPages.Text) > 0) and (not (edtPages.Text[1] in ['1'..'9'])) then begin edtPages.SetFocus; CanClose := False; end; for i := 1 to Length(edtPages.Text) do begin if (not ((edtPages.Text[i] in ['0'..'9']) or (edtPages.Text[i] = ',') or (edtPages.Text[i] = '-'))) then begin Application.MessageBox('Page Number Setting Error!', PChar(SWarning), MB_ICONERROR + MB_OK); CanClose := False; edtPages.SetFocus; Break; end; end; end; end; end.