⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frxpreview.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  { clear find settings }
  FAllowF3:= False;
  FWorkspace.FEMFImagePage:=-1;

  FWorkspace.FPageList.Clear;
  if PreviewPages = nil then Exit;

  if FZoomMode = zmManyPages then
    FWorkspace.FPageList.ColumnCount:= 2 else
    FWorkspace.FPageList.ColumnCount:= 1;

  for i:= 0 to PageCount-1 do
  begin
    PageSize:= PreviewPages.PageSize[i];
    FWorkspace.FPageList.AddPage(PageSize.X, PageSize.Y);
  end;
end;

procedure TfrxPreview.TreeClick(Sender:TObject);
var
  Node:TTreeNode;
  PageN, Top:Integer;
begin
  Node:= FOutline.Selected;
  if Node = nil then Exit;

  PageN:= Integer(Node.Data) mod $100000;
  Top:= Integer(Node.Data) div $100000 * 2;
  SetPosition(PageN, Top);
  SetFocus;
end;

procedure TfrxPreview.InternalOnProgressStart(Sender:TfrxReport;
  ProgressType:TfrxProgressType; Progress:Integer);
begin
  Clear;
  FRunning:= True;
  if Owner is TfrxPreviewForm then
    TfrxPreviewForm(Owner).UpdateControls;
end;

procedure TfrxPreview.InternalOnProgress(Sender:TfrxReport;
  ProgressType:TfrxProgressType; Progress:Integer);
var
  PageSize:TPoint;
begin
  if Report.Engine.FinalPass then
  begin
    PageSize:= Report.PreviewPages.PageSize[Progress];
    FWorkspace.FPageList.AddPage(PageSize.X, PageSize.Y);
  end;

  if Progress = 0 then
  begin
    FOutline.Items.Clear;
    PageNo:= 1;
    UpdateZoom;
    if Owner is TfrxPreviewForm then
      TfrxPreviewForm(Owner).CancelB.Caption:= frxResources.Get('clCancel');
    FTick:= GetTickCount;
  end
  else if Progress = 1 then
  begin
    FTick:= GetTickCount-FTick;
    if FTick < 5 then
      FTick:= 50
    else if FTick < 10 then
      FTick:= 20
    else
      FTick:= 5;
    PageNo:= 1;
    UpdateZoom;
  end
  else if Progress mod Integer(FTick) = 0 then
  begin
    UpdatePageNumbers;
    FWorkspace.UpdateScrollBars;
  end;

  Application.ProcessMessages;
end;

procedure TfrxPreview.InternalOnProgressStop(Sender:TfrxReport;
  ProgressType:TfrxProgressType; Progress:Integer);
begin
  FRunning:= False;
  UpdatePageNumbers;
  FWorkspace.UpdateScrollBars;
  UpdateZoom;
  UpdateOutline;
  if Owner is TfrxPreviewForm then
  begin
    TfrxPreviewForm(Owner).CancelB.Caption:= frxResources.Get('clClose');
    TfrxPreviewForm(Owner).StatusBar.Panels[1].Text:= '';
    TfrxPreviewForm(Owner).UpdateControls;
  end;
end;

procedure TfrxPreview.OnCancel(Sender:TObject);
begin
  Report.Terminated:= True;
end;

procedure TfrxPreview.Cancel;
begin
  if FRunning then
    OnCancel(Self);
end;

procedure TfrxPreview.MouseWheelScroll(Delta:Integer; Horz:Boolean = False;
  Zoom:Boolean = False);
begin
  if Delta<>0 then
    if Zoom then
    begin
      FZoom:= FZoom+Round(Delta / Abs(Delta)) / 10;
      if FZoom < 0.3 then
        FZoom:= 0.3;
      SetZoom(FZoom);
    end
    else
    begin
      with FWorkspace do
      begin
        if Horz then
          HorzPosition:= HorzPosition+Round(-Delta / Abs(Delta)) * 20
        else
          VertPosition:= VertPosition+Round(-Delta / Abs(Delta)) * 20;
      end;
    end;
end;

{ TfrxPreviewForm }

procedure TfrxPreviewForm.FormCreate(Sender:TObject);
begin
  frxResources.LocalizeForm(Self);
  ZoomCB.Items.Clear;
  ZoomCB.Items.Add('25%');
  ZoomCB.Items.Add('50%');
  ZoomCB.Items.Add('75%');
  ZoomCB.Items.Add('100%');
  ZoomCB.Items.Add('150%');
  ZoomCB.Items.Add('200%');
  ZoomCB.Items.Add(frxResources.Get('zmPageWidth'));
  ZoomCB.Items.Add(frxResources.Get('zmWholePage'));
  frxAssignImages(Image1.Picture.Bitmap, 16, 16, MainImages);
  Image1.Free;

  FPreview:= TfrxPreview.Create(Self);
  FPreview.Parent:= Self;
  FPreview.Align:= alClient;
  FPreview.OnPageChanged:= OnPageChanged;
  ActiveControl:= FPreview;
end;

procedure TfrxPreviewForm.Init;
var
  i:Integer;
  m:TMenuItem;
begin
  with Report.PreviewOptions do
  begin
    if Maximized then
      WindowState:= wsMaximized;
    if MDIChild and not (csDesigning in Report.ComponentState) then
      FormStyle:= fsMDIChild;
    FPreview.OutlineVisible:= OutlineVisible;
    FPreview.FOutline.Width:= OutlineWidth;
    FPreview.Zoom:= Zoom;
    FPreview.ZoomMode:= ZoomMode;

    NewPageB.Enabled:= AllowEdit;
    DelPageB.Enabled:= AllowEdit;
    DesignerB.Enabled:= AllowEdit;

    PrintB.Visible:= pbPrint in Buttons;
    OpenB.Visible:= pbLoad in Buttons;
    SaveB.Visible:= pbSave in Buttons;
    ExportB.Visible:= pbExport in Buttons;
    FindB.Visible:= pbFind in Buttons;

    ZoomWholePageB.Visible:= pbZoom in Buttons;
    ZoomPageWidthB.Visible:= pbZoom in Buttons;
    Zoom100B.Visible:= pbZoom in Buttons;
    Zoom50B.Visible:= pbZoom in Buttons;
    Sep3.Visible:= pbZoom in Buttons;
    if not (pbZoom in Buttons) then
      Sep1.Free;

    OutlineB.Visible:= pbOutline in Buttons;
    OutlineB.Down:= OutlineVisible;
    PageSettingsB.Visible:= pbPageSetup in Buttons;
    if not (OutlineB.Visible or PageSettingsB.Visible) then
      Sep2.Free;

    HandToolB.Visible:= pbTools in Buttons;
    ZoomToolB.Visible:= pbTools in Buttons;
    if not (pbTools in Buttons) then
      Sep5.Free;

    NewPageB.Visible:= pbEdit in Buttons;
    DelPageB.Visible:= pbEdit in Buttons;
    DesignerB.Visible:= pbEdit in Buttons;
    if not (pbEdit in Buttons) then
      Sep7.Free;

    FirstB.Visible:= pbNavigator in Buttons;
    PriorB.Visible:= pbNavigator in Buttons;
    NextB.Visible:= pbNavigator in Buttons;
    LastB.Visible:= pbNavigator in Buttons;
    Sep4.Visible:= pbNavigator in Buttons;
    if not (pbNavigator in Buttons) then
      Sep6.Free;

    Toolbar.ShowCaptions:= ShowCaptions;
  end;

  for i:= 0 to frxExportFilters.Count-1 do
  begin
    if frxExportFilters[i].Filter = frxDotMatrixExport then
      continue;
    m:= TMenuItem.Create(ExportPopup);
    ExportPopup.Items.Add(m);
    m.Caption:= TfrxCustomExportFilter(frxExportFilters[i].Filter).GetDescription+'...';
    m.Tag:= i;
    m.OnClick:= ExportMIClick;
  end;

  if Report.ReportOptions.Name<>'' then
    Caption:= Report.ReportOptions.Name;
  FPreview.Init;
end;

procedure TfrxPreviewForm.UpdateControls;

  procedure EnableControls(cAr:array of TControl; Enabled:Boolean);
  var
    i:Integer;
  begin
    for i:= 0 to High(cAr) do
    begin
      cAr[i].Enabled:= Enabled;
      if (cAr[i] is TToolButton) and not Enabled then
        TToolButton(cAr[i]).Down:= False;
    end;
  end;

begin
  EnableControls([PrintB, OpenB, SaveB, ExportB, FindB, PageSettingsB],
    (not FPreview.FRunning) and (FPreview.PageCount > 0));
  EnableControls([NewPageB, DelPageB, DesignerB],
    not FPreview.FRunning and Report.PreviewOptions.AllowEdit);
end;

procedure TfrxPreviewForm.PrintBClick(Sender:TObject);
begin
  if not frxPrinters.HasPhysicalPrinters then
    frxErrorMsg(frxResources.Get('clNoPrinters')) else
    FPreview.Print;
  Enabled:= True;
end;

procedure TfrxPreviewForm.OpenBClick(Sender:TObject);
begin
  FPreview.LoadFromFile;
end;

procedure TfrxPreviewForm.SaveBClick(Sender:TObject);
begin
  FPreview.SaveToFile;
end;

procedure TfrxPreviewForm.FindBClick(Sender:TObject);
begin
  FPreview.Find;
end;

procedure TfrxPreviewForm.ZoomWholePageBClick(Sender:TObject);
begin
  FPreview.ZoomMode:= zmWholePage;
  UpdateZoom;
end;

procedure TfrxPreviewForm.ZoomPageWidthBClick(Sender:TObject);
begin
  FPreview.ZoomMode:= zmPageWidth;
  UpdateZoom;
end;

procedure TfrxPreviewForm.Zoom100BClick(Sender:TObject);
begin
  FPreview.Zoom:= 1;
  UpdateZoom;
end;

procedure TfrxPreviewForm.Zoom50BClick(Sender:TObject);
begin
  FPreview.ZoomMode:= zmManyPages;
  UpdateZoom;
end;

function TfrxPreviewForm.GetReport:TfrxReport;
begin
  Result:= Preview.Report;
end;

procedure TfrxPreviewForm.UpdateZoom;
begin
  ZoomCB.Text:= IntToStr(Round(FPreview.Zoom * 100))+'%';
end;

procedure TfrxPreviewForm.ZoomCBClick(Sender:TObject);
var
  s:String;
begin
  FPreview.SetFocus;

  if ZoomCB.ItemIndex = 6 then
    ZoomPageWidthBClick(nil)
  else if ZoomCB.ItemIndex = 7 then
    ZoomWholePageBClick(nil)
  else
  begin
    s:= ZoomCB.Text;

    if Pos('%', s)<>0 then
      s[Pos('%', s)]:= ' ';
    while Pos(' ', s)<>0 do
      Delete(s, Pos(' ', s), 1);

    if s<>'' then
      FPreview.Zoom:= frxStrToFloat(s) / 100;
  end;

  PostMessage(Handle, WM_UPDATEZOOM, 0, 0);
end;

procedure TfrxPreviewForm.FormKeyDown(Sender:TObject; var Key:Word;
  Shift:TShiftState);
begin
  if Key = VK_ESCAPE then
    CancelBClick(Self);
end;

procedure TfrxPreviewForm.FormKeyPress(Sender:TObject; var Key:Char);
begin
  if Key = #13 then
  begin
    if ActiveControl = ZoomCB then
      ZoomCBClick(nil);
    if ActiveControl = PageE then
      PageEClick(nil);
  end;
end;

procedure TfrxPreviewForm.WMUpdateZoom(var Message:TMessage);
begin
  UpdateZoom;
end;

procedure TfrxPreviewForm.OutlineBClick(Sender:TObject);
begin
  FPreview.OutlineVisible:= OutlineB.Down;
  FPreview.UpdateZoom;
end;

procedure TfrxPreviewForm.PageSettingsBClick(Sender:TObject);
begin
  FPreview.PageSetupDlg;
end;

procedure TfrxPreviewForm.SelectToolBClick(Sender:TObject);
begin
  if HandToolB.Down then
    FPreview.Tool:= ptHand
  else if ZoomToolB.Down then
    FPreview.Tool:= ptZoom
end;

procedure TfrxPreviewForm.OnPageChanged(Sender:TfrxPreview; PageNo:Integer);
var
  FirstPass:Boolean;
begin
  FirstPass:= False;
  if FPreview.PreviewPages<>nil then
    FirstPass:= not FPreview.PreviewPages.Engine.FinalPass;

  if FirstPass then
    StatusBar.Panels[0].Text:= frxResources.Get('clFirstPass')+
      IntToStr(FPreview.PageCount)
  else
    StatusBar.Panels[0].Text:= Format(frxResources.Get('clPageOf'),
      [PageNo, FPreview.PageCount]);
  PageE.Text:= IntToStr(PageNo);
end;

procedure TfrxPreviewForm.PageEClick(Sender:TObject);
begin
  FPreview.PageNo:= StrToInt(PageE.Text);
  FPreview.SetFocus;
end;

procedure TfrxPreviewForm.FirstBClick(Sender:TObject);
begin
  FPreview.First;
end;

procedure TfrxPreviewForm.PriorBClick(Sender:TObject);
begin
  FPreview.Prior;
end;

procedure TfrxPreviewForm.NextBClick(Sender:TObject);
begin
  FPreview.Next;
end;

procedure TfrxPreviewForm.LastBClick(Sender:TObject);
begin
  FPreview.Last;
end;

procedure TfrxPreviewForm.FormMouseWheel(Sender:TObject;
  Shift:TShiftState; WheelDelta:Integer; MousePos:TPoint;
  var Handled:Boolean);
begin
  FPreview.MouseWheelScroll(WheelDelta, False, ssCtrl in Shift);
end;

procedure TfrxPreviewForm.DesignerBClick(Sender:TObject);
begin
  FPreview.Edit;
end;

procedure TfrxPreviewForm.FormCloseQuery(Sender:TObject;
  var CanClose:Boolean);
begin
  CanClose:= not FPreview.FRunning;
end;

procedure TfrxPreviewForm.FormClose(Sender:TObject; var Action:TCloseAction);
begin
  if FFreeOnClose then
    Action:= caFree;
end;

procedure TfrxPreviewForm.NewPageBClick(Sender:TObject);
begin
  FPreview.AddPage;
end;

procedure TfrxPreviewForm.DelPageBClick(Sender:TObject);
begin
  FPreview.DeletePage;
end;

procedure TfrxPreviewForm.CancelBClick(Sender:TObject);
begin
  if FPreview.FRunning then
    FPreview.Cancel else
    Close;
end;

procedure TfrxPreviewForm.ExportMIClick(Sender:TObject);
begin
  FPreview.Export(TfrxCustomExportFilter(frxExportFilters[TMenuItem(Sender).Tag].Filter));
  Enabled:= True;
end;

procedure TfrxPreviewForm.DesignerBMouseUp(Sender:TObject;
  Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
var
  pt:TPoint;
begin
  pt:= DesignerB.ClientToScreen(Point(0, 0));
  if Button = mbRight then
    HiddenMenu.Popup(pt.X, pt.Y);
end;

procedure TfrxPreviewForm.Showtemplate1Click(Sender:TObject);
begin
  FPreview.EditTemplate;
end;

procedure TfrxPreviewForm.SetMessageText(const Value:String);
begin
  StatusBar.Panels[1].Text:= Value;
  Application.ProcessMessages;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -