rm_preview.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,231 行 · 第 1/5 页
PAS
2,231 行
maxy := 0;
while i < lPages.Count do
begin
j := 0;
maxdy := 0;
curx := 10;
while (j < nx) and (i + j < lPages.Count) do
begin
lPageWidth := Round(lPages[i + j].PrinterInfo.PageWidth * FScale);
lPageHeight := Round(lPages[i + j].PrinterInfo.PageHeight * FScale);
if (nx = 1) and (lPageWidth < FDrawPanel.Width) then
begin
d := (FDrawPanel.Width - lPageWidth) div 2;
lPages[i + j].PageRect := Rect(d, y, d + lPageWidth, y + lPageHeight);
end
else
lPages[i + j].PageRect := Rect(curx, y, curx + lPageWidth, y + lPageHeight);
if maxx < lPages[i + j].PageRect.Right then
maxx := lPages[i + j].PageRect.Right;
if maxy < lPages[i + j].PageRect.Bottom then
maxy := lPages[i + j].PageRect.Bottom;
Inc(j);
if maxdy < lPageHeight then
maxdy := lPageHeight;
Inc(curx, lPageWidth + 10);
end;
Inc(y, maxdy + 10);
Inc(i, nx);
end;
HScrollBar.Max := maxx + 10;
HScrollBar.RefreshLargePage(FScrollBox.ClientWidth);
if HScrollBar.Position > HScrollBar.Max - HScrollBar.LargeChange then
HScrollBar.Position := HScrollBar.Max - HScrollBar.LargeChange;
VScrollBar.Max := maxy + 10;
VScrollBar.RefreshLargePage(FScrollBox.ClientHeight);
if VScrollBar.Position > VScrollBar.Max - VScrollBar.LargeChange then
VScrollBar.Position := VScrollBar.Max - VScrollBar.LargeChange;
SetToCurPage;
FPaintAllowed := True;
DoStatusChange;
end;
procedure TRMPreview.RedrawAll(ResetPage: Boolean);
//var
// i: Integer;
begin
FPaintAllowed := True;
FScale := FLastScale;
if ResetPage then
begin
FCurPage := 1;
FOffsetLeft := 0;
FOffsetTop := 0;
FOldHPos := 0;
FOldVPos := 0;
HScrollBar.Position := 0;
VScrollBar.Position := 0;
end;
ShowPageNum;
OnResizeEvent(nil);
{ if GetEndPages <> nil then
begin
for i := 0 to TRMEndPages(GetEndPages).Count - 1 do
begin
TRMEndPages(GetEndPages).Pages[i].RemoveCachePage;
end;
end;}
FDrawPanel.Repaint;
end;
procedure TRMPreview.OnScrollBoxScroll(Sender: TObject; Kind: TRMScrollBarKind);
var
i, p, pp: Integer;
lRect: TRect;
lPages: TRMEndPages;
begin
if GetEndPages = nil then Exit;
if Kind = rmsbHorizontal then
begin
p := HScrollBar.Position;
pp := FOldHPos - p;
FOldHPos := p;
FOffsetLeft := -p;
lRect := Rect(0, 0, FDrawPanel.Width, FDrawPanel.Height);
ScrollWindow(FDrawPanel.Handle, pp, 0, @lRect, @lRect);
end
else
begin
lPages := TRMEndPages(GetEndPages);
p := VScrollBar.Position;
pp := FOldVPos - p;
FOldVPos := p;
FOffsetTop := -p;
lRect := Rect(0, 0, FDrawPanel.Width, FDrawPanel.Height);
ScrollWindow(FDrawPanel.Handle, 0, pp, @lRect, @lRect);
for i := 0 to lPages.Count - 1 do
begin
if (lPages[i].PageRect.Top < -FOffsetTop + 11) and (lPages[i].PageRect.Bottom > -FOffsetTop + 11) then
begin
FCurPage := i + 1;
ShowPageNum;
Break;
end;
end;
end;
end;
procedure TRMPreview.SetPage(Value: Integer);
begin
if FCurPage <> Value then
begin
if Value < 1 then
Value := 1;
if Value > TotalPages then
Value := TotalPages;
FCurPage := Value;
SetToCurPage;
if Assigned(FOnPageChanged) then
FOnPageChanged(Self);
end;
end;
function TRMPreview.GetZoom: Double;
begin
Result := FScale * 100;
end;
procedure TRMPreview.SetZoom(Value: Double);
begin
FScale := Value / 100;
FZoomMode := mdNone;
LastScale := FScale;
OnResizeEvent(nil);
FDrawPanel.Paint;
DoStatusChange;
end;
function TRMPreview.GetTotalPages: Integer;
begin
if GetEndPages <> nil then
Result := TRMEndPages(GetEndPages).Count
else
Result := 0;
end;
procedure TRMPreview.OnePage;
begin
FZoomMode := mdOnePage;
OnResizeEvent(nil);
FDrawPanel.Paint;
DoStatusChange;
end;
procedure TRMPreview.TwoPages;
begin
FZoomMode := mdTwoPages;
OnResizeEvent(nil);
FDrawPanel.Paint;
DoStatusChange;
end;
procedure TRMPreview.PageWidth;
begin
FZoomMode := mdPageWidth;
OnResizeEvent(nil);
FDrawPanel.Paint;
DoStatusChange;
end;
procedure TRMPreview.PrinterZoom;
begin
if RMPrinter.PrinterInfo.IsValid then
FZoomMode := mdPrinterZoom
else
FZoomMode := mdPageWidth;
OnResizeEvent(nil);
FDrawPanel.Paint;
DoStatusChange;
end;
procedure TRMPreview.First;
begin
CurPage := 1;
end;
procedure TRMPreview.Next;
begin
CurPage := CurPage + 1;
end;
procedure TRMPreview.Prev;
begin
CurPage := CurPage - 1;
end;
procedure TRMPreview.Last;
begin
CurPage := TotalPages;
end;
procedure TRMPreview.Print;
var
lSavePrinterIndex: Integer;
lNeedSave: Boolean;
lPages: string;
lForm: TRMPrintDialogForm;
begin
if (GetEndPages = nil) or (RMPrinters.Count = 2) then Exit;
lForm := TRMPrintDialogForm.Create(nil);
try
with lForm do
begin
CurrentPrinter := TRMReport(FReport).ReportPrinter;
Copies := TRMReport(FReport).DefaultCopies;
chkCollate.Checked := TRMReport(FReport).DefaultCollate;
chkTaoda.Checked := TRMReport(FReport).PrintBackGroundPicture;
chkColorPrint.Checked := TRMReport(FReport).ColorPrint;
THackReport(FReport).ScalePageSize := -1;
THackReport(FReport).ScaleFactor := 100;
PrintOffsetTop := TRMReport(FReport).PrintOffsetTop;
PrintOffsetLeft := TRMReport(FReport).PrintOffsetLeft;
if TRMReport(Report).ShowPrintDialog then
lSavePrinterIndex := TRMReport(FReport).ReportPrinter.PrinterIndex
else
lSavePrinterIndex := -1;
if (not TRMReport(Report).ShowPrintDialog) or (ShowModal = mrOK) then
begin
if TRMReport(FReport).CanRebuild and (lForm.NeedRebuild or
(TRMReport(FReport).ReportPrinter.PrinterIndex <> lSavePrinterIndex)) then // 改变了打印机设置
begin
{ if TRMReport(FReport).ChangePrinter(liSavePrinterIndex, TRMReport(FReport).ReportPrinter.PrinterIndex) then
begin
TRMEndPages(FEndPages).Free;
FEndPages := nil;
TRMReport(FReport).PrepareReport;
Connect(FReport);
end
else
begin
Free;
Exit;
end;
}
end;
TRMReport(FReport).ColorPrint := chkColorPrint.Checked;
THackReport(FReport).Flag_PrintBackGroundPicture := not chkTaoda.Checked;
GetPageInfo(THackReport(FReport).ScalePageWidth, THackReport(FReport).ScalePageHeight, THackReport(FReport).ScalePageSize);
THackReport(FReport).ScaleFactor := lForm.ScaleFactor;
lNeedSave := (TRMReport(FReport).PrintOffsetTop <> PrintOffsetTop) or
(TRMReport(FReport).PrintOffsetLeft <> PrintOffsetLeft);
TRMReport(FReport).PrintOffsetTop := PrintOffsetTop;
TRMReport(FReport).PrintOffsetLeft := PrintOffsetLeft;
if rdbPrintAll.Checked then
lPages := ''
else if rbdPrintCurPage.Checked then
lPages := IntToStr(FCurPage)
else
lPages := edtPages.Text;
if lNeedSave then
TRMReport(FReport).SaveReportOptions.SaveReportSetting(TRMReport(FReport), '');
FPaintAllowed := False;
try
TRMReport(FReport).PrintPreparedReport(lPages, Copies, chkCollate.Checked,
TRMPrintPages(cmbPrintAll.ItemIndex));
finally
Connect_1(FReport);
RedrawAll(False);
end;
end;
end;
finally
lForm.Free;
end;
end;
procedure TRMPreview.PrintCurrentPage; //打印当前页
begin
if (GetEndPages = nil) or (RMPrinters.Count = 2) then Exit;
FPaintAllowed := False;
try
THackReport(FReport).Flag_PrintBackGroundPicture := TRMReport(FReport).PrintbackgroundPicture;
THackReport(FReport).ScalePageSize := -1;
THackReport(FReport).ScaleFactor := 100;
TRMReport(FReport).PrintPreparedReport(IntToStr(CurPage), 1, TRMReport(FReport).DefaultCollate,
rmppAll);
finally
RedrawAll(False);
end;
end;
procedure TRMPreview.DlgPageSetup;
var
tmpForm: TRMPageSetupForm;
liEndPage: TRMEndPage;
lPage: TRMCustomPage;
i: Integer;
w, lhRgn, p: Integer;
lOldIndex: Integer;
begin
if GetEndPages = nil then Exit;
lOldIndex := RMPrinter.PrinterIndex;
liEndPage := TRMEndPages(GetEndPages)[0];
tmpForm := TRMPageSetupForm.Create(nil);
try
with tmpForm, liEndPage do
begin
PageSetting.PrinterName := RMPrinters.Printers[RMPrinter.PrinterIndex];
PageSetting.Title := TRMReport(Report).ReportInfo.Title;
PageSetting.DoublePass := TRMReport(Report).DoublePass;
PageSetting.PrintBackGroundPicture := TRMReport(Report).PrintbackgroundPicture;
PageSetting.ColorPrint := TRMReport(Report).ColorPrint;
PageSetting.MarginLeft := RMFromMMThousandths(mmMarginLeft, rmutMillimeters);
PageSetting.MarginTop := RMFromMMThousandths(mmMarginTop, rmutMillimeters);
PageSetting.MarginRight := RMFromMMThousandths(mmMarginRight, rmutMillimeters);
PageSetting.MarginBottom := RMFromMMThousandths(mmMarginBottom, rmutMillimeters);
PageSetting.PageOr := PageOrientation;
PageSetting.PageBin := PageBin;
PageSetting.PageSize := PageSize;
PageSetting.PageWidth := PageWidth;
PageSetting.PageHeight := PageHeight;
if PreviewPageSetup then
begin
if lOldIndex <> cmbPrinterNames.ItemIndex then
TRMReport(Report).ChangePrinter(RMPrinter.PrinterIndex, cmbPrinterNames.ItemIndex);
TRMReport(Report).ReportInfo.Title := PageSetting.Title;
TRMReport(Report).DoublePass := PageSetting.DoublePass;
TRMReport(Report).PrintbackgroundPicture := PageSetting.PrintbackgroundPicture;
TRMReport(Report).ColorPrint := PageSetting.ColorPrint;
mmMarginLeft := RMToMMThousandths(PageSetting.MarginLeft, rmutMillimeters);
mmMarginTop := RMToMMThousandths(PageSetting.MarginTop, rmutMillimeters);
mmMarginRight := RMToMMThousandths(PageSetting.MarginRight, rmutMillimeters);
mmMarginBottom := RMToMMThousandths(PageSetting.MarginBottom, rmutMillimeters);
PageOrientation := PageSetting.PageOr;
PageBin := PageSetting.PageBin;
p := PageSetting.PageSize;
w := PageSetting.PageWidth;
lhRgn := PageSetting.PageHeight;
for i := 0 to TRMReport(Report).Pages.Count - 1 do
begin
lPage := TRMReport(Report).Pages[i];
if lPage is TRMReportPage then
begin
TRMReportPage(lPage).mmMarginLeft := mmMarginLeft;
TRMReportPage(lPage).mmMarginTop := mmMarginTop;
TRMReportPage(lPage).mmMarginRight := mmMarginRight;
TRMReportPage(lPage).mmMarginBottom := mmMarginBottom;
TRMReportPage(lPage).ChangePaper(p, w, lhRgn, liEndPage.PageBin, liEndPage.PageOrientation);
end;
end;
TRMReport(Report).SaveReportOptions.SaveReportSetting(TRMReport(Report), '');
if Assigned(OnAfterPageSetup) then
OnAfterPageSetup(PageSetting);
if TRMReport(Report).CanRebuild then
begin
FPaintAllowed := False;
// SetLength(FVisiblePages, 0);
TRMReport(Report).PrepareReport;
Connect_1(Report);
end;
RedrawAll(True);
end;
end;
finally
tmpForm.Free;
end;
end;
procedure TRMPreview.AddPage;
begin
if FReport = nil then Exit;
TRMEndPages(GetEndPages).InsertFromEndPage(TRMEndPages(GetEndPages).Count,
TRMEndPages(GetEndPages).Pages[TRMEndPages(GetEndPages).Count - 1]);
RedrawAll(False);
end;
procedure TRMPreview.InsertPageBefore;
var
liEndPage: TRMEndPage;
liPageNo: Integer;
begin
if FReport = nil then Exit;
if FCurPage > TRMEndPages(GetEndPages).Count then
begin
liEndPage := TRMEndPages(GetEndPages).Pages[TRMEndPages(GetEndPages).Count - 1];
liPageNo := TRMEndPages(GetEndPages).Count - 1;
end
else
begin
liEndPage := TRMEndPages(GetEndPages).Pages[FCurPage - 1];
liPageNo := FCurPage - 1;
end;
TRMEndPages(GetEndPages).InsertFromEndPage(liPageNo, liEndPage);
TRMReport(FReport).Modified := True;
RedrawAll(False);
end;
procedure TRMPreview.InsertPageAfter;
begin
if FReport = nil then Exit;
if FCurPage > TRMEndPages(GetEndPages).Count then
AddPage
else
begin
TRMEndPages(GetEndPages).InsertFromEndPage(FCurPage, TRMEndPages(GetEndPages).Pages[FCurPage - 1]);
RedrawAll(False);
end;
TRMReport(FReport).Modified := True;
end;
procedure TRMPreview.DeletePage(PageNo: Integer);
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
if (PageNo >= 0) and (TRMEndPages(GetEndPages).Count > 1) then
begin
if MessageBox(0, PChar(RMLoadStr(SRemovePg)), PChar(RMLoadStr(SConfirm)),
mb_YesNo + mb_IconQuestion) = mrYes then
begin
TRMEndPages(GetEndPages).Delete(PageNo);
RedrawAll(True);
TRMReport(FReport).Modified := True;
end;
end;
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?