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

📄 frxpreview.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
📖 第 1 页 / 共 4 页
字号:
begin
  FZoom:= Value;
  if FZoom < 0.25 then
    FZoom:= 0.25;

  if FZoomMode = zmManyPages then
    ZoomMode:= zmDefault;

  FZoomMode:= zmDefault;
  UpdateZoom;
end;

procedure TfrxPreview.SetZoomMode(const Value:TfrxZoomMode);
begin
  FZoomMode:= Value;
  UpdatePages;
  UpdateZoom;
end;

function TfrxPreview.GetOutlineVisible:Boolean;
begin
  Result:= FOutline.Visible;
end;

procedure TfrxPreview.SetOutlineVisible(const Value:Boolean);
begin
  FOutline.Visible:= Value;
  FSplitter.Visible:= Value;
  FSplitter.SetBounds(1000, 0, 2, 0);
end;

procedure TfrxPreview.SetTool(const Value:TfrxPreviewTool);
var
  c:TCursor;
begin
  FTool:= Value;

  if FTool = ptHand then
    c:= crHand
  else if FTool = ptZoom then
    c:= crZoom else
    c:= crDefault;

  FWorkspace.FDefaultCursor:= c;
  FWorkspace.Cursor:= c;
end;

procedure TfrxPreview.SetPageNo(const Value:Integer);
begin
  FPageNo:= Value;
  if FPageNo < 1 then
    FPageNo:= 1;
  if FPageNo > PageCount then
    FPageNo:= PageCount;

  FWorkspace.SetToPageNo(FPageNo);
  UpdatePageNumbers;
end;

procedure TfrxPreview.UpdatePageNumbers;
begin
  if Assigned(FOnPageChanged) then
    FOnPageChanged(Self, FPageNo);
end;

function TfrxPreview.GetPageCount:Integer;
begin
  if PreviewPages<>nil then
    Result:= PreviewPages.Count else
    Result:= 0;
end;

procedure TfrxPreview.ShowMessage(const s:String);
begin
  FMessagePanel.SetBounds((Width-260) div 2, (Height-75) div 3, 260, 75);
  FMessageLabel.Caption:= s;
  FMessagePanel.Show;
  FMessagePanel.Update;
end;

procedure TfrxPreview.HideMessage;
begin
  FMessagePanel.Hide;
  FCancelButton.Hide;
end;

procedure TfrxPreview.First;
begin
  PageNo:= 1;
end;

procedure TfrxPreview.Next;
begin
  PageNo:= PageNo+1;
end;

procedure TfrxPreview.Prior;
begin
  PageNo:= PageNo-1;
end;

procedure TfrxPreview.Last;
begin
  PageNo:= PageCount;
end;

procedure TfrxPreview.Print;
begin
  if FRunning then Exit;
  try
    PreviewPages.CurPreviewPage:= PageNo;
    PreviewPages.Print;
  finally
    Unlock;
  end;
end;

procedure TfrxPreview.SaveToFile;
var
  SaveDlg:TSaveDialog;
begin
  if FRunning then Exit;
  SaveDlg:= TSaveDialog.Create(Application);
  try
    SaveDlg.Filter:= frxResources.Get('clFP3files')+' (*.fp3)|*.fp3';
    if SaveDlg.Execute then
    begin
      FWorkspace.Repaint;
      SaveToFile(ChangeFileExt(SaveDlg.FileName, '.fp3'));
    end;
  finally
    SaveDlg.Free;
  end;
end;

procedure TfrxPreview.SaveToFile(FileName:String);
begin
  if FRunning then Exit;
  try
    Lock;
    ShowMessage(frxResources.Get('clSaving'));
    PreviewPages.SaveToFile(FileName);
  finally
    Unlock;
  end;
end;

procedure TfrxPreview.LoadFromFile;
var
  OpenDlg:TOpenDialog;
begin
  if FRunning then Exit;
  OpenDlg:= TOpenDialog.Create(nil);
  try
    OpenDlg.Options:= [ofHideReadOnly];
    OpenDlg.Filter:= frxResources.Get('clFP3files')+' (*.fp3)|*.fp3';
    if OpenDlg.Execute then
    begin
      FWorkspace.Repaint;
      LoadFromFile(OpenDlg.FileName);
    end;
  finally
    OpenDlg.Free;
  end;
end;

procedure TfrxPreview.LoadFromFile(FileName:String);
begin
  if FRunning then Exit;
  try
    Lock;
    ShowMessage(frxResources.Get('clLoading'));
    PreviewPages.LoadFromFile(FileName);
    OutlineVisible:= Report.PreviewOptions.OutlineVisible;
  finally
    UpdateOutline;
    UpdatePages;
    Unlock;
    PageNo:= 1;
  end;
end;

procedure TfrxPreview.Export(Filter:TfrxCustomExportFilter);
begin
  if FRunning then Exit;
  try
    PreviewPages.CurPreviewPage:= PageNo;
    if Report.DotMatrixReport and (frxDotMatrixExport<>nil) and
      (Filter.ClassName = 'TfrxTextExport') then
      Filter:= frxDotMatrixExport;
    PreviewPages.Export(Filter);
  finally
    Unlock;
  end;
end;

procedure TfrxPreview.PageSetupDlg;
var
  APage:TfrxReportPage;

  procedure UpdateReport;
  var
    i:Integer;
  begin
    for i:= 0 to Report.PagesCount-1 do
      if Report.Pages[i] is TfrxReportPage then
        with TfrxReportPage(Report.Pages[i]) do
        begin
          Orientation:= APage.Orientation;
          PaperWidth:= APage.PaperWidth;
          PaperHeight:= APage.PaperHeight;
          PaperSize:= APage.PaperSize;

          LeftMargin:= APage.LeftMargin;
          RightMargin:= APage.RightMargin;
          TopMargin:= APage.TopMargin;
          BottomMargin:= APage.BottomMargin;
        end;
  end;

begin
  if FRunning then Exit;
  APage:= PreviewPages.Page[PageNo-1];

  with TfrxPageSettingsForm.Create(Application) do
  begin
    Page:= APage;
    Report:= Self.Report;
    if ShowModal = mrOk then
    begin
      if NeedRebuild then
      begin
        UpdateReport;
        Self.Report.PrepareReport;
      end
      else
      begin
        try
          Lock;
          PreviewPages.ModifyPage(PageNo-1, Page);
          UpdatePages;
        finally
          Unlock;
        end;
      end;
    end;
    Free;
  end;
end;

procedure TfrxPreview.Find;
begin
  with TfrxSearchDialog.Create(Application) do
  begin
    if ShowModal = mrOk then
    begin
      TextToFind:= TextE.Text;
      CaseSensitive:= CaseCB.Checked;
      if TopCB.Checked then
        FWorkspace.FLastFoundPage:= 0 else
        FWorkspace.FLastFoundPage:= PageNo-1;
      LastFoundRecord:=-1;
      FWorkspace.FindText;
    end;
    Free;
  end;

  FAllowF3:= True;
end;

procedure TfrxPreview.FindNext;
begin
  if FAllowF3 then
    FWorkspace.FindText;
end;

procedure TfrxPreview.Edit;
var
  r:TfrxReport;
  p:TfrxReportPage;
  SourcePage:TfrxPage;

  procedure RemoveBands;
  var
    i:Integer;
    l:TList;
    c:TfrxComponent;
  begin
    l:= p.AllObjects;

    for i:= 0 to l.Count-1 do
    begin
      c:= l[i];
      if c is TfrxView then
      begin
        TfrxView(c).DataField:= '';
        TfrxView(c).DataSet:= nil;
      end;

      if c.Parent<>p then
      begin
        c.Left:= c.AbsLeft;
        c.Top:= c.AbsTop;
        c.ParentFont:= False;
        c.Parent:= p;
      end;
    end;

    for i:= 0 to l.Count-1 do
    begin
      c:= l[i];
      if c is TfrxBand then
        c.Free;
    end;
  end;

begin
  SourcePage:= PreviewPages.Page[PageNo-1];
  if SourcePage is TfrxDMPPage then
    p:= TfrxDMPPage.Create(nil) else
    p:= TfrxReportPage.Create(nil);
  r:= nil;
  try
    p.AssignAll(SourcePage);
    RemoveBands;
    r:= TfrxReport.Create(nil);
    p.Parent:= r;
    if r.DesignPreviewPage then
      try
        Lock;
        PreviewPages.ModifyPage(PageNo-1, TfrxReportPage(r.Pages[0]));
        UpdatePages;
      finally
        Unlock;
      end;
  finally
    r.Free;
  end;
end;

procedure TfrxPreview.EditTemplate;
var
  r:TfrxReport;
  i:Integer;
begin
  r:= TfrxReport.Create(nil);
  try
    for i:= 0 to TfrxPreviewPages(PreviewPages).SourcePages.Count-1 do
      r.Objects.Add(TfrxPreviewPages(PreviewPages).SourcePages[i]);
    r.DesignReport;
  finally
    r.Objects.Clear;
    r.Free;
  end;
end;

procedure TfrxPreview.Clear;
begin
  if FRunning then Exit;
  Lock;
  try
    PreviewPages.Clear;
    UpdatePages;
  finally
    Unlock;
  end;

  UpdateOutline;
  PageNo:= 0;
  with FWorkspace do
  begin
    HorzRange:= 0;
    VertRange:= 0;
  end;
end;

procedure TfrxPreview.AddPage;
begin
  if FRunning then Exit;
  PreviewPages.AddEmptyPage(PageNo-1);
  UpdatePages;
  UpdateZoom;
  PageNo:= PageNo;
end;

procedure TfrxPreview.DeletePage;
begin
  if FRunning then Exit;
  PreviewPages.DeletePage(PageNo-1);
  if PageNo >= PageCount then
    PageNo:= PageNo-1;
  UpdatePages;
  UpdatePageNumbers;
  UpdateZoom;
end;

procedure TfrxPreview.Lock;
begin
  FLocked:= True;
end;

procedure TfrxPreview.Unlock;
begin
  HideMessage;
  FLocked:= False;
  FPageNo:= 1;
  UpdateZoom;
  FWorkspace.Repaint;
end;

procedure TfrxPreview.SetPosition(PageN, Top:Integer);
var
  Pos:Integer;
  Page:TfrxReportPage;
begin
  if PageN > PageCount then
    PageN:= PageCount;
  if PageN <= 0 then
    PageN:= 1;

  Page:= PreviewPages.Page[PageN-1];
  if Top = 0 then
    Pos:= 0 else
    Pos:= Round((Top+Page.TopMargin * fr01cm) * Zoom);

  FWorkspace.VertPosition:=
    FWorkspace.FPageList.GetPageBounds(PageN-1, FWorkspace.ClientWidth, FZoom).Top-10+Pos;
end;

procedure TfrxPreview.UpdateZoom;
var
  PageSize:TPoint;
begin
  if FLocked or (PageCount = 0) then Exit;
  PageSize:= PreviewPages.PageSize[PageNo-1];

  case FZoomMode of
    zmWholePage:
      FZoom:= (FWorkspace.ClientHeight-20) / PageSize.Y;
    zmPageWidth:
      FZoom:= (FWorkspace.ClientWidth-20) / PageSize.X;
    zmManyPages:
      FZoom:= (FWorkspace.ClientWidth-32) / (PageSize.X * 2);
  end;

  FWorkspace.UpdateScrollBars;
  FWorkspace.Repaint;
  if Owner is TfrxPreviewForm then
    TfrxPreviewForm(Owner).UpdateZoom;
end;

procedure TfrxPreview.UpdateOutline;
var
  Outline:TfrxCustomOutline;

  procedure DoUpdate(RootNode:TTreeNode);
  var
    i, n:Integer;
    Node:TTreeNode;
    Page, Top:Integer;
    Text:String;
  begin
    n:= Outline.Count;
    for i:= 0 to n-1 do
    begin
      Outline.GetItem(i, Text, Page, Top);
      Node:= FOutline.Items.AddChild(RootNode, Text);
      Node.Data:= Pointer(Page+1+Top div 2 * $100000);

      Outline.LevelDown(i);
      DoUpdate(Node);
      Outline.LevelUp;
    end;
  end;

begin
  FOutline.Items.BeginUpdate;
  FOutline.Items.Clear;
  Outline:= PreviewPages.Outline;
  Outline.LevelRoot;
  DoUpdate(nil);
  if Report.PreviewOptions.OutlineExpand then
    FOutline.FullExpand;
  if FOutline.Items.Count > 0 then
    FOutline.TopItem:= FOutline.Items[0];
  FOutline.Items.EndUpdate;
end;

procedure TfrxPreview.UpdatePages;
var
  i:Integer;
  PageSize:TPoint;
begin

⌨️ 快捷键说明

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