rm_preview.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,231 行 · 第 1/5 页
PAS
2,231 行
FHRuler.Orientation := roHorizontal;
FHRuler.SetBounds(FLeftPanel.Width, 0, FTopPanel1.Width, FTopPanel1.Height);
FVRuler := TRMDesignerRuler.Create(Self);
FVRuler.Parent := FLeftPanel;
FVRuler.Units := RMUnits;
FVRuler.Orientation := roVertical;
FVRuler.SetBounds(0, 0, FLeftPanel.Width, FLeftPanel.Height);
FStatusBar := TStatusBar.Create(Self);
with FStatusBar do
begin
Parent := Self;
Align := alBottom;
with Panels.Add do
begin
Width := 100;
end;
with Panels.Add do
begin
Width := 260;
end;
with Panels.Add do
begin
Width := 100;
end;
end;
FDrawPanel := TRMDrawPanel.Create(FScrollBox);
with FDrawPanel do
begin
Parent := FScrollBox;
Caption := '';
Align := alClient;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clGray;
FPreview := Self;
end;
FLastScale := 1;
FZoomMode := mdNone;
FKWheel := 30;
end;
destructor TRMPreview.Destroy;
begin
if FReport <> nil then
TRMReport(FReport).ReportInfo := FSaveReportInfo;
ClearOutLine;
inherited Destroy;
end;
function TRMPreview.CanModify: Boolean;
begin
Result := (RMDesignerClass <> nil) and Assigned(FReport) and TRMReport(Report).ModifyPrepared;
end;
procedure TRMPreview.Connect_1(aReport: TObject);
begin
FReport := aReport;
end;
{$HINTS OFF}
procedure TRMPreview.ShowReport(aReport: TObject);
begin
if Assigned(FOnBeforeShowReport) then FOnBeforeShowReport(aReport);
Connect(aReport);
end;
procedure TRMPreview.Disconnect;
begin
if FReport <> nil then
TRMReport(FReport).ReportInfo := FSaveReportInfo;
FReport := nil;
end;
procedure TRMPreview.ClearOutLine;
var
i: Integer;
lNode: TTreeNode;
begin
for i := 0 to FOutLineTreeView.Items.Count - 1 do
begin
lNode := FOutLineTreeView.Items[i];
if lNode.Data <> nil then
begin
Dispose(lNode.Data);
lNode.Data := nil;
end;
end;
FOutLineTreeView.Items.Clear;
end;
procedure TRMPreview.OnOutlineClickEvent(Sender: TObject);
var
lNode: TTreeNode;
lPages: TRMEndPages;
lPageNo, lPagePosition: Integer;
lPageRectHeight: Integer;
lPageHeight: Integer;
begin
lNode := FOutLineTreeView.Selected;
if (lNode = nil) or (lNode.Data = nil) then Exit;
lPages := TRMEndPages(GetEndPages);
lPageNo := PRMPreviewNodeDataInfo(lNode.Data).PageNo;
if (lPageNo < 0) or (lPageNo >= lPages.Count) then Exit;
lPagePosition := Round(PRMPreviewNodeDataInfo(lNode.Data).Position * FScale) +
RMToScreenPixels(lPages[lPageNo].mmMarginTop * FScale, rmutMMThousandths);
if lPageNo > 0 then
lPageRectHeight := lPages[lPageNo].PageRect.Bottom - lPages[lPageNo - 1].PageRect.Bottom
else
lPageRectHeight := lPages[lPageNo].PageRect.Bottom;
lPageRectHeight := lPageRectHeight - 10;
lPageHeight := Round(lPages[lPageNo].PrinterInfo.PageHeight * FScale);
FCurPage := -1;
CurPage := lPageNo + 1;
VScrollBar.Position := VScrollBar.Position +
Round(lPagePosition * lPageRectHeight / lPageHeight) + 10 - 5;
end;
procedure TRMPreview.Connect(aReport: TObject);
var
lParentForm: TForm;
procedure _SetOutLine; // 设置outline
var
i, j: Integer;
lStr: string;
lInfo: PRMPreviewNodeDataInfo;
lParentNode, lNode: TTreeNode;
lCaption: string;
lPageNo, lPosition, lNodeLevel: Integer;
lTmpPos, lOldNodeLevel: Integer;
lEndPages: TRMEndPages;
begin
FOutLineTreeView.Items.BeginUpdate;
try
lEndPages := TRMEndPages(GetEndPages);
ClearOutLine;
// lNode := FOutLine.Items.AddChild(nil, '目录');
// lNode.Data := nil;
lNode := nil;
lParentNode := lNode;
lOldNodeLevel := 0;
{ lEndPages.OutLines.Add('1' + #1 + '0' + #1 + '100' + #1 + '0');
lEndPages.OutLines.Add('2' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('3' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('4' + #1 + '1' + #1 + '100' + #1 + '2');
lEndPages.OutLines.Add('5' + #1 + '1' + #1 + '100' + #1 + '2');
lEndPages.OutLines.Add('6' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('7' + #1 + '1' + #1 + '100' + #1 + '0');
}for i := 0 to lEndPages.OutLines.Count - 1 do
begin
lStr := lEndPages.OutLines[i];
lTmpPos := 1;
lCaption := RMStrGetToken(lStr, #1, lTmpPos);
lPageNo := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
lPosition := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
lNodeLevel := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
if lNodeLevel > lOldNodeLevel then
begin
lParentNode := lNode;
end
else if lNodeLevel < lOldNodeLevel then
begin
lParentNode := lNode;
for j := lNodeLevel to lOldNodeLevel do
begin
if lParentNode = nil then Break;
lParentNode := lParentNode.Parent;
end;
end;
lNode := FOutLineTreeView.Items.AddChild(lParentNode, lCaption);
New(lInfo);
lInfo.PageNo := lPageNo;
lInfo.Position := lPosition;
lNode.Data := lInfo;
lOldNodeLevel := lNodeLevel;
end;
finally
FOutLineTreeView.FullExpand;
FOutLineTreeView.Items.EndUpdate;
ShowOutline(FOutLineTreeView.Items.Count > 0);
end;
end;
begin
FLeftPanel.Visible := Options.RulerVisible;
FTopPanel.Visible := Options.RulerVisible;
FHRuler.Units := Options.RulerUnit;
FVRuler.Units := Options.RulerUnit;
Connect_1(aReport);
if aReport = nil then Exit;
FSaveReportInfo := TRMReport(FReport).ReportInfo;
case TRMReport(FReport).InitialZoom of
pzDefault:
begin
FScale := 1;
FZoomMode := mdNone;
end;
pzPageWidth: FZoomMode := mdPageWidth;
pzOnePage: FZoomMode := mdOnePage;
pzTwoPages: FZoomMode := mdTwoPages;
end;
_SetOutLine;
CurPage := 1;
RedrawAll(True);
{$IFDEF Delphi4}
lParentForm := FParentForm;
if (lParentForm = nil) and (Parent <> nil) and (Parent is TForm) then
lParentForm := TForm(Parent);
if lParentForm <> nil then
begin
// lParentForm.OnMouseWheelUp := OnMouseWheelUpEvent;
// lParentForm.OnMouseWheelDown := OnMouseWheelDownEvent;
end;
{$ENDIF}
end;
{$HINTS ON}
procedure TRMPreview.DoStatusChange;
begin
if Assigned(FOnStatusChange) then
FOnStatusChange(Self);
end;
procedure TRMPreview.SetToCurPage;
begin
if (GetEndPages = nil) or (FCurPage < 1) then Exit;
TRMEndPages(GetEndPages).CurPageNo := FCurPage; //by waw
if FOffsetTop <> TRMEndPages(GetEndPages)[FCurPage - 1].PageRect.Top - 10 then
VScrollBar.Position := TRMEndPages(GetEndPages)[FCurPage - 1].PageRect.Top - 10;
end;
procedure TRMPreview.ShowPageNum;
begin
if GetEndPages = nil then
FStatusBar.Panels[0].Text := ''
// FLabel.Caption := ''
else
begin
if Assigned(FOnPageChanged) then
FOnPageChanged(Self);
FStatusBar.Panels[0].Text {FLabel.Caption} := RMLoadStr(SPg) + ' ' + IntToStr(FCurPage) + '/' +
IntToStr(TRMEndPages(GetEndPages).Count);
TRMEndPages(GetEndPages).CurPageNo := FCurPage;
end;
end;
procedure TRMPreview.LoadFromFile(aFileName: string);
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
FPaintAllowed := False;
try
TRMReport(FReport).LoadPreparedReport(aFileName);
// SetLength(FVisiblePages, 0);
finally
Connect(FReport);
end;
end;
procedure TRMPreview.LoadFromFiles(aFileNames: TStrings);
var
i: Integer;
procedure _AppendReport(const aFileName: string; aEndPages: TRMEndPages);
var
lStream: TFileStream;
begin
if not FileExists(aFileName) then Exit;
lStream := TFileStream.Create(aFileName, fmOpenRead);
try
aEndPages.AppendFromStream(lStream);
finally
lStream.Free;
end;
end;
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
FPaintAllowed := False;
try
for i := 0 to aFileNames.Count - 1 do
begin
if i = 0 then
TRMReport(FReport).LoadPreparedReport(aFileNames[i])
else
_AppendReport(aFileNames[i], TRMReport(FReport).EndPages);
end;
finally
Connect(FReport);
end;
end;
procedure TRMPreview.SaveToFile(aFileName: string; aIndex: Integer);
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
FPaintAllowed := False;
try
if aIndex < 2 then
begin
aFileName := ChangeFileExt(aFileName, '.rmp');
TRMReport(FReport).SavePreparedReport(aFileName);
end
else //export输出
begin
TRMReport(Report).ExportTo(TRMExportFilter(RMFilters(aIndex - 2).Filter),
ChangeFileExt(aFileName, Copy(RMFilters(aIndex - 2).FilterExt, 2, 255)));
end;
finally
Connect_1(FReport);
RedrawAll(False);
end;
end;
procedure TRMPreview.ExportToFile(aExport: TComponent; aFileName: string);
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
FPaintAllowed := False;
try
TRMReport(Report).ExportTo(TRMExportFilter(aExport), aFileName);
finally
RedrawAll(False);
end;
end;
type
THackExport = class(TRMExportFilter)
end;
procedure TRMPreview.ExportToXlsFile;
var
i: Integer;
lXLSExport: TRMExportFilter;
lSaveShowDialog: Boolean;
lFound: Boolean;
begin
if (FReport = nil) or (GetEndPages = nil) then Exit;
lXLSExport := nil;
lFound := False;
for i := 0 to RMFiltersCount - 1 do
begin
lXLSExport := TRMExportFilter(RMFilters(i).Filter);
if lXLSExport.IsXLSExport then
begin
lFound := True;
Break;
end;
end;
if lFound then
begin
FPaintAllowed := False;
lSaveShowDialog := lXLSExport.ShowDialog;
try
if lXLSExport.ShowModal = mrOK then
begin
lXLSExport.ShowDialog := False;
ExportToFile(lXLSExport, THackExport(lXLSExport).FileName);
end;
finally
lXLSExport.ShowDialog := lSaveShowDialog;
RedrawAll(False);
end;
end;
end;
procedure TRMPreview.OnResizeEvent(Sender: TObject);
var
i, j, y, d, nx, maxx, maxy, maxdy, curx: Integer;
lPageWidth, lPageHeight: Integer;
lPages: TRMEndPages;
begin
if (GetEndPages = nil) or (TRMEndPages(GetEndPages).Count < 1) then Exit;
lPages := TRMEndPages(GetEndPages);
FPaintAllowed := False;
lPageWidth := lPages[FCurPage - 1].PrinterInfo.PageWidth;
lPageHeight := lPages[FCurPage - 1].PrinterInfo.PageHeight;
case FZoomMode of
mdPageWidth: FScale := (FDrawPanel.Width - 20) / lPageWidth;
mdOnePage: FScale := (FDrawPanel.Height - 20) / lPageHeight;
mdTwoPages: FScale := (FDrawPanel.Width - 30) / (2 * lPageWidth);
mdPrinterZoom: FScale := RMPrinter.FactorY;
end;
nx := 0;
maxx := 10;
j := 0;
for i := 0 to lPages.Count - 1 do
begin
d := maxx + 10 + Round(lPages[i].PrinterInfo.PageWidth * FScale);
if d > FDrawPanel.Width then
begin
if nx < j then
nx := j;
j := 0;
maxx := 10;
end
else
begin
maxx := d;
Inc(j);
if i = lPages.Count - 1 then
begin
if nx < j then
nx := j;
end;
end;
end;
if nx = 0 then
nx := 1;
if FZoomMode = mdOnePage then
nx := 1;
if FZoomMode = mdTwoPages then
nx := 2;
y := 10;
i := 0;
maxx := 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?