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

📄 frxricheditor.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
字号:
{******************************************}
{ }
{ FastReport v3.0 }
{ RichEdit design editor }
{ }
{ Copyright (c) 1998-2005 }
{ by Alexander Tzyganenko, }
{ Fast Reports Inc. }
{ }
{******************************************}

unit frxRichEditor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ExtCtrls, Buttons, frxClass, frxRich, frxCustomEditors,
  frxCtrls, frxRichEdit, ImgList, frxDock, ToolWin, ComCtrls
{$IFDEF Delphi6}
, Variants
{$ENDIF};
  

type
  TfrxRichEditor = class(TfrxViewEditor)
  public
    function Edit:Boolean; override;
    function HasEditor:Boolean; override;
    procedure GetMenuItems; override;
    function Execute(Tag:Integer; Checked:Boolean):Boolean; override;
  end;

  TfrxRichEditorForm = class(TForm)
    OpenDialog:TOpenDialog;
    SaveDialog:TSaveDialog;
    SpeedBar:TToolBar;
    Ruler:TPanel;
    FontDialog1:TFontDialog;
    FirstInd:TLabel;
    LeftInd:TLabel;
    RulerLine:TBevel;
    RightInd:TLabel;
    BoldB:TToolButton;
    ItalicB:TToolButton;
    LeftAlignB:TToolButton;
    CenterAlignB:TToolButton;
    RightAlignB:TToolButton;
    UnderlineB:TToolButton;
    BulletsB:TToolButton;
    TTB:TToolButton;
    CancelB:TToolButton;
    OkB:TToolButton;
    ExprB:TToolButton;
    FontNameCB:TfrxFontComboBox;
    FontSizeCB:TfrxComboBox;
    OpenB:TToolButton;
    SaveB:TToolButton;
    UndoB:TToolButton;
    Sep1:TToolButton;
    Sep2:TToolButton;
    Sep3:TfrxTBPanel;
    Sep4:TToolButton;
    Sep5:TToolButton;
    BlockAlignB:TToolButton;

    procedure SelectionChange(Sender:TObject);
    procedure FormCreate(Sender:TObject);
    procedure FileOpen(Sender:TObject);
    procedure FileSaveAs(Sender:TObject);
    procedure EditUndo(Sender:TObject);
    procedure SelectFont(Sender:TObject);
    procedure RulerResize(Sender:TObject);
    procedure FormResize(Sender:TObject);
    procedure FormPaint(Sender:TObject);
    procedure BoldBClick(Sender:TObject);
    procedure AlignButtonClick(Sender:TObject);
    procedure FontNameCBChange(Sender:TObject);
    procedure BulletsBClick(Sender:TObject);
    procedure RulerItemMouseDown(Sender:TObject; Button:TMouseButton;
      Shift:TShiftState; X, Y:Integer);
    procedure RulerItemMouseMove(Sender:TObject; Shift:TShiftState; X,
      Y:Integer);
    procedure FirstIndMouseUp(Sender:TObject; Button:TMouseButton;
      Shift:TShiftState; X, Y:Integer);
    procedure LeftIndMouseUp(Sender:TObject; Button:TMouseButton;
      Shift:TShiftState; X, Y:Integer);
    procedure RightIndMouseUp(Sender:TObject; Button:TMouseButton;
      Shift:TShiftState; X, Y:Integer);
    procedure CancelBClick(Sender:TObject);
    procedure OkBClick(Sender:TObject);
    procedure ExprBClick(Sender:TObject);
    procedure FontSizeCBChange(Sender:TObject);
    procedure FormShow(Sender:TObject);
    procedure FormHide(Sender:TObject);
  private
    { Private declarations }
    FDragging:Boolean;
    FDragOfs:Integer;
    FRichView:TfrxRichView;
    FUpdating:Boolean;
    RichEdit1:TrxRichEdit;
    function CurrText:TrxTextAttributes;
    procedure SetupRuler;
    procedure SetEditRect;
  public
    { Public declarations }
    property RichView:TfrxRichView read FRichView write FRichView;
  end;

implementation

{$R *.DFM}

uses frxDsgnIntf, frxRes;

const
  RulerAdj = 4/3;
  GutterWid = 6;

{ TfrxRichEditor }

function TfrxRichEditor.HasEditor:Boolean;
begin
  Result:= True;
end;

function TfrxRichEditor.Edit:Boolean;
begin
  with TfrxRichEditorForm.Create(Designer) do
  begin
    RichView:= TfrxRichView(Component);
    Result:= ShowModal = mrOk;
    Free;
  end;
end;

function TfrxRichEditor.Execute(Tag:Integer; Checked:Boolean):Boolean;
var
  i:Integer;
  c:TfrxComponent;
  v:TfrxRichView;
begin
  Result:= inherited Execute(Tag, Checked);

  for i:= 0 to Designer.SelectedObjects.Count-1 do
  begin
    c:= Designer.SelectedObjects[i];
    if (c is TfrxRichView) and not (rfDontModify in c.Restrictions) then
    begin
      v:= TfrxRichView(c);
      case Tag of
        1:v.AllowExpressions:= Checked;
        2:if Checked then
             v.StretchMode:= smActualHeight else
             v.StretchMode:= smDontStretch;
        3:if Checked then
             v.StretchMode:= smMaxHeight else
             v.StretchMode:= smDontStretch;
      end;

      Result:= True;
    end;
  end;
end;

procedure TfrxRichEditor.GetMenuItems;
var
  v:TfrxRichView;
begin
  v:= TfrxRichView(Component);

  AddItem(frxResources.Get('mvExpr'), 1, v.AllowExpressions);
  AddItem('-',-1);
  AddItem(frxResources.Get('mvStretch'), 2, v.StretchMode = smActualHeight);
  AddItem(frxResources.Get('mvStretchToMax'), 3, v.StretchMode = smMaxHeight);

  inherited;
end;

{ TfrxRichEditorForm }

procedure TfrxRichEditorForm.SelectionChange(Sender:TObject);
begin
  with RichEdit1.Paragraph do
  try
    FUpdating:= True;
    FirstInd.Left:= Trunc(FirstIndent * RulerAdj)-4+GutterWid;
    LeftInd.Left:= Trunc((LeftIndent+FirstIndent) * RulerAdj)-4+GutterWid;
    RightInd.Left:= Ruler.ClientWidth-6-Trunc((RightIndent+GutterWid) * RulerAdj);
    BoldB.Down:= fsBold in RichEdit1.SelAttributes.Style;
    ItalicB.Down:= fsItalic in RichEdit1.SelAttributes.Style;
    UnderlineB.Down:= fsUnderline in RichEdit1.SelAttributes.Style;
    BulletsB.Down:= Boolean(Numbering);
    FontSizeCB.Text:= IntToStr(RichEdit1.SelAttributes.Size);
    FontNameCB.Text:= RichEdit1.SelAttributes.Name;
    case Alignment of
      paLeftJustify:LeftAlignB.Down:= True;
      paCenter:CenterAlignB.Down:= True;
      paRightJustify:RightAlignB.Down:= True;
      paJustify:BlockAlignB.Down:= True;
    end;
  finally
    FUpdating:= False;
  end;
end;

function TfrxRichEditorForm.CurrText:TrxTextAttributes;
begin
  if RichEdit1.SelLength > 0 then
    Result:= RichEdit1.SelAttributes else
    Result:= RichEdit1.DefAttributes;
end;

procedure TfrxRichEditorForm.SetupRuler;
var
  I:Integer;
  S:String;
begin
  SetLength(S, 201);
  I:= 1;
  while I < 200 do
  begin
    S[I]:= #9;
    S[I+1]:= '|';
    Inc(I, 2);
  end;
  Ruler.Caption:= S;
end;

procedure TfrxRichEditorForm.SetEditRect;
var
  R:TRect;
begin
  with RichEdit1 do
  begin
    R:= Rect(GutterWid, 0, ClientWidth-GutterWid, ClientHeight);
    SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
  end;
end;

{ Event Handlers }

procedure TfrxRichEditorForm.FormResize(Sender:TObject);
begin
  SetEditRect;
  SelectionChange(Sender);
end;

procedure TfrxRichEditorForm.FormPaint(Sender:TObject);
begin
  SetEditRect;
end;

procedure TfrxRichEditorForm.FileOpen(Sender:TObject);
begin
  OpenDialog.Filter:= frxResources.Get('ftRichFile')+' (*.rtf)|*.rtf';
  if OpenDialog.Execute then
  begin
    RichEdit1.Lines.LoadFromFile(OpenDialog.FileName);
    RichEdit1.SetFocus;
    SelectionChange(Self);
  end;
end;

procedure TfrxRichEditorForm.FileSaveAs(Sender:TObject);
begin
  SaveDialog.Filter:= frxResources.Get('ftRichFile')+' (*.rtf)|*.rtf|'+
                       frxResources.Get('ftTextFile')+' (*.txt)|*.txt';
  if SaveDialog.Execute then
    RichEdit1.Lines.SaveToFile(ChangeFileExt(SaveDialog.FileName, '.rtf'));
end;

procedure TfrxRichEditorForm.EditUndo(Sender:TObject);
begin
  with RichEdit1 do
    if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
end;

procedure TfrxRichEditorForm.SelectFont(Sender:TObject);
begin
  FontDialog1.Font.Assign(RichEdit1.SelAttributes);
  if FontDialog1.Execute then
    CurrText.Assign(FontDialog1.Font);
  RichEdit1.SetFocus;
end;

procedure TfrxRichEditorForm.RulerResize(Sender:TObject);
begin
  RulerLine.Width:= Ruler.ClientWidth-RulerLine.Left * 2;
end;

procedure TfrxRichEditorForm.BoldBClick(Sender:TObject);
var
  s:TFontStyles;
begin
  if FUpdating then Exit;
  s:= [];
  if BoldB.Down then s:= s+[fsBold];
  if ItalicB.Down then s:= s+[fsItalic];
  if UnderlineB.Down then s:= s+[fsUnderline];
  CurrText.Style:= s;
end;

procedure TfrxRichEditorForm.AlignButtonClick(Sender:TObject);
begin
  if FUpdating then Exit;
  case TControl(Sender).Tag of
    0:RichEdit1.Paragraph.Alignment:= paLeftJustify;
    1:RichEdit1.Paragraph.Alignment:= paCenter;
    2:RichEdit1.Paragraph.Alignment:= paRightJustify;
    3:RichEdit1.Paragraph.Alignment:= paJustify;
  end;
end;

procedure TfrxRichEditorForm.FontNameCBChange(Sender:TObject);
begin
  if FUpdating then Exit;
  CurrText.Name:= FontNameCB.Text;
  RichEdit1.SetFocus;
end;

procedure TfrxRichEditorForm.BulletsBClick(Sender:TObject);
begin
  if FUpdating then Exit;
  RichEdit1.Paragraph.Numbering:= TrxNumbering(BulletsB.Down);
end;

{ Ruler Indent Dragging }

procedure TfrxRichEditorForm.RulerItemMouseDown(Sender:TObject; Button:TMouseButton;
  Shift:TShiftState; X, Y:Integer);
begin
  FDragOfs:= (TLabel(Sender).Width div 2);
  TLabel(Sender).Left:= TLabel(Sender).Left+X-FDragOfs;
  FDragging:= True;
end;

procedure TfrxRichEditorForm.RulerItemMouseMove(Sender:TObject; Shift:TShiftState;
  X, Y:Integer);
begin
  if FDragging then
    TLabel(Sender).Left:= TLabel(Sender).Left+X-FDragOfs
end;

procedure TfrxRichEditorForm.FirstIndMouseUp(Sender:TObject; Button:TMouseButton;
  Shift:TShiftState; X, Y:Integer);
begin
  FDragging:= False;
  RichEdit1.Paragraph.FirstIndent:=
    Trunc((FirstInd.Left+FDragOfs-GutterWid) / RulerAdj);
  LeftIndMouseUp(Sender, Button, Shift, X, Y);
end;

procedure TfrxRichEditorForm.LeftIndMouseUp(Sender:TObject; Button:TMouseButton;
  Shift:TShiftState; X, Y:Integer);
begin
  FDragging:= False;
  RichEdit1.Paragraph.LeftIndent:=
    Trunc((LeftInd.Left+FDragOfs-GutterWid) / RulerAdj)-RichEdit1.Paragraph.FirstIndent;
  SelectionChange(Sender);
end;

procedure TfrxRichEditorForm.RightIndMouseUp(Sender:TObject; Button:TMouseButton;
  Shift:TShiftState; X, Y:Integer);
begin
  FDragging:= False;
  RichEdit1.Paragraph.RightIndent:=
    Trunc((Ruler.ClientWidth-RightInd.Left+FDragOfs-2) / RulerAdj)-2 * GutterWid;
  SelectionChange(Sender);
end;

procedure TfrxRichEditorForm.CancelBClick(Sender:TObject);
begin
  ModalResult:= mrCancel;
end;

procedure TfrxRichEditorForm.OkBClick(Sender:TObject);
begin
  ModalResult:= mrOk;
end;

procedure TfrxRichEditorForm.ExprBClick(Sender:TObject);
var
  s, s1, s2:String;

  function BracketCount:Integer;
  var
    i:Integer;
  begin
    Result:= 0;
    for i:= 1 to Length(s) do
      if s[i] = '<' then
        Inc(Result);
  end;

begin
  s:= TfrxCustomDesigner(Owner).InsertExpression('');
  if s<>'' then
  begin
    s1:= RichView.ExpressionDelimiters;
    s2:= Copy(s1, Pos(',', s1)+1, 255);
    s1:= Copy(s1, 1, Pos(',', s1)-1);
    if (s[1] = '<') and (s[Length(s)] = '>') and (BracketCount = 1) then
      s:= Copy(s, 2, Length(s)-2);
    RichEdit1.SelText:= s1+s+s2;
  end;
end;

procedure TfrxRichEditorForm.FontSizeCBChange(Sender:TObject);
begin
  CurrText.Size:= StrToInt(FontSizeCB.Text);
  RichEdit1.SetFocus;
end;

procedure TfrxRichEditorForm.FormCreate(Sender:TObject);
begin
  frxResources.LocalizeForm(Self);

  RichEdit1:= TrxRichEdit.Create(Self);
  RichEdit1.Parent:= Self;
  RichEdit1.Align:= alClient;
  RichEdit1.OnSelectionChange:= SelectionChange;

  SpeedBar.Images:= frxResources.MainButtonImages;
  Icon:= TForm(Owner).Icon;
  OpenDialog.InitialDir:= ExtractFilePath(ParamStr(0));
  SaveDialog.InitialDir:= OpenDialog.InitialDir;
  SetupRuler;
  SelectionChange(Self);
end;

procedure TfrxRichEditorForm.FormShow(Sender:TObject);
begin
  frxAssignRich(RichView.RichEdit, RichEdit1);
  RichEdit1.SetFocus;
end;

procedure TfrxRichEditorForm.FormHide(Sender:TObject);
begin
  if ModalResult = mrOk then
    frxAssignRich(RichEdit1, RichView.RichEdit);
end;

initialization
  frxComponentEditors.Register(TfrxRichView, TfrxRichEditor);

end.

⌨️ 快捷键说明

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