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

📄 frxdesgn.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    Lock;
    try
      if not Report.LoadFromFile(FileName) then
        Error;
    except
      EmptyReport;
    end;
    Report.EngineOptions.SilentMode:= SaveSilentMode;
    ReloadReport;
    Exit;
  end;

  if UseOnLoadEvent then
    if (frxDesignerComp<>nil) and Assigned(frxDesignerComp.FOnLoadReport) then
    begin
      Lock;
      if frxDesignerComp.FOnLoadReport(Report) then
        ReloadReport else
        ReloadPages(0);
      Report.EngineOptions.SilentMode:= SaveSilentMode;
      Exit;
    end;

  if frxDesignerComp<>nil then
    OpenDialog.InitialDir:= frxDesignerComp.OpenDir;
  if OpenDialog.Execute then
  begin
    SaveCurrentFile;
    Lock;
    try
      Report.LoadFromFile(OpenDialog.FileName);
    except
      Error;
      EmptyReport;
    end;
    Report.EngineOptions.SilentMode:= SaveSilentMode;
    ReloadReport;
  end;
end;

procedure TfrxDesignerForm.SaveFile(SaveAs:Boolean; UseOnSaveEvent:Boolean);
var
  Saved:Boolean;
begin
  Report.ScriptText:= CodeWindow.Lines;
  Report.ReportOptions.LastChange:= Now;

  if UseOnSaveEvent then
    if (frxDesignerComp<>nil) and Assigned(frxDesignerComp.FOnSaveReport) then
    begin
      if frxDesignerComp.FOnSaveReport(Report, SaveAs) then
      begin
        UpdateRecentFiles(Report.FileName);
        UpdateCaption;
        Modified:= False;
      end;
      Exit;
    end;

  Saved:= True;
  if SaveAs or (Report.FileName = '') then
  begin
    SaveDialog.Filter:= frxResources.Get('dsRepFilter');
    if frxCompressorClass<>nil then
      SaveDialog.Filter:= SaveDialog.Filter+'|'+frxResources.Get('dsComprRepFilter');
    if Report.ReportOptions.Compressed then
      SaveDialog.FilterIndex:= 2 else
      SaveDialog.FilterIndex:= 1;
    if frxDesignerComp<>nil then
      SaveDialog.InitialDir:= frxDesignerComp.SaveDir;
    Saved:= SaveDialog.Execute;
    if Saved then
    begin
      Report.ReportOptions.Compressed:= SaveDialog.FilterIndex = 2;
      Report.FileName:= ChangeFileExt(SaveDialog.FileName, '.fr3');
      Report.SaveToFile(Report.FileName);
    end
  end
  else
    Report.SaveToFile(Report.FileName);

  UpdateRecentFiles(Report.FileName);
  UpdateCaption;
  if Saved then
    Modified:= False;
end;

procedure TfrxDesignerForm.UpdateCaption;
begin
  Caption:= 'FastReport-'+GetReportName;
end;

procedure TfrxDesignerForm.UpdateRecentFiles(NewFile:String);
var
  i:Integer;
  m:TMenuItem;
begin
  if NewFile<>'' then
  begin
    if FRecentFiles.IndexOf(NewFile)<>-1 then
      FRecentFiles.Delete(FRecentFiles.IndexOf(NewFile));
    FRecentFiles.Add(NewFile);
    while FRecentFiles.Count > 8 do
      FRecentFiles.Delete(0);
  end;

    SepMI11.Visible:= FRecentFiles.Count<>0;

  for i:= FileMenu.Count-1 downto 0 do
  begin
    m:= FileMenu.Items[i];
    if FRecentFiles.IndexOf(m.Caption)<>-1 then
      m.Free;
  end;

  for i:= FRecentFiles.Count-1 downto 0 do
  begin
    m:= TMenuItem.Create(FileMenu);
    m.Caption:= FRecentFiles[i];
    m.OnClick:= OpenRecentFile;
    FileMenu.Insert(FileMenu.IndexOf(SepMI4), m);
  end;
end;

procedure TfrxDesignerForm.SwitchToolbar;
var
  i:Integer;
  Item:TfrxObjectItem;
  b:TToolButton;
  v:Boolean;

  function IsDialogCategory(Category:Integer):Boolean;
  var
    i:Integer;
    Item:TfrxObjectItem;
  begin
    Result:= False;
    for i:= 0 to frxObjects.Count-1 do
    begin
      Item:= frxObjects[i];
      if (Item.ClassRef<>nil) and
         (Item.CategoryName = frxObjects[Category].CategoryName) then
      begin
        Result:= Item.ClassRef.InheritsFrom(TfrxDialogControl);
        break;
      end;
    end;
  end;

  function IsDataCategory(Category:Integer):Boolean;
  var
    i:Integer;
    Item:TfrxObjectItem;
  begin
    Result:= False;
    if Category = 1000 then Exit;
    for i:= 0 to frxObjects.Count-1 do
    begin
      Item:= frxObjects[i];
      if (Item.ClassRef<>nil) and
         (Item.CategoryName = frxObjects[Category].CategoryName) then
      begin
        Result:= Item.ClassRef.InheritsFrom(TfrxDialogComponent);
        break;
      end;
    end;
  end;

begin
  ObjectSelectB.Down:= True;
  SelectToolBClick(nil);

  for i:= 0 to ObjectsTB1.ControlCount-1 do
  begin
    b:= TToolButton(ObjectsTB1.Controls[i]);

    if (b<>ObjectSelectB) and (b<>SepTB14) then
    begin
      Item:= nil;
      if b.Tag = 1000 then { tools and band }
        v:= False
      else { object or category }
      begin
        Item:= frxObjects[b.Tag];
        if Item.ClassRef<>nil then { object }
          v:= Item.ClassRef.InheritsFrom(TfrxDialogControl) else
          v:= IsDialogCategory(b.Tag);
      end;

      if FPage is TfrxDialogPage then
        b.Visible:= v or IsDataCategory(b.Tag)
      else
        b.Visible:= not v;

      if Item<>nil then
        if FPage is TfrxDMPPage then
        begin
          if (Item.ClassRef = TfrxMemoView) or
            (Item.ClassRef = TfrxSysMemoView) or
            (Item.ClassRef = TfrxLineView) or
            (Item.ClassRef = TfrxPictureView) or
            (Item.CategoryName = 'Draw') then
            b.Visible:= False;
        end
        else if (FPage is TfrxReportPage) or (FPage = nil) then
        begin
          if (Item.ClassRef = TfrxDMPMemoView) or
            (Item.ClassRef = TfrxDMPLineView) or
            (Item.ClassRef = TfrxDMPCommand) then
            b.Visible:= False;
        end;
    end;
  end;

  ObjectsTB1.Height:= ObjectsTB1.Height+1;
end;

function TfrxDesignerForm.mmToUnits(mm:Extended; X:Boolean = True):Extended;
begin
  Result:= 0;
  case FUnits of
    duCM:
      Result:= mm / 10;
    duInches:
      Result:= mm / 25.4;
    duPixels:
      Result:= mm * 96 / 25.4;
    duChars:
      if X then
        Result:= Round(mm * fr01cm / fr1CharX) else
        Result:= Round(mm * fr01cm / fr1CharY);
  end;
end;

function TfrxDesignerForm.UnitsTomm(mm:Extended; X:Boolean = True):Extended;
begin
  Result:= 0;
  case FUnits of
    duCM:
      Result:= mm * 10;
    duInches:
      Result:= mm * 25.4;
    duPixels:
      Result:= mm / 96 * 25.4;
    duChars:
      if X then
        Result:= Round(mm) * fr1CharX / fr01cm else
        Result:= Round(mm) * fr1CharY / fr01cm;
  end;
end;

function TfrxDesignerForm.InsertExpression(const Expr:String):String;
begin
  with TfrxExprEditorForm.Create(Self) do
  begin
    ExprMemo.Text:= Expr;
    if ShowModal = mrOk then
      Result:= ExprMemo.Text else
      Result:= '';
    Free;
  end
end;

procedure TfrxDesignerForm.UpdatePage;
begin
  FWorkspace.Repaint;
end;

procedure TfrxDesignerForm.FindText;
var
  i:Integer;
  c:TfrxComponent;
  s:String;
  Found, FoundOne:Boolean;
  Flags:TReplaceFlags;
  ReplaceAll:Boolean;

  function AskReplace:Boolean;
  var
    i:Integer;
  begin
    if not ReplaceAll then
      i:= MessageDlg(Format(frxResources.Get('dsReplace'), [FSearchText]),
        mtConfirmation, [mbYes, mbNo, mbCancel, mbAll], 0)
    else
      i:= mrAll;
    Result:= i in [mrYes, mrAll];
    ReplaceAll:= i = mrAll;

{ Result:= Application.MessageBox(
      PChar(Format(frxResources.Get('dsReplace'), [FSearchText])),
      PChar(frxResources.Get('mbConfirm')), mb_IconQuestion+mb_YesNo) = mrYes;}
  end;

begin
  ReplaceAll:= False;
  FoundOne:= False;

  repeat
    Found:= False;
    if FPage<>nil then
    begin
      c:= nil;
      for i:= FSearchIndex to Objects.Count-1 do
      begin
        c:= Objects[i];
        if c is TfrxCustomMemoView then
        begin
          s:= TfrxCustomMemoView(c).Text;
          if FSearchCase then
          begin
            if Pos(FSearchText, s)<>0 then
              Found:= True;
          end
          else if Pos(AnsiUpperCase(FSearchText), AnsiUpperCase(s))<>0 then
            Found:= True;
        end;
        if Found then break;
      end;

      if Found then
      begin
        FSearchIndex:= i+1;
        SelectedObjects.Clear;
        SelectedObjects.Add(c);
        OnSelectionChanged(Self);
        if FSearchReplace then
          if AskReplace then
          begin
            Flags:= [rfReplaceAll];
            if not FSearchCase then
              Flags:= Flags+[rfIgnoreCase];
            TfrxCustomMemoView(c).Text:= StringReplace(s, FSearchText,
              FSearchReplaceText, Flags);
            Modified:= True;
          end;
      end;
    end
    else
    begin
      Found:= CodeWindow.Find(FSearchText, FSearchCase, FSearchIndex);
      if FSearchReplace then
        if Found and AskReplace then
        begin
          CodeWindow.SelText:= FSearchReplaceText;
          Modified:= True;
        end;
    end;

    if Found then
      FoundOne:= True;
  until not ReplaceAll or not Found;

  if not FoundOne then
    Application.MessageBox(
      PChar(Format(frxResources.Get('dsTextNotFound'), [FSearchText])),
      PChar(frxResources.Get('mbInfo')), mb_IconInformation+mb_Ok);
end;

procedure TfrxDesignerForm.RestorePagePosition;
var
  pt:TPoint;
begin
  if (Tab.TabIndex > 0) and (Tab.TabIndex < 255) then
  begin
    pt:= fsPosToPoint(FPagePositions[Tab.TabIndex]);
    ScrollBox.VertScrollBar.Position:= pt.X;
    ScrollBox.HorzScrollBar.Position:= pt.Y;
  end;
end;

procedure TfrxDesignerForm.SavePagePosition;
begin
  if (Tab.TabIndex > 0) and (Tab.TabIndex < 255) then
    FPagePositions[Tab.TabIndex]:= IntToStr(ScrollBox.HorzScrollBar.Position)+
      ':'+IntToStr(ScrollBox.VertScrollBar.Position);
end;

{ Workspace/Inspector event handlers }
{------------------------------------------------------------------------------}

procedure TfrxDesignerForm.OnModify(Sender:TObject);
begin
  FModifiedBy:= Sender;
  Modified:= True;
end;

procedure TfrxDesignerForm.OnSelectionChanged(Sender:TObject);
var
  c:TfrxComponent;
begin
  if Sender = FReportTree then
  begin
    c:= SelectedObjects[0];
    if (c<>Report) and (Page<>nil) then
      if c.Page<>Page then
      begin
        Page:= c.Page;
        SelectedObjects[0]:= c;
        FReportTree.UpdateSelection;
      end;
  end
  else
    FReportTree.UpdateSelection;

  if Sender<>FWorkspace then
    FWorkspace.UpdateView;

  if Sender<>FInspector then
  begin
    FInspector.Objects:= FObjects;
    FInspector.UpdateProperties;
  end;

  UpdateControls;
end;

procedure TfrxDesignerForm.OnEditObject(Sender:TObject);
var
  ed:TfrxComponentEditor;
begin
  ed:= frxComponentEditors.GetComponentEditor(FSelectedObjects[0], Self, nil);
  if (ed<>nil) and ed.HasEditor then
    if ed.Edit then
    begin
      Modified:= True;
      if FSelectedObjects[0] = FPage then
        UpdatePageDimensions;
    end;
  ed.Free;
end;

procedure TfrxDesignerForm.OnInsertObject(Sender:TObject);
var
  c:TfrxComponent;
begin
  if not CheckOp(drDontInsertObject) or (FWorkspace.Insertion.Top < 0) then
  begin
    FWorkspace.SetInsertion(nil, 0, 0, 0);
    ObjectSelectB.Down:= True;
    Exit;
  end;

  with FWorkspace.Insertion do
  begin
    if (ComponentClass = nil) or ((Width = 0) and (Height = 0)) then Exit;

    c:= TfrxComponent(ComponentClass.NewInstance);
    c.DesignCreate(FPage, Flags);
    c.CreateUniqueName;
    c.SetBounds(Left, Top, Width, Height);
    if c is TfrxCustomLineView then
      FWorkspace.SetInsertion(ComponentClass, 0, 0, Flags)
    else
   

⌨️ 快捷键说明

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